TCP/IP詳解 第十二章(7) TCP的基本認識

前言

不管面試 Java 、C/C++、Python 等開發崗位, TCP 的知識點可以說是的必問的了。

任 TCP 虐我千百遍,我仍待 TCP 如初戀。

遙想小林當年校招時常因 TCP 面試題被刷,真是又愛又狠….

過去不會沒關係,今天就讓我們來消除這份恐懼,微笑着勇敢的面對它吧!

所以小林整理了關於 TCP 三次握手和四次揮手的面試題型,跟大家一起探討探討。

原文:https://mp.weixin.qq.com/s/tH8RFmjrveOmgLvk9hmrkw 支持小林

01 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 連接?

我們來看看 RFC 793 是如何定義「連接」的:

Connections: 

The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream.  

The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.

簡單來說就是,用於保證可靠性和流量控制維護的某些狀態信息,這些信息的組合,包括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 連接數遠不能達到理論上限。

  • 首先主要是文件描述符限制,Socket 都是文件,所以首先要通過 ulimit 配置文件描述符的數目;

  • 另一個是內存限制,每個 TCP 連接都要佔用一定內存,操作系統是有限的。

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

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

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

  • 目標和源端口:主要是告訴 UDP 協議應該把報文發給哪個進程。

  • 包長度:該字段保存了 UDP 首部的長度跟數據的長度之和。

  • 校驗和:校驗和是爲了提供可靠的 UDP 首部和數據而設計。

TCP 和 UDP 區別:

1. 連接

  • TCP 是面向連接的傳輸層協議,傳輸數據前先要建立連接。

  • UDP 是不需要連接,即刻傳輸數據。

2. 服務對象

  • TCP 是一對一的兩點服務,即一條連接只有兩個端點。

  • UDP 支持一對一、一對多、多對多的交互通信

3. 可靠性

  • TCP 是可靠交付數據的,數據可以無差錯、不丟失、不重複、按需到達。

  • UDP 是盡最大努力交付,不保證可靠交付數據。

4. 擁塞控制、流量控制

  • TCP 有擁塞控制和流量控制機制,保證數據傳輸的安全性。

  • UDP 則沒有,即使網絡非常擁堵了,也不會影響 UDP 的發送速率。

5. 首部開銷

  • TCP 首部長度較長,會有一定的開銷,首部在沒有使用「選項」字段時是 20 個字節,如果使用了「選項」字段則會變長的。

  • UDP 首部只有 8 個字節,並且是固定不變的,開銷較小。

TCP 和 UDP 應用場景:

由於 TCP 是面向連接,能保證數據的可靠性交付,因此經常用於:

  • FTP 文件傳輸

  • HTTP / HTTPS

由於 UDP 面向無連接,它可以隨時發送數據,再加上UDP本身的處理既簡單又高效,因此經常用於:

  • 包總量較少的通信,如 DNS 、SNMP 等

  • 視頻、音頻等多媒體通信

  • 廣播通信

 

爲什麼 UDP 頭部沒有「首部長度」字段,而 TCP 頭部有「首部長度」字段呢?

原因是 TCP 有可變長的「選項」字段,而 UDP 頭部長度則是不會變化的,無需多一個字段去記錄 UDP 的首部長度。

爲什麼 UDP 頭部有「包長度」字段,而 TCP 頭部則沒有「包長度」字段呢?

先說說 TCP 是如何計算負載數據長度:

其中 IP 總長度 和 IP 首部長度,在 IP 首部格式是已知的。TCP 首部長度,則是在 TCP 首部格式已知的,所以就可以求得 TCP 數據的長度。

大家這時就奇怪了問:“ UDP 也是基於 IP 層的呀,那 UDP 的數據長度也可以通過這個公式計算呀?爲何還要有「包長度」呢?”

這麼一問,確實感覺 UDP 「包長度」是冗餘的。

因爲爲了網絡設備硬件設計和處理方便,首部長度需要是 4字節的整數倍。

如果去掉 UDP 「包長度」字段,那 UDP 首部長度就不是 4 字節的整數倍了,所以小林覺得這可能是爲了補全 UDP 首部長度是 4 字節的整數倍,才補充了「包長度」字段。

巨人的肩膀

[1] 趣談網絡協議專欄.劉超.極客時間.

[2] 網絡編程實戰專欄.盛延敏.極客時間.

[3] 計算機網絡-自頂向下方法.陳鳴 譯.機械工業出版社

[4] TCP/IP詳解 卷1:協議.範建華 譯.機械工業出版社

[5] 圖解TCP/IP.竹下隆史.人民郵電出版社

[6] https://www.rfc-editor.org/rfc/rfc793.html

[7] https://draveness.me/whys-the-design-tcp-three-way-handshake

[9] https://draveness.me/whys-the-design-tcp-time-wait

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