計算機(jī)網(wǎng)絡(luò)中為什么在IP協(xié)議是無連接的前提下,TCP協(xié)議可以面向連接?
TCP報文段就包含在IP數(shù)據(jù)報的數(shù)據(jù)部分里面,怎么做到的?當(dāng)一個個TCP報文從漫游的IP數(shù)據(jù)報身上金蟬脫殼的時候,它們之間的順序等屬性可能都變化了,它們又是如何維系協(xié)議規(guī)定的面向連接功能呢?
點(diǎn)對點(diǎn)通信P2P(Peer-2-Peer)
面向連接(Connection-Oriented)解決的是點(diǎn)對點(diǎn)通信,兩者(Two Sides)之間的通信,或者單播(Unicast)通信。疫情期間,老王被封在1號樓,老婆被封在2號樓。為了防止老婆餓暈,在兩樓之間甩一根繩子,老王將黃瓜、胡蘿卜、土豆栓在繩上,輸送給老婆。老婆有時也將可樂、香煙拴在繩子上運(yùn)給老王,這是點(diǎn)對點(diǎn)通信。
點(diǎn)對多點(diǎn)通信P2MP(Peer-2-Multiple Peer)
無連接(Connectionless)解決的是點(diǎn)對多點(diǎn)的通信,通常稱之為組播(Multicast)通信,廣播(Broadcast)是一種特殊的組播,是組播的一個子集。老王家里沒有吃的,餓得眼睛都綠了,拿起高音喇叭唱山歌,小區(qū)的鄰居都可以聽到,這是點(diǎn)對多點(diǎn)通信。
互聯(lián)網(wǎng)世界的通信,看似繁復(fù)蕪雜,其實(shí)就是以上兩種通信的現(xiàn)實(shí)應(yīng)用。
- 手機(jī)App搶菜、知乎刷疫情數(shù)字、刷小視頻、微信聊天、微信視頻聊天等等,這些是點(diǎn)對點(diǎn)通信,要么是客戶端與服務(wù)器兩點(diǎn)之間的通信,要么是客戶端與客戶端之間的通信。
- IPTV看電視,是典型的點(diǎn)對多點(diǎn)的通信。ARP廣播、DHCP廣播也是點(diǎn)對多點(diǎn)通信。
- 微信群聊天、微信多人視頻聊天、微信訂閱號發(fā)布文章、直播,邏輯上是點(diǎn)對多點(diǎn)通信,其實(shí)依然是多個點(diǎn)對點(diǎn)通信。即一個客戶端與服務(wù)器點(diǎn)對點(diǎn)通信,將內(nèi)容上傳服務(wù)器,然后服務(wù)器計算之后再點(diǎn)對點(diǎn)分發(fā)給多個客戶端。
以上兩種通信的應(yīng)用,都由TCP/IP這個神奇的協(xié)議來承載運(yùn)輸。充分說明,TCP/IP既能實(shí)現(xiàn)點(diǎn)對點(diǎn)的通信需求,也能實(shí)現(xiàn)點(diǎn)對多點(diǎn)的通信需求。TCP/IP是通過什么組合來實(shí)現(xiàn)以上通信需求的呢?
無連接IP + 有連接TCP +無連接的應(yīng)用
由于TCP只能提供P2P通信,所以這個組合只能提供P2P通信。這種組合占互聯(lián)網(wǎng)通信的絕大多數(shù)。具體應(yīng)用有各種APP,搶菜的、刷疫情數(shù)字的、刷小視頻的、聊天的、理財?shù)摹⒐善苯灰椎模嗔耍灰灰涣信e。
無連接IP + 無連接UDP +有連接的應(yīng)用
由于三個組合有一個是有連接的,那么這個組合就是有連接的,而有連接只能提供P2P通信。具體應(yīng)用有IP電話、微信視頻/語音聊天、直播等。
無連接IP + 無連接UDP +無連接的應(yīng)用
由于三個組合全部是無連接的,那么這個組合就是無連接的。無連接的組合不僅可以P2P通信,還可以P2MP通信。具體應(yīng)用有IPTV、股市行情推送、ARP廣播、DHCP廣播、任何組播等。如果你有興趣寫一個這樣組合的通信小程序,可以從一個主機(jī)A發(fā)消息給另外一臺主機(jī)B。如果B開機(jī)就能收到,如果B關(guān)機(jī),消息就消失在網(wǎng)絡(luò)里。
上文的組合容易引起歧義,無連接的IP,是不是還有有連接的IP?
沒有的,IP天生是無連接的。此外,TCP天生是有連接的,UDP天生是無連接的。只有應(yīng)用不是天生的,可以有連接,也可以無連接。
無連接IP、UDP,最大的特征就是一錘子買賣,每一個報文只發(fā)一次,丟就丟了,不管,滿臉寫滿暴躁。
有連接TCP、有連接的應(yīng)用層,每發(fā)出一個報文,會耐心等待對方的確認(rèn)。如果發(fā)一次沒有收到對方的確認(rèn),會超時重新發(fā)送,直到收到對方確認(rèn),或者到達(dá)重傳上限而放棄,然后通知客戶連接斷了。客戶如果刷新,TCP開始新一輪的連接建立,重復(fù)上一個故事。如果客戶不刷新,就躺平。
當(dāng)TCP通信正在進(jìn)行時,IP包的丟失,意味著TCP報文的丟失,發(fā)送方會用周期性的重傳予以補(bǔ)償,所以IP包的丟失沒有什么可怕的,大不了傳輸效率下降,但是TCP連接依然健在。
但是,如果TCP通信正在進(jìn)行,雙方任意的一方IP地址發(fā)生變化、或者端口號發(fā)生變化,這個TCP連接還能通信嗎?
不能了,TCP連接就會斷開。
當(dāng)然通信進(jìn)行時,端口號通常是不會變化的,除非操作系統(tǒng)老爺爺腦子進(jìn)水了,但是IP地址的變化是時有發(fā)生的。比如你的手機(jī)由于信號問題,從Wi-Fi切換到4G,那么IP地址就會從局域網(wǎng)的IP切換成4G網(wǎng)絡(luò)的IP地址,那么你正在進(jìn)行的任何TCP通信都會斷開,這點(diǎn)你很難在APP上發(fā)現(xiàn)。因?yàn)锳PP會在斷開的時刻,選擇使用新的IP地址重連服務(wù)器,然后再打開要刷新的頁面。
無論是移動通信的漫游,還是Wi-Fi的漫游,如果不想讓電話中斷、視頻中斷,最最核心的要素是保持手機(jī)IP地址的不變。如何保持IP地址不變?可以從大二層技術(shù)找到靈感。
作者|車小胖談網(wǎng)絡(luò)|公眾號