UDP NAT打洞即为P2P做准备!
总所周知,2个内网IP,无法直接通讯,如果需要连接,即需要一台公网IP的服务器作中转,如果所有的数据都通过服务器中转,那么服务器的压力相当大了,因此需要使用P2P技术来减少数据通讯量。
首先看一个模型,Client 10.0.0.2:4000,NAT 201.0.0.2:60000,Server 200.0.0.2:80
这样C/S的通讯方式如下:
Client NAT Server
发送端 10.0.0.2:4000 201.0.0.2:60000
接受端 200.0.0.2:80 200.0.0.2:80
发送端 200.0.0.2:80 200.0.0.2:80
接受端 10.0.0.2:4000 201.0.0.2:60000
也就是说,C在NAT上开了60000号端口,来转发S端的数据,对S来说,不存在10.0.0.2:4000这个端口,只有200.0.0.2:60000这个口
内网穿透就是基于C在NAT上打孔来实现的
现在有2个Client需要通讯,我们增加一个Client 11.0.0.2:4000,一个NAT 202.0.0.2:60000
那么C-C的孔该怎么开呢?
新建一个C/S的链接
Client NAT Server
发送端 11.0.0.2:4000 202.0.0.2:60000
接受端 200.0.0.2:80 200.0.0.2:80
发送端 200.0.0.2:80 200.0.0.2:80
接受端 11.0.0.2:4000 202.0.0.2:60000
这时候,如果,10.0.0.2:4000直接向202.0.0.2:60000发送数据包,那么这个包会被NAT丢弃,应为这个孔不是为它而开,那么怎么办?
首先10.0.0.2:4000直接向202.0.0.2:60000发送数据包,这个包被202.0.0.2丢弃,但是不要紧,在201.0.0.2上,10.0.0.2:4000到202.0.0.2:60000的孔,开启了,下一步就是让11.0.0.2:4000也去开孔,那么谁来通知,自然是Server
由11.0.0.2:4000向201.0.0.2:60000发送数据包,那么201.0.0.2上的孔已经开了,通讯成功,一个双向的全通的P2P链接就可以链接成功,也标志了打孔成功!
理论暂时讲到这里,下次贴代码