网络打洞

来源:互联网 发布:电钢琴 耳机 知乎 编辑:程序博客网 时间:2024/05/17 04:41

文章转摘自互联网。

简单的就是A通知服务器,让服务器告诉   B要通信,然后让B打洞,这样,A   就可以同B通信了 
这中间,首先要服务器作一个沟通的作用

所谓的“打洞”过程就是从服务器上得到目标主机的外网地址和端口。 
再向这个地址和端口发送一个UDP数据包。 
应该是: 
A通过S知道B的外部ip   port,S告诉B   A的ip   port,B给A发包,这样 
A发给B的包,到B的网关,就给B了。 
如果A直接发包给B,B事先没有给A发数据,则B的网关收到A的包大多数情况直接丢弃。 
实际上B是告诉自己的网关,从A过来的数据允许放行

 

ClientA,ClientB都连接上Server。此时ClientA和ClientB都有各自的外网地址和端口。 
如果ClientA   要发送消息给ClientB: 
1,ClientA发送一个消息给Server,消息内容是要求ClientB   发一个打洞消息给Client   A。 
2,ClientB发一个UDP包到ClientA的外网地址和外网端口。(就是所谓的打洞)。 
      NAT   B会记录下ClientA的外网地址和端口,以后从这个地址和端口发过来的数据就会转发给ClientB 
3,Client   A   发送实际的消息(UDP包)给Client   B 
4,NAT   B   发现是ClientA的地址和端口,就把这个UDP包转发给ClientB,ClientB就收到Client   A的数据了。 

其中1,3步基本上是同时的。 

经过我的实验,发现经常在第二步出错,程序让ClientB一直发UDP包到ClientA的外网地址和端口,但是NAT   B并没有打开一个洞让ClientA发的UDP包进来, 
以至于后面的步骤无法完成。