打洞原理:
名稱 | IP | Port |
PC-A | 192.168.1.217 | 8000 |
NAT-A | 61.188.71.155 | 50020 |
PC-B | 192.168.1.117 | 8000 |
NAT-B | 61.188.71.105 | 60020 |
Server | 115.29.97.221 | 6000 |
PC-A,PC-B的IP均為各自內網地址。NAT-A,NAT-B,Server的IP均為公網IP地址。
打洞過程:
1.PC-A發(fā)送數據到Server,Server接收到來自NAT-A,50020端口的數據
2.PC-B發(fā)送數據到Server,Server接收到來自NAT-B,60020端口的數據
3.此時,Server知道了NAT-A和NAT-B的IPPort,于是將它們的IPPort分別發(fā)給對方
4.NAT-A收到來自Server的數據(包含NAT-B的IPPort),轉發(fā)給了內網的PC-A,PC-A獲知NAT-B的IPPort
5.NAT-B收到來自Server的數據(包含NAT-A的IPPort),轉發(fā)給了內網的PC-B,PC-B獲知NAT-A的IPPort
6.PC-A發(fā)送數據到NAT-B的IPort,這個數據包,NATB收到后不會轉發(fā)給PC-B,而是丟棄,因為它認為這是來歷不明的包。
7.PC-B發(fā)送數據到NAT-A的IPort,此時PC-A與PC-B可以進行雙向通信,打洞成功。
C# UDP NAT代碼示例下載
該文章在 2021/2/2 11:05:23 編輯過