程序猿阵线联盟-汇总各类技术干货技术干货程序员

P2P穿透NAT的原理

2018-06-05  本文已影响19人  breakerror

NAT俗称网络地址转换,基本NAT都部署在路由器或者交换机上。

为什么需要NAT?

主要还是IP地址的不足,使用少量的公有IP 地址代表较多的私有IP 地址的方式,将有助于减缓可用的IP地址空间的枯竭。用大白话:比如你有一个路由器(家用的那种就可以)这个路由器本身链接了公网(被分配到了一个公网的IP地址)。路由器后面有接了N多个设备,每个设备都分配到了一个私有的地址(内网地址),这些地址可以通过这个路由器和外网交互(并非是代理的中继方式)。

两大类NAT

1. 基本NAT:这种NAT下的私有IP只有少部分(并不是全部)可以和外网通讯。每次这些私有地址向外网发送数据的时候,NAT就会把这个数据报的源地址IP修改成NAT的公网地址(这样接收方以为这个数据报是从NAT发给我的,我后面数据报在会给这个NAT就好了),并在NAT内存下对应的映射关系(端口和内网私有IP的映射)。当NAT收外网的数据报的时候,根据数据报的端口号找到内网的私有IP地址,将这个数据报的目的IP地址修改成内网私有IP地址(整个过程NAT负责了IP地址来回替换,辅助完成了内网机器和外网设备通讯,这里的外网设备有可能也是一个NAT)。如果收到的数据报在映射表中找不到对应映射,这个数据报就会被丢弃。

存在问题:基本的NAT由于不会改动端口信息,当内部2个不同机器(2个不同的私有IP)使用同样的端口会出现映射错误了。

2. NPAT:这类的NAT是在基本NAT基础上演化而来,它不仅修改IP地址还有端口号。基本可以满足NAT内全部的网络访问要求。NAT内的私有IP地址第一次向外网发送数据,NAT会选一个映射表里面还没有被使用过的端口号,然后修改发送数据报源IP地址源端口号并发送出去,并把私有IP地址源端口号,和修改后的端口号映射关系记录下来。之后这个私有IP地址发送数据会首先判别之前是不是已经有这个映射关系,如果有就继续按照映射关系修改数据报。当NAT收到外部的数据,会从映射表找到对应关系。修改数据报的目的IP地址目的端口号,如果映射表中没有记录这个数据报就会被丢弃了。

解决了基础NAT的端口问题:通过修改端口的可以让NAT内的多个私有IP地址可以使用相同的端口进行通信。因为NPAT更加灵活所以现在基本的NAT技术就是指的NPAT技术。

P2P解决了什么问题?

如果2台机器在同一个NAT下,那么他们可以直接通信了。

情况 1: 如果2台机器有一台在NAT下另一个在外网,那么只能NAT内的私有机器主动链接外网机器,因为外网的机器主动链接内网的机器,NAT映射表并不存在这个数据转发项,这个数据报就被丢弃了。

情况 2: 如果2台机器都在不同的NAT下,那么不管哪一方发起链接请求数据报都不会到达对应的机器。这种情况非常常见。

那么最简单的方式解决上面2个问题:就是在公网部署一台中继服务器,双方机器都链接这台服务器。然后中继服务器帮助这2台服务器转发数据。这种方式最简单也是效率最低的。

到这里P2P正式登场了:比如有下面这样的网络拓扑结构(就是上面情况2)

image

如果NAT-A, IP:40.32.5.125NAT-B, IP:234.12.3.8需要直接通信的话,基本不可能,所以需要做些手段。

假设需要手机(图中)建立TCP链接到电脑(图中)需要如下手续:

**1. **由被链接方发送数据报(可以是UDP甚至是TCP的SYNC握手包)

[图片上传失败...(image-4b61ae-1528199423593)]
绿色线表示了数据报流动的方向

图中电脑NAT-A IP:40.32.5.125 / 端口:4553 发出了一个数据报,这个数据报在经过NAT-B的时候源IP地址被修改成了NAT-B的IP地址234.12.3.8源端口被修改成了678。这个数据报在到达NAT-A的时候,在映射表中找不到678端口对应的内部私有IP的映射。所以这个数据报一定会被NAT-A丢弃掉。但是经过这次数据报发送,在NAT-B的映射表里面就会标记40.32.5.125:4553我已经发送过数据过去了,那么后面只要从这个地址发送来的数据报,我就可以转发到内网正确的设备上面。

**2. **完成第一步后,链接方可以发起数据请求

image
这个时候有图中手机发送给234.12.3.8:678的数据,数据到达NAT-B后,就不会被拦截。数据报会被正确的转发到图中电脑上。同样这步完成后NAT-A也标记了映射(和第一步相同)。之后所有从NAT-B发出的数据就可以顺利的通过NAT-A的转发。从而完成了手机电脑的链接。

Tip: 由于P2P在穿透的过程中需要互相知晓对方当前的状态,还有通过NAT之后的端口。所以还需要一个在公网的服务器作为协调服务器,一旦完成了协调工作后,这个服务器的就不参与数据交换了。

跨ISP性能问题

p2p可以合理的利用互联网的资源,比如两个人视频聊天。完全可以通过p2p打穿NAT后互发数据(QQ就是这么办的)。但是有的时候设备之间的直连性能很差,比如:电信的用户和移动的用户视频。这个问题是ISP厂商之间的过渡带宽太窄,就算是设备直连但是依旧速度不快。所以这里情况下需要自己搭建服务器中继(中继也不是完全无作用)。这个服务器就是网关的作用,一般有多个网卡。不同的网卡对接不同的ISP厂商,然后互相转发。

版权所有,如有转载请联系我本人http://www.breakerror.com/?p=210

上一篇下一篇

猜你喜欢

热点阅读