P2P网络技术原理与C++开发案例 6.6分
读书笔记 P2P应用的相关技术
MathxH

利用STUN协议来实现NAT穿越。

利用UDP来实现NAT穿透(打洞)

如果P2P网络中的两台主机都位于NAT之后,也就是双方都在自己的私有网络内,那么双方都不知道对方的公网IP地址,从而双方都无法主动发出连接请求。要解决这个问题需要借助双方都熟知的公网服务器来协助建立连接,也就是使用UDP在NAT上打洞的技术(UDP Hole Punching)。

其实也可以利用TCP来实现内网穿透,但是技术难度更大。

在Client A和Client B之间建立UDP直连的过程如下;

1. Client A登录Server S, NAT A为这次的Session分配了一个端口55000,那么Server S收到的Client A的地址是186.53.69.88:55000,这就是Client A的外网地址。

2. Client B登录Server S,NAT B给此次Session分配的端口是44000,那么Server S收到的Client B的地址是202.135.99.168:44000,这就是Client B的外网地址。

此事,Client A与Client B都可以与Server S通信了。如果Client A此事想直接发送UDP数据包给Client B,那么Client A可以从Server S获得B的公网地址 202.135.99.168:44000,但是Client A还不能使用该公网地址直接和Client B通信,因为此时NAT B会将Client A主动发送来的信息丢弃,因为此数据包是没有会话记录的。

3. 现在需要在NAT B上打一个方向为186.53.69.88(即Client A的外网地址)的洞,那么Client A发送到202.135.99.168:44000的信息ClientB就能收到了

4.Server S负责向Client B发送打洞指令

5. Client B向Client A的公网地址发送一个UDP报文,虽然此数据包会被NAT A丢弃,但是NAT B建立了会话记录,不会丢弃Client A的包了。

6. Server S通知Client A“洞”已经打好,Client A可以直接发连接请求包给Client B了(建立连接)。

7. Client A向Client B发送UDP包

8.此时双方可以进行UDP直连

注意,以上过程只适合于Cone NAT的情况。

以下讨论TCP穿越NAT的过程(图示还是参照以上UDP打洞的图示):

Client A和Client B建立直连过程如下:

1. Client A登录Server S, NAT A为这次的Session分配了一个端口55000,那么Server S收到的Client A的地址是186.53.69.88:55000,这就是Client A的外网地址。

2. Client B登录Server S,NAT B给此次Session分配的端口是44000,那么Server S收到的Client B的地址是202.135.99.168:44000,这就是Client B的外网地址。

此事,Client A与Client B都可以与Server S通信了。如果Client A此事想直接发送TCP连接请求包给Client B,那么Client A可以从Server S获得B的公网地址 202.135.99.168:44000,但是Client A还不能使用该公网地址直接和Client B通信,因为此时NAT B会将Client A主动发送来的信息丢弃,因为此数据包是没有会话记录的。

3. Client A向Client B发送数据包TCP[SYN]192.168.0.123:1234 -> 202.135.99.168:44000,经过NAT A后转换为TCP[SYN]186.53.69.88:55000 -> 202.135.99.168:44000。 从而由202.135.99.168:44000发来的TCP包就可以通过NAT A了。因为NAT A中有了相关的会话映射关系

4. Client B向Client A发送数据包TCP[SYN]192.168.20.234:1234 -> 186.53.69.88:55000,经过NAT B后转换为TCP[SYN]202.135.99.168:44000 -> 186.53.69.88:55000。从而由186.53.69.88:33000发来的TCP包可以通过NAT B了,因为NAT B中有了相关的会话映射关系

5. 双方三次握手建立TCP直连

NAT 类型检测

因为NAT穿越需要对断点所处的网络环境进行准确判断(Full Cone等),所以有专门的NAT检测工具,Natcheck可以对NAT设备对P2P通信协议进行兼容性检测
0
《P2P网络技术原理与C++开发案例》的全部笔记 5篇
豆瓣
我们的精神角落
免费下载 iOS / Android 版客户端