TCP的三次握手與四次揮手


引言

前段時間一直在准備面試,本以為准備的挺好,然而被騰訊面試官問道網絡問題的時候,發現自己對TCP協議的理解真的是停留在表面,不夠深入。於是本着提高自己的想法,去查了些資料,這里主要是總結我對TCP建立與斷開連接過程的理解。你可以在這里看到更好的排版

常見題目

在面試中網絡問題是一定會考察的,而TCP協議則是考察網絡知識的重點。經常會被問道的問題如下:

  1. 請講一下TCP協議建立連接的過程
  2. 請介紹TCP協議中的三次握手和四次揮手是怎么樣的
  3. 為什么TCP協議要三次握手來確立連接,而不是兩次,也不是4次
  4. TCP連接發起是的syn序號為什么不能從同一個序號開始,比如說1

接下來,我將介紹我理解的TCP三次握手和4次揮手的過程,如果錯誤還請指正,謝謝。

TCP協議

三次握手過程

首先需要服務器監聽特定的端口,等待客戶端來請求連接。當客戶端需要建立連接時,客戶端會先向服務器發送syn報文,將報文中syn置為隨機生成的序號n(這里假設序號為1000)。服務器收到同步報文后,會回復一個ack報文,把ACK位置位n+1(這里的序號應該為1001),同時設置syn為y(這里假設為2000)。客戶端收到服務器發送的ack報文后,會回復一個ACK報文給服務器,其中ACK位置為y+1(這里即為2001)。當服務器收到ACK消息后,即認為連接進入穩定狀態。狀態機與流程圖如下:

四次揮手過程

當client從app接收到關閉指令后,client會給server發送FIN消息(表明client不會再給server發送數據),client進入finish-wait-1狀態。server收到finish消息后,回復確認消息ack給client,自身進入close-wait狀態。client接收到ack消息后,進入到FIN-WAIT-2狀態。並且在此狀態等待服務器發送finish消息。當server接收到app的關閉指令后,server給client發送FIN消息。服務器進入到LAST-ACK狀態。客戶端收到FIN消息后,會回復ACK消息,同時進入到TIME-WAIT狀態,來等待server收到ack消息,客戶端會在接下來的2MSL(maximum segment lifetime)的時間內保持TIME-WAIT狀態。為什么是2MSL時間呢,一是為了server有足夠的時間收到ACK消息,並在消息丟失時重發。二是為了在此連接結束后的后續連接提供緩沖期。如果不是2倍MSL的話,就可能混合來自不同連接的數據包,造成消息混亂。狀態機與流程圖如下:

完整過程

以下為TCP從建立連接到斷開的完整流程圖

開始答題

有了上面的介紹,基本能夠回答前兩個問題。

請講一下TCP協議建立連接的過程

看上面

請介紹TCP協議中的三次握手和四次揮手是怎么樣的

看上面

為什么TCP協議要三次握手來確立連接,而不是兩次,也不是4次

首先呢,根本不存在可靠的連接,tcp只是提供相對可靠的連接。三次握手的主要目的是交換通信需要的參數,主要是server與client的syn序號,這個序號是用於收發數據的。如果只有兩次握手的話,當服務器發送ack+syn消息后,就會認為建立了穩定連接,這個時候如果ack+syn丟失了,client並沒有收到這個消息,那么客戶端就會認為連接建立不成功,而直接進入close狀態。這樣就會造成,server一直在哪傻等,永遠不會有client來發送數據,這就會造成服務器資源的浪費。至於為什么不是四次握手,是因為握手三次成功以后,就可以認定當前連接是可靠的了,不然的話還需要client與server互相之間發送ack消息,這樣就無休無止了。

TCP連接發起是的syn序號為什么不能從同一個序號開始,比如說1

因為現實中的網絡狀況不可預知,比如說客戶端在第一次連接時,使用序號為1為初始序號進行數據發送,發送了1到30的數據片段,這個時候因為網絡問題斷開了連接。然后客戶端是syn為1重新建立了新的連接,這個時候服務器收到了之前發送的30個字節的數據,服務器就會以為這30個字節的數據是新發的,這就會導致數據混亂。

參考資料

說明,本文所有圖片均來自The TCP/IP Guide

參考資料如下:

The TCP/IP Guide

TCP為什么需要3次握手與4次揮手

TCP三次握手四次揮手詳解


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM