TCP打洞和UDP打洞的區(qū)別

原文地址: http://f543711700.iteye.com/blog/978887

為什么網(wǎng)上講到的P2P打洞基本上都是基于UDP協(xié)議的打洞?難道TCP不可能打洞?還是TCP打洞難于實(shí)現(xiàn)?
假設(shè)現(xiàn)在有內(nèi)網(wǎng)客戶端A和內(nèi)網(wǎng)客戶端B,有公網(wǎng)服務(wù)端S。
如果A和B想要進(jìn)行UDP通信,則必須穿透雙方的NAT路由。假設(shè)為NAT-A和NAT-B。

A發(fā)送數(shù)據(jù)包到公網(wǎng)S,B發(fā)送數(shù)據(jù)包到公網(wǎng)S,則S分別得到了A和B的公網(wǎng)IP,
S也和A B 分別建立了會(huì)話,由S發(fā)到NAT-A的數(shù)據(jù)包會(huì)被NAT-A直接轉(zhuǎn)發(fā)給A,
由S發(fā)到NAT-B的數(shù)據(jù)包會(huì)被NAT-B直接轉(zhuǎn)發(fā)給B,除了S發(fā)出的數(shù)據(jù)包之外的則會(huì)被丟棄。
所以:現(xiàn)在A B 都能分別和S進(jìn)行全雙工通訊了,但是A B之間還不能直接通訊。

解決辦法是:

A向B的公網(wǎng)IP發(fā)送一個(gè)數(shù)據(jù)包,則NAT-A能接收來(lái)自NAT-B的數(shù)據(jù)包
并轉(zhuǎn)發(fā)給A了(即B現(xiàn)在能訪問(wèn)A了);再由S命令B向A的公網(wǎng)IP發(fā)送一個(gè)數(shù)據(jù)包,則
NAT-B能接收來(lái)自NAT-A的數(shù)據(jù)包并轉(zhuǎn)發(fā)給B了(即A現(xiàn)在能訪問(wèn)B了)。

以上就是“打洞”的原理。

但是TCP和UDP在打洞上卻有點(diǎn)不同。這是因?yàn)椴死鹲ocket(標(biāo)準(zhǔn)socket規(guī)范)的API造成的:
UDP的socket允許多個(gè)socket綁定到同一個(gè)本地端口,而TCP的socket則不允許。
這是這樣一個(gè)意思:A B要連接到S,肯定首先A B雙方都會(huì)在本地創(chuàng)建一個(gè)socket,
去連接S上的socket。創(chuàng)建一個(gè)socket必然會(huì)綁定一個(gè)本地端口(就算應(yīng)用程序里面沒(méi)寫(xiě)
端口,實(shí)際上也是綁定了的,至少java確實(shí)如此),假設(shè)為8888,這樣A和B才分別建立了到
S的通信信道。接下來(lái)就需要打洞了,打洞則需要A和B分別發(fā)送數(shù)據(jù)包到對(duì)方的公網(wǎng)IP。但是
問(wèn)題就在這里:因?yàn)镹AT設(shè)備是根據(jù)端口號(hào)來(lái)確定session,如果是UDP的socket,A B可以
分別再創(chuàng)建socket,然后將socket綁定到8888,這樣打洞就成功了。但是如果是TCP的
socket,則不能再創(chuàng)建socket并綁定到8888了,這樣打洞就無(wú)法成功。``

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 當(dāng)今互聯(lián)網(wǎng)到處存在著一些中間件(MIddleBoxes),如NAT和防火墻,導(dǎo)致兩個(gè)(不在同一內(nèi)網(wǎng))中的客戶端無(wú)法...
    空即是色即是色即是空閱讀 1,093評(píng)論 0 0
  • 一、什么是NAT?為什么要使用NAT? NAT是將私有地址轉(zhuǎn)換為合法IP地址的技術(shù),通俗的講就是將內(nèi)網(wǎng)與內(nèi)網(wǎng)通信時(shí)...
    青珩閱讀 1,771評(píng)論 0 9
  • 原文地址: http://f543711700.iteye.com/blog/978044 發(fā)送消息的時(shí)候是UDP...
    Caiaolun閱讀 2,517評(píng)論 0 1
  • 寒假一放,放松下來(lái)真可怕,從起床到午飯根本也不知道自己做了些什么,就是陪著孩子玩玩玩了……
    Jessica_ff17閱讀 226評(píng)論 0 0
  • 面試補(bǔ)習(xí)知識(shí) 1:表視圖(精通iOS開(kāi)發(fā))2:本地化&Core Data(精通iOS開(kāi)發(fā))3月26號(hào) 后面繼續(xù)補(bǔ)3...
    莊棟棟閱讀 258評(píng)論 0 0

友情鏈接更多精彩內(nèi)容