[問題] TCP Hole Punching

看板java作者 (ruuuuuu)時間6年前 (2018/07/06 21:06), 編輯推噓0(001)
留言1則, 1人參與, 6年前最新討論串1/1
最近學校專題需要用到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
p2p 是專題本身的重點嗎?如果不是找套件耶代
07/07 19:09, 1F
文章代碼(AID): #1RFsbf0K (java)
文章代碼(AID): #1RFsbf0K (java)