如果ClientA和ClientB都在不同的NAT设备后面,如果不通过配置NAT设备,TCPIP是不能直接建立连接的。而通过UDP端口反弹,可以轻松建立连接。
先讨论ClientA和ClientB都在不同的NAT设备后面的情况。
假设:A的外部地址【A的NAT设备的外部合法地址】Anat,B的外部地址Bnat。
原理:一般的NAT设备,对于接收到的UDP数据包,只有当内部已经有发送到这个数据包的源地址和源端口的数据包时,才会转发给内部主机。否则会丢弃。这个原理只适应UDP协议而不适应TCPIP协议。
步骤:
1)A直接向B的NAT设备地址Bnat发送UDP包,该包一般情况下【取决于B的NAT设备类型】会被B的NAT抛弃,但是通过发送该包,A的NAT设备打开了一个可以接收来自B的NAT设备的UDP数据包的"通道";
2)A通过server向B的NAT设备地址Bnat转发UDP包,请求B向A的NAT设备地址Anat发送UDP包。因为B已经向server发送过UDP包,B的NAT设备会将该请求包转发给B。
3)此时,B向A的NAT设备地址Anat发送UDP包,因为在第1)步中,A的NAT设备已经打开了通道,该包会由A的NAT设备正确转发给A。同时,B的NAT设备也打开了一个可以接收来自A的NAT设备的UDP包的"通道"。
4)此后,A可以和B直接通过Anat和Bnat进行UDP通讯,不需要通过server了。
5)还有一点值得提到,以后,A或者B中的任何一个,都可以作为另外一个和第3方如C之间建立UDP连接的中转Server(即上文中的Server)
6)另外,对于多级NAT情况,上面提到的UDP端口反弹技术,都可以自动适应。