111,119
社区成员
发帖
与我相关
我的任务
分享
很好国家需要你这种态度,
,好,支持,威武,有希望了。小弟我甘拜下风。这贴给你发挥吧。
UDP打洞 穿透NAT
最近要做一个即时通工具,主要是要完成与WEB系统、手机系统之间的一个自定义链接功能,能够有效的提高办公效率,可以自主在即时通上开发一系列的定制功能。当然,在开发中也遇到了一些问题,首先就是关于穿透NAT的问题。
其实UDP的打洞还是十分简单,那么UDP的打洞要适用于哪些环境呢?
比如说:用户A和用户B以及服务器A。
服务器A是架设在公网上,他的IP是192.168.180.1。
用户A是在自己的路由下面,他的内网IP是1.1.1.1,端口是1111,通过NAT出去之后,公网IP是2.2.2.2,端口是2222。
用户B也是在自己的路由下面,他的内网IP是10.10.10.10,端口是1010,通过NAT出去之后,公网IP是20.20.20.20,端口是2020。
那么如果用户A和用户B之间要进行点对点的通讯,出现了这种情况应该怎么办呢?用户A和用户B之间能之间点对点聊天么?用户A给用户B发送消息,用户B是收不到的,除非在用户A发送之后,用户B在给用户A发送一条消息,这个时候双方才能进行点对点的通讯。也就是双发需要给各自发送一条消息之后才能建立起点对点的连接,也就是UDP打洞。
那么实现步骤就比较简单了:
1.客户A打开与客户B的聊天窗口,发送一个空包告诉服务器A,客户A与客户B需要聊天,同时发送一个空包给客户B,打通A到B之间的洞。
2.服务器A接受到客户A的信息,发送一个空包告诉客户B,客户A要和你聊天。
3.客户B接受到服务器A的通知,发送一个空包给客户A,打通B到A之间的洞,然后同时发送一个空包给服务器A,通知打洞成功。
4.服务器A接受到客户B的打洞成功的通知,发送一个成功的通知给客户A,这个时候客户A与客户B之间就建立起了点对对的UDP连接。
其实实现起来还是比较简单的,但是关键要注意以下几点:
1.测试的时候,客户A与客户B不能在同一个网关下测试,打洞使用的均是公网IP和端口。
2.在同一个网关下,UDP可以穿透VLAN,所以可以判断两个客户的网关,如果是在同一个网关下,也就是在同一个公网IP下,就可以直接进行点对点的内网IP的连接,不需要打洞。
3.服务器A应该使用同一个UDP连接进行通讯。