UDP、TCP打洞简明流程

来源:互联网 发布:大数据的发展前景知乎 编辑:程序博客网 时间:2024/05/19 00:15


UDP打洞简明流程
 
现实环境:有两个客户端甲、乙需要通信,它们处于两个不同的子网。
解决方案:udp打洞(一般路由器都支持)
解决过程:
1、准备一台服务器,放在公网上,与客户端甲和乙通信,记录客户端甲和乙的Ip和端口信息,这些IP和端口并非甲和乙在内网的IP和端口,而是通过NAT方式映射到路由器上的IP和端口。
2、客户端甲向服务器发送udp消息,请求和客户端乙通信。
3、服务器向客户端甲发送消息,消息内容包含客户端乙的IP和端口信息。
4、服务器向客户端乙发送消息,消息内容包含客户端甲的IP和端口信息。
5、客户端甲根据3步骤获得的信息向客户端乙发送udp消息,同一时刻客户端乙根据3步骤获得的信息向客户端甲发送udp消息,尝试多次,udp打洞就能成功。
其中,客户端甲和乙的子网IP和端口在UDP打洞过程中没有用到过。








TCP打洞简明流程 


1、 S启动两个网络侦听,一个叫【主连接】侦听,一个叫【协助打洞】的侦听。 


 2、 A和B分别与S的【主连接】保持联系。 


 3、当A需要和B建立直接的TCP连接时,首先连接S的【协助打洞】端口,并发送协助连接申请。同时在该端口号上启动侦听。注意由于要在相同的网络终端上绑定到不同的套接字上,所以必须为这些套接字设置 SO_REUSEADDR 属性(即允许重用),否则侦听会失败。 
 4、 S的【协助打洞】连接收到A的申请后通过【主连接】通知B,并将A经过NAT-A转换后的公网IP地址和端口等信息告诉B。 


 5、 B收到S的连接通知后首先与S的【协助打洞】端口连接,随便发送一些数据后立即断开,这样做的目的是让S能知道B经过NAT-B转换后的公网IP和端口号。 


 6、 B尝试与A的经过NAT-A转换后的公网IP地址和端口进行connect,根据不同的路由器会有不同的结果,有些路由器在这个操作就能建立连接(例如我用的TPLink R402),大多数路由器对于不请自到的SYN请求包直接丢弃而导致connect失败,但NAT-A会纪录此次连接的源地址和端口号,为接下来真正的连接做好了准备,这就是所谓的打洞,即B向A打了一个洞,下次A就能直接连接到B刚才使用的端口号了。 


 7、 客户端B打洞的同时在相同的端口上启动侦听。B在一切准备就绪以后通过与S的【主连接】回复消息“我已经准备好”,S在收到以后将B经过NAT-B转换后的公网IP和端口号告诉给A。 


 8、 A收到S回复的B的公网IP和端口号等信息以后,开始连接到B公网IP和端口号,由于在步骤6中B曾经尝试连接过A的公网IP地址和端口,NAT-A纪录了此次连接的信息,所以当A主动连接B时,NAT-B会认为是合法的SYN数据,并允许通过,从而直接的TCP连接建立起来了
原创粉丝点击