打洞原理:
名稱 | 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均為各自內(nèi)網(wǎng)地址。NAT-A,NAT-B,Server的IP均為公網(wǎng)IP地址。
打洞過程:
1.PC-A發(fā)送數(shù)據(jù)到Server,Server接收到來自NAT-A,50020端口的數(shù)據(jù)
2.PC-B發(fā)送數(shù)據(jù)到Server,Server接收到來自NAT-B,60020端口的數(shù)據(jù)
3.此時(shí),Server知道了NAT-A和NAT-B的IPPort,于是將它們的IPPort分別發(fā)給對方
4.NAT-A收到來自Server的數(shù)據(jù)(包含NAT-B的IPPort),轉(zhuǎn)發(fā)給了內(nèi)網(wǎng)的PC-A,PC-A獲知NAT-B的IPPort
5.NAT-B收到來自Server的數(shù)據(jù)(包含NAT-A的IPPort),轉(zhuǎn)發(fā)給了內(nèi)網(wǎng)的PC-B,PC-B獲知NAT-A的IPPort
6.PC-A發(fā)送數(shù)據(jù)到NAT-B的IPort,這個(gè)數(shù)據(jù)包,NATB收到后不會(huì)轉(zhuǎn)發(fā)給PC-B,而是丟棄,因?yàn)樗J(rèn)為這是來歷不明的包。
7.PC-B發(fā)送數(shù)據(jù)到NAT-A的IPort,此時(shí)PC-A與PC-B可以進(jìn)行雙向通信,打洞成功。
C# UDP NAT代碼示例下載
該文章在 2021/2/2 11:05:23 編輯過