1. 程式人生 > >P2P原理之打洞

P2P原理之打洞

IPv4分配的地址有限,滿足不了現在的需求,而IPv6又不能直接向下相容,所以有了NAT,網路地址轉換協議。
公網IP一般都是固定IP,而我們家庭一般使用的都不是固定的,也不需要,因為我們也不是無時無刻都在上網(與外網連線),所以一般運營商才有固定IP。而我們的IP地址只是子網中的一個私有地址,NAT就是負責在我們連線外網時,對地址進行轉換。(路由器也內含了NAT功能)
NAT解決了IP地址不夠的問題,但在P2P中,卻造成了新的問題。(內網可能無法被外網的程式主動連線)
在P2P傳輸中,若A向B傳資料,需要知道B的IP地址和埠號,而在NAT實現中,有這四種情況:
Cone NAT:

  1. Full Cone: 把所有來自相同內部的IP地址和埠請求對映到相同的外部IP地址和埠,任何一個外部主機可通過該對映傳送IP包到該內部主機。
  2. Restricted Cone: 把所有來自相同內部的IP地址和埠請求對映到相同的外部IP地址和埠,但只有當內部主機先給IP地址為X的外部主機發送IP包,該外部主機才能向該內部主機發送IP包。
  3. Port Restricted Cone: 與2類似,但多了埠限制,只有當內部主機先向IP地址為add1,埠號為port1的外部主機發送IP包,該外部主機才能把源埠號為port1的IP包傳送給該內部主機。

symmetric NAT:

  1. 重新分配埠號,即當內部主機A和外部B通訊,對外使用埠號port1,而當內部主機A與其他外部如C通訊,對外使用的埠號會更換。

在P2P傳輸中,若A和B都在內網中,且採用的不是Full Cone,A想發信息給B是做不到的,這時需要一箇中間人C,其事先與A、B進行過通訊,當A想發信息給B,A要請求C,然後C請求B向A的外網IP傳送一個UDP包,這樣A就能向B發信息了。這個發包的過程就是打洞。

但是如果雙方採用的是symmetric NAT的實現,且更換埠號不是直接按順序增加的,那不管是C還是A,都不知道B新分配的外網的埠號是多少,哪怕C要求B將新的埠號告知C,C再告知A,當A向B發信息時,A又用了一個新的埠號(因為B的埠是新的了,雖然IP地址沒變),這時A到達B的NAT時,會因為A用了新的埠號而丟棄這個包,所以還是發不了資訊,如此死迴圈。那麼symmetric NAT怎麼打洞呢?(未完待續)

上面討論的都是雙方使用相同的NAT實現,A, B分別使用不同的NAT實現也能推匯出來,就不細說了。

還有更多的打洞技術,這只是最初使用的。