①NAT打洞穿透
②ARP欺骗,伪装打洞目的地
③UPnP(通用即插即用技术),利用局域网内的“广播”,检测“设备”并链接。
以上所有P2P技术都利用了打洞原理,成功率最高的是第三种,最简单的是第一种,最好理解的是第二种。多种方法混合使用才更适合。
目的:降低服务器转发消息流量,1.节约流量2.降低延迟3.适合动作类游戏使用
*******************************************************************************
NAT打洞穿透
网上有很多UDP打洞的例子,TCP很难找到,但同理。
UDP打洞技术成熟,与他不需要建立连接有很大关系,只需要监听本地端口即可,而且天生端口复用。
TCP打洞理论上很好,但其弊端也因其可靠性而引起。当网络状况不好,会频繁重发消息,从而导致后面的包
也发不出去,这对动作类游戏影响很大。网络不好的情况下UDP虽然会丢包,但不会阻止后面的包发送,只需
注意,不要发送过大的包,尽量小即可。
TCP端口复用需要SetOption为复用属性,不同语言不同函数。
UDP穿透时,需要注意发“心跳”,防止端口失效。
对称型网络(SymmetricNAT):由于每建立一个链接,或UDP发送目的IP或端口改变,就会引起,NATA端口与本地端口映射关系发生改变,虽然可以靠猜测法进行穿透,不过一般情况下,不适合作为商业用途。而且网络接口资源消耗太大。
非对称型网络(ConeNAT):一旦绑定本地端口并发送出去过消息,此端口与NAT的端口映射关系将不会改变。这种网络很容易实现穿透。
ARP欺骗,伪装打洞目的地
只能用UDP。和c语言的原始套接字。
如果用TCP建立连接,那么三次握手和中间的安全通信机制,将不能实现。
流程:客户端向打洞服务器发消息服务器记录其外网IP及端口
另一客户端获得对方的IP及端口后,利用原始套接字RawSocket,修改IP头为打洞服务器的IP。
即使是对称型网络,也不受端口变换的影响。但需注意,有些路由会强制修改IP头为真实公网IP(原因还未找到)这种情况将无法使用ARP欺骗。
可以在和打洞服务器连接的时候,通过验证IP是否为修改过的来验证。
UPnP(通用即插即用技术),利用局域网内的“广播”,检测“设备”并链接。
只能用UDP,只需要普通socket即可。
貌似是微软提出的一个解决方案,目的是让网络上的设备能连接在一起工作,随时添加删除。
这种技术利用了局域网的多播功能,路由器中有(UPNP)设置,默认都是开放的。
不支持二级路由(没有测试过,听其他人说的)不过家庭用宽带、WiFi基本都支持。
流程:向网络中发送特殊的消息,此消息为多播类型
一旦其他网络中接收到消息,便会应答,此时,一来一回,相当于进行了打洞
剩下的流程基本与NAT穿透一样,只不过具体过程相对复杂,电驴,迅雷,腾讯都有应用此技术。电驴有公开源码,可以考虑移植UPNP部分,由于用的是普通socket,可以使用其他公共库。