如何從宏觀視角理解“三次握手”?
筆者以往解釋TCP的“三次握手”經常是從微觀視角著手,今天嘗試換一個角度,從宏觀視角來聊聊。
之所以過去比較喜歡從微觀視角進行解釋,是因為個人覺得這是個更加理性、務實且有“干貨”的視角,而宏觀視角很容易陷入感性的泛泛而談。
比如解釋為啥需要“三次握手”,從微觀視角我會說是為了同步通信雙方彼此字節流的起始字節序號。
圖片
至于為啥要同步起始序號,則是因為TCP通信本質是“字節流通信”,而字節流通信的本質則是“字節隊列”的傳輸。
而要確保一個“字節隊列”的完整性,最簡單有效的辦法莫過于確認清楚“隊頭”字節序號和“隊尾”字節序號。
而“三次握手”就是確認這個“隊頭”的,“四次揮手”則是確認“隊尾”的。
圖片
個人一直覺得上述這套說辭配合上三次握手和四次揮手的示意圖,應該就把問題解釋得很清楚了。
但真正站在初學者視角,感覺那種解釋還是難免抽象。
所以到頭來發現,從一個更加感性和易于理解的宏觀視角解釋三次握手還是很有必要的,雖然會喪失精確性,但是卻為初學者埋下了一個“心錨”,為后續更深入和理性的理解建立了基礎。
從宏觀視角解釋三次握手的工作其實很多人都做過了,但個人覺得自己見過的很多解釋還是有些缺乏說服力。
比較常見的解釋就是把三次握手的過程套用到兩個人的“對話”或者“電話”場景之中。
比如我見過一種比喻是,張三要給李四快遞貴重物品。于是他們之間產生類似以下的電話通信(這就類似于三次握手)。
1. 張三對李四說:我準備送快遞,你在家嗎?
2. 李四對張三說: 我在家,你可以送過來。
3. 張三對李四說:好的,我現在就讓快遞員出發。
坦率講,不吹毛求疵的話,這種比喻算是比較好的了,比較準確的映射了三次握手的“三次”通信過程,雖然說從細節上講還不夠精確,但通信方向是對的,次數也是對的。
可這種比喻其實經不起推敲。貴重物品想必大家都有快遞過,有的細心的人也許確實會有這么一個提前通知的過程,但是不這么做會有什么問題嗎?
其實也不會,快遞系統也有自己的驗證方式,快遞員也會電聯預約收件人,以及核驗收件人身份。所以這種比喻的問題就是無法從“功能”的角度讓讀者感受到這個流程的“必要性”。
自己見過的其他的很多比喻也是類似的問題,即它們都是無法體現出“三次握手”在功能上的“必要性”,那種沒有的話可靠性就完全無法保證的“必要性”。
所以本文就補充另一種比喻,純粹是從“必要性”方面的補充,和前面的比喻沒有優劣之說,或者說是各有優劣,互為補充。
這就是,你可以把“三次握手”理解為人類地理大發現時代的“開辟新航路”。
自己在學生時代學習世界史時了解到,地理大發現之前奧斯曼帝國壟斷了東西方的貿易通道,向過路商販牟取了巨量財富,西方為了繞開奧斯曼帝國決定“開辟新航路”,從而開起了“大航海時代”。
當時還是初中,沒見過什么世面,不知道這世界有多大,于是產生了一些天真的疑惑,比如“開辟新航路”是一件很難的事嗎?為什么要專門去做這么一件事,如果想繞過奧斯曼帝國那就繞過好了,為啥要專門搞一個“開辟新航路”的動作?
后來才逐步了解到,在當時的生產力條件下,對于當時西方世界的人而言,要繞過奧斯曼帝國這么巨大的一個國家去到東方世界,可以說比后來的人類登陸月球還要難得多,當中充滿了未知與變數。
達伽馬為了開辟新航路,從頭到尾耗時將近一年,最終終于抵達印度。而且過程中傷亡巨大,出發時4艘船,170名水手,返航時僅剩55名水手兩艘船。
所以,“開辟新航路”這件事必須單獨先做好,再才能放心搞貿易,否則你準備貿易的商品都會打水漂,然后成為后世探險家尋找的“海底寶藏”。
此時我們再重新回到TCP的“三次握手”上來,整個網絡世界其實就可以理解為地理大發現時代的世界,TCP通信則可以理解為東西方的貿易,而“三次握手”就是“開辟新航路”。
網絡在很多時候其實都是不穩定的,經常發生延時和丟包,而且也有“網絡風暴”,這種不確定性就如地理大發現時代的世界一樣。
所以,要在這種不穩定的網絡中保證可靠的傳輸就需要先進行“三次握手”,就如同那個時代東西方貿易前要先開辟航路。否則可能就會像哥倫布一樣,以為自己去的是印度,結果到了美洲。
個人覺得這個比喻比“對話”或者“電話”的比喻更能說明“三次握手”在功能上的“必要性”。
當然,它的缺點也很明顯,就是不能像另外那些比喻那樣精確的映射三次握手中的“三次”通信,比較缺乏細節,所以權當是一種補充吧。



























