1. 程式人生 > 其它 >TCP 基本認識

TCP 基本認識

一、TCP 頭格式有哪些?

我們先來看看 TCP 頭的格式,標註顏色的表示與本文關聯比較大的欄位,其他欄位不做詳細闡述。

序列號:在建立連線時由計算機生成的隨機數作為其初始值,通過 SYN 包傳給接收端主機,每傳送一次資料,就「累加」一次該「資料位元組數」的大小。用來解決網路包亂序問題

確認應答號:指下一次「期望」收到的資料的序列號,傳送端收到這個確認應答以後可以認為在這個序號以前的資料都已經被正常接收。用來解決丟包的問題

控制位

  • ACK:該位為 1 時,「確認應答」的欄位變為有效,TCP 規定除了最初建立連線時的 SYN 包之外該位必須設定為 1 。
  • RST:該位為 1 時,表示 TCP 連線中出現異常必須強制斷開連線。
  • SYN:該位為 1 時,表示希望建立連線,並在其「序列號」的欄位進行序列號初始值的設定。
  • FIN:該位為 1 時,表示今後不會再有資料傳送,希望斷開連線。當通訊結束希望斷開連線時,通訊雙方的主機之間就可以相互交換 FIN 位為 1 的 TCP 段。

二、為什麼需要 TCP 協議? TCP 工作在哪一層?

IP 層是「不可靠」的,它不保證網路包的交付、不保證網路包的按序交付、也不保證網路包中的資料的完整性。

如果需要保障網路資料包的可靠性,那麼就需要由上層(傳輸層)的 TCP 協議來負責。

因為 TCP 是一個工作在傳輸層可靠資料傳輸的服務,它能確保接收端接收的網路包是無損壞

無間隔非冗餘按序的。

三、什麼是 TCP ?

TCP 是面向連線的、可靠的、基於位元組流的傳輸層通訊協議。

  • 面向連線:一定是「一對一」才能連線,不能像 UDP 協議可以一個主機同時向多個主機發送訊息,也就是一對多是無法做到的;

  • 可靠的:無論的網路鏈路中出現了怎樣的鏈路變化,TCP 都可以保證一個報文一定能夠到達接收端;

  • 位元組流:使用者訊息通過 TCP 協議傳輸時,訊息可能會被作業系統「分組」成多個的 TCP 報文,如果接收方的程式如果不知道「訊息的邊界」,是無法讀出一個有效的使用者訊息的。並且 TCP 報文是「有序的」,當「前一個」TCP 報文沒有收到的時候,即使它先收到了後面的 TCP 報文,那麼也不能扔給應用層去處理,同時對「重複」的 TCP 報文會自動丟棄。

四、什麼是 TCP 連線?

用於保證可靠性和流量控制維護的某些狀態資訊,這些資訊的組合,包括Socket、序列號和視窗大小稱為連線。

所以我們可以知道,建立一個 TCP 連線是需要客戶端與服務端端達成上述三個資訊的共識。

  • Socket:由 IP 地址和埠號組成
  • 序列號:用來解決亂序問題等
  • 視窗大小:用來做流量控制

五、如何唯一確定一個 TCP 連線呢?

TCP 四元組可以唯一的確定一個連線,四元組包括如下:

  • 源地址
  • 源埠
  • 目的地址
  • 目的埠

源地址和目的地址的欄位(32位)是在 IP 頭部中,作用是通過 IP 協議傳送報文給對方主機。

源埠和目的埠的欄位(16位)是在 TCP 頭部中,作用是告訴 TCP 協議應該把報文發給哪個程序。

(一)有一個 IP 的服務端監聽了一個埠,它的 TCP 的最大連線數是多少?

服務端通常固定在某個本地埠上監聽,等待客戶端的連線請求。

因此,客戶端 IP 和 埠是可變的,其理論值計算公式如下:

對 IPv4,客戶端的 IP 數最多為 2 的 32 次方,客戶端的埠數最多為 2 的 16 次方,也就是服務端單機最大 TCP 連線數,約為 2 的 48 次方。

當然,服務端最大併發 TCP 連線數遠不能達到理論上限,會受以下因素影響:

  • 檔案描述符限制,每個 TCP 連線都是一個檔案,如果檔案描述符被佔滿了,會發生 too many open files。Linux 對可開啟的檔案描述符的數量分別作了三個方面的限制:
    • 系統級:當前系統可開啟的最大數量,通過 cat /proc/sys/fs/file-max 檢視;
    • 使用者級:指定使用者可開啟的最大數量,通過 cat /etc/security/limits.conf 檢視;
    • 程序級:單個程序可開啟的最大數量,通過 cat /proc/sys/fs/nr_open 檢視;
  • 記憶體限制,每個 TCP 連線都要佔用一定記憶體,作業系統的記憶體是有限的,如果記憶體資源被佔滿後,會發生 OOM。

六、UDP 和 TCP 有什麼區別呢?分別的應用場景是?

UDP 不提供複雜的控制機制,利用 IP 提供面向「無連線」的通訊服務。

UDP 協議真的非常簡,頭部只有 8 個位元組( 64 位),UDP 的頭部格式如下:

  • 目標和源埠:主要是告訴 UDP 協議應該把報文發給哪個程序。
  • 包長度:該欄位儲存了 UDP 首部的長度跟資料的長度之和。
  • 校驗和:校驗和是為了提供可靠的 UDP 首部和資料而設計,防止收到在網路傳輸中受損的 UDP包。

(一)TCP 和 UDP 區別: