基本思想
利用一个任何客户端都可达的服务器,在服务器上预先存储、维护客户端的UDP公用端点地址,当双方需要通信时,通过服务器的介绍获取对方的端点地址,建立直接的连接(两个客户端公网地址之间的直连)。
基本流程
假设有两个位于私网中的客户端C1和C2(可能位于同一私网),都可访问同一Server,那么流程如下:
一、C1向服务器发出请求,要求与C2建立连接。
二、服务器向C1、C2发送对方的公网地址+端口(临近服务器的公网NAT的地址+端口,有可能是经由STUN学习到的);为了检测C1与C2是否在同一私网,服务器把对方的私网地址也发过去,双方先用私网地址通信,若不同,说明在不同私网中。
三、C2收到C1的公网地址+端口后,向该地址发送UDP数据包,该数据包的作用是:使C2的NAT设备允许后续的以C1为源地址(公网地址)的数据包进入C2的内网,即让己端的防火墙对以C1为源地址的UDP数据包开放入口。
四、C1接收到C2的公网地址+端口后,向C2的地址发送UDP数据包,该数据包的作用也是是己端的防火墙允许对端发来的UDP数据进入内网。
五、C2会收到C1发来的数据包(假设C2先打开洞),它就向C1发送确认数据包,至此,双方可以互发数据了。
使用场景
一、对称NAT无法使用该技术。
二、C1与C2之间存在中继时,无法使用该技术(TURN)。