【計算機網絡】TCP三次握手四次揮手

TCP三次握手四次揮手

TCP的報文格式
在這裏插入圖片描述
關鍵字段:
序號(sequence number)
Seq序號:佔4個字節,在建立連接時由計算機生成的隨機數作爲其初始值,通過 SYN 包傳給接收端主,用來解決網絡包亂序問題。
確認號ack: 佔4個字節,只有ACK標誌位爲1時,確認序號字段纔有效, Ack=Seq+1,表示期望收到的下一個字節的序號,並且確認號之前的數據已經全部接收
標誌位(flag

  1. 同步SYN
    佔1位,連接建立時用於同步序號。
  • SYN=1時,表示這是一個連接請求或連接確認報文。
  • 當SYN=1,ACK=0時表示:這是一個連接請求報文段。若同意連接,則在響應報文段中使得SYN=1,ACK=1。
    注意:SYN這個標誌位只有在TCP建產連接時纔會被置1,握手完成後SYN標誌位被置0。
  1. 終止FIN
    佔1位,用於釋放一個傳輸連接。
  • FIN=1時,表示數據已全部傳輸完成,發送端沒有數據要傳輸了,要求釋放當前連接,但是接收端仍然可以繼續接收還沒有接收完的數據。
  • FIN=0,正常傳輸數據。
  1. 確認ACK
    佔1位,僅當ACK=1時,確認號字段纔有效。ACK=0時,確認號無效

TCP建立連接-三次握手
在這裏插入圖片描述

  1. 第一次握手
    客戶端發送syn包的數據包到服務器,其中SYN標誌位爲1, ACK=0,發送順序號seq=i(隨機int)並進入SYN_SEND狀態,等待服務器確認;
    問題:此時如果報文丟失發送不到對端會如何?
    答:C端發送報文之後會啓動一個定時器,在超時之後未收到S端的確認,會再次發送SYN請求,每次嘗試的時間會是第一次的二倍,如果總的總嘗試時間爲75秒,此次建立鏈接失敗。
  2. 第二次握手
    服務器收到syn包,發現SYN=1,表示客戶端請求連接,必須確認客戶的SYN(將SYN和ACK置爲1應答,表示同意連接),發送確認包ACK包(ack=i+1表示i之前的已經收到,期望接收下一個字節數據),同時自己也發送一個SYN包(seq=j 隨機產生),即SYN+ACK包,此時服務器進入SYN_RECV狀態。
    問題:如果第二次報文丟失怎麼辦?
    在發送完ACK+SYN報文後會啓動一個定時器,超時沒有收到ACK確認,會再次發送,會進行多次重試。超時時間依舊每次翻倍,重試次數可設置。
  3. 第三次握手
    客戶端收到服務器的SYN+ACK包,首先進行檢查(ack是否爲i+1, ACK是否爲1),如果正確向服務器發送確認包ACK(ack=j+1),此包發送完畢;服務器進行檢查(ack是否爲j+1, ACK是否爲1),如果正確,客戶端和服務器進入ESTABLISHED狀態,完成三次握手
    握手過程中傳送的包裏不包含數據,三次握手完畢後,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP連接都將被一直保持下去。

TCP斷開連接-四次揮手
在這裏插入圖片描述
由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

  1. 第一次揮手
    客戶端發送一個FIN,用來關閉客戶端到服務端的數據傳送,也就是主動關閉方告訴被動關閉方:我已經不會再給你發數據了(當然,在fin包之前發送出去的數據,如果沒有收到對應的ack確認報文,主動關閉方依然會重發這些數據),但是,此時主動關閉方還可以接受數據。Client進入FIN_WAIT_1狀態。
    注意:這裏不發送的是正常連接時傳輸的數據(非確認報文),而不是一切數據,所以客戶端仍然能發送ACK確認報文
  2. 第二次揮手
    (服務端)被動關閉方收到FIN包後,發送一個ACK給對方(ack=x+1), 服務端端進入CLOSE_WAIT狀態,進入此狀態後S端把剩餘未發送的數據發送到C端,C端收到S端的ACK之後,進入FIN_WAIT2狀態, 同時繼續接受S端傳輸的其他數據包。
  3. 第三次揮手
    S端處理完自己待發送的數據之後,也會發送FIN斷開鏈接的請求(服務端),用來關閉被動關閉方到主動關閉方的數據傳送,也就是告訴主動關閉方,我的數據也發送完了,不會再給你發數據了, S端進入LAST_ACK狀態。
  4. 第四次揮手 C端方收到斷開請求FIN後,發送一個ACK(ack=m+1)給被動關閉方,至此,完成四次揮手。