网络穿透与音视频技术(3)——NAT映射检测和常见网络穿越方法论(NAT检测)...

接上文《网络穿透与音视频技术(2)——NAT的概念及工作模式(下)

1、什么是网络穿透

1.1、服务器高负载状态下的通信问题

想想一下这种情况,多个处于不同内部网络的终端同时进行大文件传输工作。我们最直接的思维模式能够想到的就是这些终端首先将文件传输到某各都能访问到的服务器上,再由服务器进行中转传输。是的,这个方式最简单直接,但是有几个问题:

1、成本问题:一般我们租用或者托管在机房的这种服务器都是按照带宽大小或者流量多少进行计费的,只要有数据流流向服务器,服务商就会收费。但实际上这些大文件根本就不是我们服务器需要的,而只是从服务器进行中转。

2、 法律问题:这些由客户终端进行传输的文件,一旦经过了服务器那么就涉及到法律风险。使用者会担心我们的服务器是否讲这些文件在服务器端保存了副本,一旦这些文件涉密且后续发生了事故,服务程序的提供方很难说清楚自己的责任。

3、效率问题:通过服务器中转进行大文件的传输从技术层面说当然没有问题,但效率相对低下。例如从A终端到服务器再从服务器到B终端只有一条通路,在有限的上行带宽下,无法实现文件的分片传输。另外,服务器的整体性能和带宽资源将会限制文件的中转规模,很难实现多个大文件的并行中转处理(或者就是传输速度极低)。

如何解决大文件的传输问题

1.2、什么是网络穿透

加上这篇文章,这个系列我们聊网络穿透的基本问题已经聊了三篇文章了,可以我们一直还没有给“网络穿透”一个准确的定义。这里我们先来给网络穿透这个事情一个比较清晰的概述:

网络穿透问题实际上就是NAT设备穿透问题,既是如何在两个相对封闭,并且通过一层或者多层NAT设备进行连接的内部网络中,建立点对点的网络连接并完成数据传输的问题。

1.3、为什么需要网络穿透

1、在有限的IPV4资源前提下,实现内部网络终端的公平通信。这个情况很好理解:IPV4资源是有限的,而世界上无数的网络终端(包括PC、移动终端、工控机、各种网络设备等等)不可能都分配一个全球唯一的IP资源,所以为了穿越不同的内部网络实现终端到终端的平等通信,就成为一个非常必要的数据通信手段。

2、使用NAT设备中继传输,减少服务器上数据转发带来的资源消耗 。NAT设备广泛存在于我们熟知的网络世界中,且具有不同的映射实现方式。通过进行网络穿透,是的数据不再经过中转服务器,即可规避成本问题、又可规避法律问题,并且使传输方案的扩展有了更多的可能性。

3、人人为我,我为人人。基于DHT算法实现的无服务器网络和混合P2P网络是目前P2P技术发展的重点,而网络穿透技术是P2P技术的一个基本实现要求。关于P2P技术和DHT网络在本专题后续内容中将进行比较详细的介绍。

2、NAT映射实现方式的检测

要实现两个相对封闭网络中终端的点对点穿透,就是要实现这两个终端下的TCP/IP协议簇的数据传输和接收,那么根据前文介绍的情况,我们就首先要对隔离这两个终端的多层NAT设备的映射实现方式进行检测。

上篇文章中就我们已经提到,NAT映射模式一共有三种,静态映射(Static NAT)、动态映射(Pooled NAT)和网络地址端口映射(NAPT/PAT)。其中NAPT/PAT映射模式是目前绝大多数现有NAT设备的工作模式。这种映射模式下,又有四种映射实现方式,它们是:全圆锥NAT(Full Cone NAT)、地址限制圆锥NAT(Address Restricted Cone NAT)、端口限制圆锥NAT(Port Restricted Cone NAT)和对称NAT(Symmetric NAT)。那么这个NAT设备映射实现方式的检测问题,实际上就是对以上四种实现方式的判定问题。又由于Full Cone NAT、Address Restricted Cone NAT、Port Restricted Cone NAT和Symmetric NAT这四种映射实现方式对于网络穿透的限制是递增性的,所以最终被检测出来的两个终端之间多层NAT设备的映射实现方式,就是那种对穿透限制最严格的映射实现方式

2.1、检测过程描述

2.1.1、检测过程前提

要进行 “指定终端到指定服务器是什么NAT映射实现方式” 的验证,首先我们需要有一台 “指定终端” 还需要有一台 “指定服务器”,其中的细节包括:

1、这个指定的服务器拥有两个外网IP(分别记为IP1和IP2),指定的终端上的数据可以通过网络达到服务器(记为Server)。这个问题很好理解,因为至少有一种NAT映射实现方式需要验证两个独立IP的映射结果。

2、每次检测为了剔除网络延迟问题,都会发送多个重复的UDP数据报(建议为5-10个)。这是为了尽可能避免网络不稳定造成的判定失误。

3、首先进行预检测——保证终端和Server之间存在至少一级NAT设备,这个检测也非常简单:
终端以Server的IP1 + PORT1为目标发送UDP数据报,Server在收到这个数据报之后,将可以得到终端(在NAT设备转换后)的IP和端口信息(记为IPX + PORTX)。接着Server将这个获得的终端的IPX + PORTX信息进行打包,并通过IPX + PORTX回传给终端。终端进行解包,如果发现Server识别到的终端IPX + PORTX和自己发送UDP使用的IP + PORT是完全一致的,说明终端到Server之间并没有任何一级NAT设备

如下图所示:

在这里插入图片描述

(注意:如果检测到指定的终端和指定的服务器之间没有任何NAT设备,实际上最直观的判断是指定的终端和指定的服务器在同一个内部网络环境中

2.1.2、Symmetric NAT检测

首先可以检测网络中的NAT设备的映射实现方式是否为对称NAT,因为一旦检测其为对称NAT,则后续的检查都不需要做了。对称NAT的检查过程如下:

终端首先分别瞄准Server的两个IP,向Server的IP1 + PORT1和IP2 + PORT2发送UDP数据报,这个时候Server的两个监听地址肯定都能收到数据报(排除网络本身不通的情况)。我们将在Server上得到这个终端(在NAT设备转换后的)的两个地址 + 端口——IP1 + PORT1得到的客户端记为Client_IP1 + Client_Port1,IP2 + PORT2得到的客户端记为Client_IP2 + Client_Port2。

接着Server会将这个地址进行封装到回复数据报文中进行回发,IP1 + PORT1回发的数据报中包含的内容为Client_IP1 + Client_Port1(当然还会视情况包含其它内容,例如UDP支持的实际长度);IP2 + PORT2回发的数据报中包含的内容为Client_IP2 + Client_Port2。

客户端在接受到两方响应的数据报后,会对这两个数据报的内容进行检查,如果Client_IP1 + Client_Port1 和 Client_IP2 + Client_Port2 不相同,那么说明是对等网络;其它情况说明不是对等网络,但属于哪一种圆锥NAT还需要继续进行检测。

在这里插入图片描述

(具体实现代码请参见后续文章)

2.1.3、Full Cone NAT检测

终端首先向IP1 + PORT1发送UDP数据报到Server,Server将会收到终端发来的数据报,其中包括了终端(在NAT设备转换后的)Client_IP + Client_Port。接着Server使用IP2 + PORT2向终端(Client_IP + Client_Port)发送回复信息。如果终端分别收到两个源发送过来的响应数据报,则证明终端到Server的NAT设备映射实现方式为,Full Cone NAT。

在这里插入图片描述

注意,这里为了简化判断过程,并不需要IP1向终端回复响应,因为无论四种实现方式中的哪一种实现方式,IP1 + PORT1发送的数据报都可以被终端接收到——除非网络非常不稳定甚至不可达。(具体实现代码请参见后续文章)

2.1.4、Address Restricted Cone NAT/Port Restricted Cone NAT 检测

在完成了Full Cone NAT的检测后,就可以进行Address Restricted Cone NAT/Port Restricted Cone NAT 的检测了,只需要增加一个接收到终端数据报文的IP1换一个端口,向终端地址进行回发的操作,并判断终端是否能收到回发的数据报即可。具体过程如下:

终端首先向IP1 + PORT1发送UDP数据报到Server,Server将会收到终端发来的数据报,其中包括了终端(在NAT设备转换后的)Client_IP + Client_Port。接着Server使用IP1 + PORTX(非PORT1)向终端(Client_IP + Client_Port)进行回发。如果终端能够收到,则证明是Address Restricted Cone NAT;如果不能收到,则证明是Port Restricted Cone NAT。

在这里插入图片描述

(具体实现代码请参见后续文章)

2.1.5、检测方式总结

通过阅读以上检验方式,我们至少可以得出以下经验性的结论:

1、终端发送数据报后,指定服务器回发的响应数据报以及数据报中携带的终端在NAT设备上映射的IP + PORT才是整个NAT映射实现方式检验的重点。

2、服务器端只是起到辅助作用——将自己接受到的终端在NAT设备上形成的映射结果回发给终端,而真正的检测判断都是由终端自行做出。

3、为了提高NAT映射方式的检测效率,其检测过程是有特定顺序的:在准备好以后,先检查Symmetric NAT,再检查Full Cone NAT,最后检查Address Restricted Cone NAT/Port Restricted Cone NAT。

后文我们将编写代码实现这些检查,并说明在两个终端进行网络穿透前,如何首先判断两个终端存在于同一个局域网中。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值