TCP 概述 可靠的、面向連接的、基於字節流、全雙工的協議

目標

  • 瞭解 TCP 協議
  • 瞭解三次握手

一、TCP 是面向連接的協議

  • 面向連接(connection-oriented)
    面向連接的協議要求正式發送數據之前需要通過握手建立一個邏輯連接,結束通信時也是通過有序的四次揮手來斷開連接
  • 無連接(connectionless)
    無連接的協議則不需要在發送數據前建立連接

三次握手

通過三次握手,協商好雙方後續通信的起始序列號、窗口縮放大小等信息
三次握手

第一次握手:客戶端將標誌位 SYN 置爲 1,並隨機產生一個值 seq = x,然後將該數據包發送給服務端,客戶端進入 SYN_SENT 狀態,等待服務端確認
第二次握手:服務端收到客戶端發來的數據包,看到標誌位 SYN = 1,從而知道客戶端想要建立連接,於是服務端將標誌位 ACK 置爲 1(標誌位 SYN 此時還是 1),設置 ack = x + 1隨機產生一個值 seq = y,然後將該數據包發送給客戶端以確認連接請求,服務端進入 SYN_RECVD 狀態,客戶端進入 ESTABLISHED 狀態
第三次握手:客戶端收到確認數據包後,檢查 ack 是否爲 x + 1,標誌位 ACK 是否爲 1,如果都滿足,則將標誌位 ACK 置爲 1,設置 ack = y + 1,然後將該數據包發送給服務端,服務端檢查 ack 是否爲 y + 1,標誌位 ACK 是否爲 1,如果都滿足,則連接建立成功。服務端進入 ESTABLISHED 狀態

標記位
緊急位 URG:緊急處理,可提升數據包發送的優先級
確認位 ACK:代表確認號是否有效
急迫位 PSH:接收方應儘快將這個報文交給應用層
重置位 PST:將建立的連接重置
同步位 SYN:同步序號用來發起一個連接
終止位 FIN:終止一個連接

查看三次握手的標記位
三次握手數據包

第一次握手,標記位 SYN = 1,表示請求
第一次握手數據包

第二次握手,標記位 SYN = 1、ACK = 1,表示應答
第二次握手數據包

第三次握手,標記位 ACK = 1,表示確認
第三次握手數據包

二、TCP 協議是可靠的

IP 是一種無連接、不可靠的協議,盡最大可能將數據報從發送者傳輸給接收者,但並不保證到達的順序會與它們被傳輸的順序一致,也不保證是否重複、是否到達

TCP 在 IP 層基礎上,構建可起靠的傳輸層協議,可靠需要有機制來保障,措施如下:

  • 對每個包提供校驗和
  • 包的序列號解決了接收數據的亂序、重複問題
  • 超時重傳
  • 流量控制、擁塞控制
    TCP 首部

校驗和

如果收到一個校驗和有差錯的報文,TCP 會直接丟棄不回覆,等待發送端重新發送該報文
TCP 包的首部中用兩個字節來表示校驗和

包的序列號

每個包都有唯一的序列號,TCP 根據序列號對收到的網絡包進行排序,然後把結果傳遞給上層應用程序
TCP 收到重複數據(超時重傳導致),根據包序號丟棄重複的數據

超時重傳

TCP 發送數據後,會啓動一個定時器,等待對端確認收到這個數據包。在指定時間內沒有收到 ACK 確認,則會重傳該數據包,然後繼續等待更長時間,如果還沒有收到 ACK 確認再重傳,經過多次重傳還不行後,TCP 會放棄這個網絡包

流量控制、擁塞控制

三、TCP 是面向字節流的協議

流的特點就是沒有邊界

調用 Socket 庫中的程序組件 write(<描述符>, <發送的數據>, <數據長度>) 函數發送數據,只是把數據拷貝到了內核緩衝區,至於何時發送出去、分幾次發送完畢是不確定的

舉個栗子:調用 write 函數發送 500、800 字節數據
發送數據

具體的字節發送情況決定因素包含:路徑最大傳輸單元 MTU、發送窗口大小、擁塞窗口大小等

四、TCP 是全雙工的協議

在 TCP 中,發送端和接收端可以是客戶端/服務端,也可以是服務端/客戶端
在任意時刻,通信雙方既可以發送數據也可以接收數據,每個方向的數據流都有獨立的序列號、滑動窗口大小、MSS 等信息

五、問題

Q:TCP 提供了字節流服務,而通信雙方不保留記錄的邊界,應用程序如何提供自定義的記錄標識?
應用程序使用自己約定的規則來表示消息的邊界,比如有一些使用回車+換行("\r\n"),比如 Redis 的通信協議(RESP protocol)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章