關於TCP三次握手,這是我見過最好的解讀了,通俗易懂
分享職場生活、職場攻略、同事相處技巧和創業資源
文|洪生鵬
關於TCP協議三次握手的問題,在面試中是最為常見的知識點之一,得到了很多面試官的青睞,如果這個知識點沒有掌握好,面試官要是問得深入一點,求職者往往會不知所措。
為什麼建立連線需要三次握手?
首先非常明確的是兩次握手是最基本的。第一次握手,客戶端發了個連線請求訊息到服務端,服務端收到資訊後知道自己與客戶端是可以連線成功的,但此時客戶端並不知道服務端是否已經接收到了它的請求,所以服務端接收到訊息後得應答,客戶端得到服務端的反饋後,才確定自己與服務端是可以連線上的,這就是第二次握手。
客戶端只有確定了自己能與服務端連線上才能開始發資料。所以兩次握手肯定是最基本的。
TCP三次握手
看到這裡,你或許會問,那麼為什麼需要第三次握手呢?我們來看一下,假設一下如果沒有第三次握手,而是兩次握手後我們就認為連線成功了,那麼會發生什麼?第三次握手是為了防止已經失效的連線請求報文段突然又傳到服務端,因而產生錯誤。
譬如發起請求遇到類似這樣的情況:客戶端發出去的第一個連線請求由於某些原因在網路節點中滯留了導致延遲,直到連線釋放的某個時間點才到達服務端,這是一個早已失效的報文,但是此時服務端仍然認為這是客戶端的建立連線請求第一次握手,於是服務端迴應了客戶端,第二次握手。
如果只有兩次握手,那麼到這裡,連線就建立了,但是此時客戶端並沒有任何資料要傳送,而服務端還在傻傻的等候佳音,造成很大的資源浪費。所以需要第三次握手,只有客戶端再次迴應一下,就可以避免這種情況。
如果你覺得上面的闡述過於專業化,還是有點萌萌的,不要緊,下面我們來個生活案例來闡述。
TCP 三次握手好比在一個夜高風黑的夜晚,你一個人在小區裡散步,不遠處看見小區裡的一位漂亮妹子迎面而來,但是因為路燈有點暗等原因不能100%確認,所以要通過招手的方式來確定對方是否認識自己。
你首先向妹子招手(syn),妹子看到你向自己招手後,向你點了點頭擠出了一個微笑(ack)。你看到妹子微笑後確認了妹子成功辨認出了自己(進入estalished狀態)。
但是妹子有點不好意思,向四周看了一看,有沒有可能你是在看別人呢,她也需要確認一下。妹子也向你招了招手(syn),你看到妹子向自己招手後知道對方是在尋求自己的確認,於是也點了點頭擠出了微笑(ack),妹子看到對方的微笑後確認了你就是在向自己打招呼(進入established狀態)。
於是兩人加快步伐,走到了一起,彼此之間相互擁抱。
我們來回顧一下,這個過程中總共有四個動作,
- 你招手
- 妹子點頭微笑
- 妹子招手
- 你點頭微笑
其中妹子連續進行了兩個動作,先是點頭微笑(回覆對方),然後再次招手(尋求確認),實際上我們可以將這兩個動作合成一個動作,招手的同時點頭和微笑(syn+ack)。於是這四個動作就簡化成了三個動作。
- 你招手
- 妹子點頭微笑並招手
- 你點頭微笑
這就是三次握手的本質,中間的一次動作是兩個動作的合併。通過這個案例,不知你對TCP三次握手,有沒有進一步的理解。
握手完成後,開始TCP 資料傳輸
TCP 資料傳輸就是兩個人隔空交流,有一定的距離,需要對方反覆確認聽見了自己的話。
你喊了一句話(data),妹子聽見了之後要向你回覆自己聽見了(ack)。如果你喊了一句,半天沒聽到妹子回覆,你會很低落,好比談戀愛的時候,你滿腔熱情,而妹子忽冷忽熱,所以你鍥而不捨,一次不行,就兩次,兩次不行就三次,這就是tcp重傳。
也有可能是妹子知道你的本意了,但是妹子有點害羞,遲遲沒有回覆亦或是妹子回覆了你沒收到,以至於你沒收到妹子的回覆。你不能判斷究竟到底妹子喜不喜歡你,對你有沒有好感,沒關係,男人嘛?要主動點,重傳一下就好。
既然會重傳,妹子就有可能同一句話聽見了兩次,這就是去重。對於重傳和去重這兩項工作作業系統的網路核心模組都已經幫我們處理好了,我們不用理會。
由於筆者水平有限,由於筆者水平有限,很多網路基礎知識需要去深入瞭解去探索,文中紕漏之處在所難免,權當拋磚引玉,還請各位大牛不吝賜教。歡迎交流。
【END】