[問題] TCP Hole Punching
最近學校專題需要用到P2P,是希望用TCP的方式實現,但不同的網路下終無法連線,同個
網路下有些路由器可以,有些不行。我有參考網路上Hole Punching的步驟,步驟如下:
如果A想與B通信;
(2)A首先連接C,C得到A的外網NAT A的地址和端口;
(3)B也要連接C,C得到B的外網NAT B的地址和端口;
(4)A告訴C說我要和B通訊;
(5)C通過NAT B發信息給B,告訴B A的外網NAT A的地址和端口;
(6)B向NAT A發數據包(肯定會被NAT A丟棄,因為NAT A上並沒有A->NAT B 的合法sess
ion),但是NAT B上就建立了有B->NAT A的合法session了;
(7)B發數據包給C,讓 C 通知 A,我已經把洞打好了;
(8)A接受到通知後向 B 的外網發NB數據包,這樣就不會被丟棄掉了。因為對於NAT B來
說,它看到的是A的外網NAT A的地址,而通過第6步,B已經讓NAT A成為NAT B的合法通信
對象了。所以當NAT A發數據包給NAT B時,NAT B就會接收並轉發給B。
小妹有個問題:
第六步驟提到B向A發一個數據包,如果我想要用跟C連接所使用的Port號去向A發個數據包
,這樣可行嗎?
我有用wireshark去追蹤封包,有時候會送syn,有時候不會,B跟A的程式的寫法如下:
s = new Socket();
s.setReuseAddress(true);
s.bind(new InetSocketAddress(localPAddress, localPort));
s.connect(new InetSocketAddress(ip, Integer.parseInt(port)),1000);
不知道是哪個環節忽略了才導致無法成功P2P
,哪位大神可以替小妹解惑一下,謝謝!!
手機發文,格式不好還請各位見諒。
熱心回答的大大,p幣奉上><
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 35.176.163.52
※ 文章網址: https://www.ptt.cc/bbs/java/M.1530882409.A.014.html
→
07/07 19:09,
6年前
, 1F
07/07 19:09, 1F
java 近期熱門文章
PTT數位生活區 即時熱門文章