`
zxbear
  • 浏览: 52796 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【札记】NAT类型

阅读更多
【札记_http://www.ppcn.net/n4366c38p2.aspx】
STUN标准中,根据内部终端的地址(P:p)到NAT出口的公网地址(A:b)的影射方式,把NAT分为四种类型:


  1. Full Cone:来自相同的内部地址的请求消息映射为相同的外部地址,与外部地址(目的地址)无关。映射关系为P:p↔A:b,任何外部主机可通过(A:b)发送到数据到(P:p)上。

  2. Restricted Cone:来自相同的内部地址的请求消息映射为相同的外部地址,返回的数据只接受该内部节点曾发数据的那个目的计算机地址X。映射关系为P:p↔A:b↔X,只有来自X的数据包才可通过(A:b)发送到数据到(P:p)上。

  3. Port Restricted Cone:来自相同的内部地址的请求消息映射为相同的外部地址,返回的数据只接受该内部节点曾发数据的那个目的地址X:x。映射关系为P:p↔A:b↔X:x,只有来自X:x的数据包才可通过(A:b)发送到数据到(P:p)上。

  4. Symmetric(对称) NAT:只有来自相同的内部地址(P:p),并且发送到同一个地址(X:x) 的请求消息,才被映射为相同的外部地址(A:b),返回的数据只接受该内部节点曾发数据的那个目的地址X:x。映射关系为P:p↔A:b↔X:x,当(P:p)访问(Y:y)时,映射为P:p↔B:c↔Y:y。

【NAT类型探测 _http://blog.csdn.net/formiss/article/details/4922705】
第二部:NAT类型检测

前提条件:有一个公网的Server并且绑定了两个公网IP(IP-1,IP-2)。这个Server做UDP监听(IP-1,Port-1),(IP-2,Port-2)并根据客户端的要求进行应答。

第一步:检测客户端是否有能力进行UDP通信以及客户端是否位于NAT后?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端无法进行UDP通信,可能是防火墙或NAT阻止UDP通信,这样的客户端也就不能P2P了(检测停止)。
当客户端能够接收到服务器的回应时,需要把服务器返回的客户端(IP,Port)和这个客户端socket的(LocalIP,LocalPort)比较。如果完全相同则客户端不在NAT后,这样的客户端具有公网IP可以直接监听UDP端口接收数据进行通信(检测停止)。否则客户端在NAT后要做进一步的NAT类型检测(继续)。

第二步:检测客户端NAT是否是Full Cone NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用另一对(IP-2,Port-2)响应客户端的请求往回发一个数据包,客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端的NAT不是一个Full Cone NAT,具体类型有待下一步检测(继续)。如果能够接受到服务器从(IP-2,Port-2)返回的应答UDP包,则说明客户端是一个Full Cone NAT,这样的客户端能够进行UDP-P2P通信(检测停止)。

第三步:检测客户端NAT是否是Symmetric NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器返回客户端的IP和Port, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程直到收到回应(一定能够收到,因为第一步保证了这个客户端可以进行UDP通信)。
用同样的方法用一个socket向服务器的(IP-2,Port-2)发送数据包要求服务器返回客户端的IP和Port。
比较上面两个过程从服务器返回的客户端(IP,Port),如果两个过程返回的(IP,Port)有一对不同则说明客户端为Symmetric NAT,这样的客户端无法进行UDP-P2P通信(检测停止)。否则是Restricted Cone NAT,是否为Port Restricted Cone NAT有待检测(继续)。

第四步:检测客户端NAT是否是Restricted Cone NAT还是Port Restricted Cone NAT?

客户端建立UDP socket然后用这个socket向服务器的(IP-1,Port-1)发送数据包要求服务器用IP-1和一个不同于Port-1的端口发送一个UDP数据包响应客户端, 客户端发送请求后立即开始接受数据包,要设定socket Timeout(300ms),防止无限堵塞. 重复这个过程若干次。如果每次都超时,无法接受到服务器的回应,则说明客户端是一个Port Restricted Cone NAT,如果能够收到服务器的响应则说明客户端是一个Restricted Cone NAT。以上两种NAT都可以进行UDP-P2P通信。

注:以上检测过程中只说明了可否进行UDP-P2P的打洞通信,具体怎么通信一般要借助于Rendezvous Server。另外对于Symmetric NAT不是说完全不能进行UDP-P2P达洞通信,可以进行端口预测打洞,不过不能保证成功。
分享到:
评论

相关推荐

    复变函数札记

    《复变函数札记》是作者梁昌洪继《矢算场论札记》(科学出版社,2007)之后的第二本工程数学札记。尽管两书所涉及领域完全不同,但却有着完全一致的目标,即希望在数学和工程之间架设一座可以自如跨越的桥梁。对于...

    桫椤札记 1.0.4.rar

    "桫椤札记 1.0.4.rar" 是一个压缩包文件,包含了"桫椤札记"软件的1.0.4版本。这个软件是一个独特的电子日记应用,旨在为用户带来一种仿真的纸质日记体验,它融合了多媒体功能和细腻的翻页动画效果。 在当今数字化...

    护理札记读书心得体会6篇护理札记读书笔记.pdf

    护理札记读书心得体会6篇护理札记读书笔记.pdf

    财务舞弊类型与审计札记.doc

    财务舞弊类型与审计札记.doc

    LabVIEW程序设计札记例程

    3. **数据类型和控制**:LabVIEW支持多种数据类型,如数值、布尔、字符串、数组等。掌握各种控件(如按钮、滑块、图表)和指示器的使用,可以构建用户友好的界面。 4. **数据处理和分析**:例程可能包含数学运算、...

    矩阵论札记

    《矩阵论札记》的核心主题是矩阵。矩阵理论又是代数和几何的完美结合。《矩阵论札记》在侧重矩阵代数的同时,强调了矩阵几何的应用,由此引出了矩阵空间、矩阵变换等。书中附录也可以给广大工程技术人员在工作中带来...

    labview 学习札记2

    本学习札记的第二卷,将深入介绍LabVIEW的基本概念和核心功能,旨在帮助初学者快速入门。以下是可能涵盖的知识点: 1. **G语言**:LabVIEW的核心编程语言称为G语言,通过拖拽和连接不同的函数框图来实现代码编写。G...

    参考资料-启功论书札记.zip

    《启功论书札记》是一份珍贵的参考资料,它主要收录了著名学者、书法家启功先生关于书法艺术的深刻见解和心得笔记。启功先生是中国现代书法界的重要人物,他的书法理论与实践对中国书法的发展产生了深远影响。这份...

    微机操作札记十五篇(CHM格式)

    《微机操作札记十五篇》是一份详细记录了操作系统及办公软件日常技巧的文档集,旨在帮助用户提升计算机操作的效率和技能。这个CHM格式的文件包含了十五篇文章,每一篇都专注于一个特定的主题,涵盖了从基础到进阶的...

    LabView学习札记

    "LabView学习札记"这个压缩包显然是一个针对LabView初学者或进阶者的教程资料。PDF文件包含了学习札记的序言和五个章节,分别是“一(上)、一(下)、二、三(上)、三(下)”。这些章节可能涵盖了LabView的基础...

    LabVIEW 学习札记 - 第一卷 上

    总的来说,“LabVIEW学习札记 - 第一卷 上”会引导你掌握LabVIEW的基础知识,包括编程环境、数据类型、控制结构、函数使用、模块化编程以及硬件交互等。随着学习的深入,你将逐渐领略到LabVIEW在科研和工程中的强大...

    最老程序员创业札记

    好消息,最老程序员创业札记app已经出炉了,大家要慢慢欣赏这部作品呀~

    labview学习札记

    在"labview学习札记"中,你可能会接触到以下关键知识点: 1. **G语言**:LabVIEW的核心编程语言是G语言,它是一种基于图标和连线的编程方式,通过连接不同的函数节点来实现程序逻辑。对于初学者来说,这种可视化...

    JUnit使用札记

    5. `@Category`:将测试分组,便于筛选和运行特定类型的测试。 Sl330Case.java文件很可能是一个具体的测试用例,包含了一些测试方法来验证某个功能或类的行为。通过分析这个文件,我们可以学习到如何编写实际的测试...

    LabVIEW学习札记

    这个“LabVIEW学习札记”显然是一份关于掌握LabVIEW核心概念和技术的详细资料。下面我们将深入探讨LabVIEW的一些关键知识点。 1. **G语言**: LabVIEW的核心编程语言称为G,它是一种基于图形的编程语言。通过连接...

    Delhi基础札记

    ### Delphi基础札记:过程与函数的基础运用 #### 一、引言 Delphi是一种基于Object Pascal的集成开发环境,广泛应用于Windows平台的应用程序开发。Delphi的强大之处在于其高效的编译器以及丰富的组件库,使得...

    Simulink代码生成学习札记[汇编].pdf

    Simulink代码生成学习札记[汇编].pdf

    Simulink代码生成学习札记.zip

    此外,它可能还会涵盖如何使用Simulink Data Dictionary管理数据类型,以及如何使用Simulink Coverage进行代码覆盖率分析,确保模型的完整性和正确性。 Simulink代码生成的另一个重要方面是支持硬件在环(Hardware-...

    生物信息学札记_第三版_浙大版_2010年.pdf

    本文所提到的《生物信息学札记》第三版,由樊龙江在浙江大学多个研究所和实验室的背景下编写,对生物信息学的学习和研究提供了重要的资料。 本书的结构涵盖了生物信息学的多个重要方面,包括基础理论、分子数据库、...

Global site tag (gtag.js) - Google Analytics