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