打洞机制
首先要注意,路由器有一个保护机制,就是不会无缘无故的接受陌生的IP发送过来的SYN包
NAT打洞机制:
- 当前客户端A想和客户端B建立连接,服务器开了两个端口,一个是主连接端口,一个是辅助连接端口
- 首先,A,B与主连接端口建立连接。这个时候A要和B建立连接,首先A要和协助端口建立连接,然后在这个端口启动监听
- 然后服务器主连接将A经过NAT-A转换的公网IP和端口号发送给B,B收到之后首先和协助端口建立连接,发送一些数据之后断开,目的是让服务器知道B经过NAT-B转换后的公网IP
- 然后B这个时候B已经知道了A的公网IP,然后尝试和A建立连接(如果不是第一次的话,就说明B向A打洞之前已经成功了),但是A这个时候是第一次接收到B发送的SYN包,由于路由器的保护机制,会丢掉这个包,但是会记录B的IP地址和端口号
- 做完这些之后,B向服务器主连接端口发送信息“我已经准备好了”,B开启监听服务,然后服务器端将NAT-B的IP和端口号发送给A,因为之前A已经接受过B的一个SYN包了,所以这次是允许建立的,然后B到A的洞就已经打好了
- 关于A到B的洞,这个时候A直接向B发送数据即可,因为第三步的时候,B就已经收到过A的IP和端口号了,所以再收到A发送过来的连接请求的时候,会认为是合法的
TCP打洞机制和NAT类似,但是UDP稍微有些不同,TCP规定一个端口号只能绑定一个套接字,而UDP允许一个端口号可以绑定多个套接字,所以UDP不需要启动额外的端口号