TCP \ UDP \ TCP 三次握手和四次揮手
作者:做好一個程序猿
TCP 是面向連接的、可靠的、基于字節流的傳輸層通信協議。
什么是 TCP ?
TCP 是面向連接的、可靠的、基于字節流的傳輸層通信協議。
- 面向連接:一定是「一對一」才能連接,不能像 UDP 協議可以一個主機同時向多個主機發送消息,也就是一對多是無法做到的;
- 可靠的:無論的網絡鏈路中出現了怎樣的鏈路變化,TCP 都可以保證一個報文一定能夠到達接收端;
- 字節流:用戶消息通過 TCP 協議傳輸時,消息可能會被操作系統「分組」成多個的 TCP 報文,如果接收方的程序如果不知道「消息的邊界」,是無法讀出一個有效的用戶消息的。并且 TCP 報文是「有序的」,當「前一個」TCP 報文沒有收到的時候,即使它先收到了后面的 TCP 報文,那么也不能扔給應用層去處理,同時對「重復」的 TCP 報文會自動丟棄。
UDP 和 TCP 的區別
1. 連接
- TCP 是面向連接的傳輸層協議,傳輸數據前先要建立連接。
- UDP 是不需要連接,即刻傳輸數據。
2. 服務對象
- TCP 是一對一的兩點服務,即一條連接只有兩個端點。
- UDP 支持一對一、一對多、多對多的交互通信
3. 可靠性
- TCP 是可靠交付數據的,數據可以無差錯、不丟失、不重復、按需到達。
- UDP 是盡最大努力交付,不保證可靠交付數據。
4. 擁塞控制、流量控制
- TCP 有擁塞控制和流量控制機制,保證數據傳輸的安全性。
- UDP 則沒有,即使網絡非常擁堵了,也不會影響 UDP 的發送速率。
5. 首部開銷
- TCP 首部長度較長,會有一定的開銷,首部在沒有使用「選項」字段時是 20 個字節,如果使用了「選項」字段則會變長的。
- UDP 首部只有 8 個字節,并且是固定不變的,開銷較小。
6. 傳輸方式
- TCP 是流式傳輸,沒有邊界,但保證順序和可靠。
- UDP 是一個包一個包的發送,是有邊界的,但可能會丟包和亂序。
7. 分片不同
- TCP 的數據大小如果大于 MSS 大小,則會在傳輸層進行分片,目標主機收到后,也同樣在傳輸層組裝 TCP 數據包,如果中途丟失了一個分片,只需要傳輸丟失的這個分片。
- UDP 的數據大小如果大于 MTU 大小,則會在 IP 層進行分片,目標主機收到后,在 IP 層組裝完數據,接著再傳給傳輸層。
TCP 和 UDP 應用場景:
由于 TCP 是面向連接,能保證數據的可靠性交付,因此經常用于:
- FTP 文件傳輸;
- HTTP / HTTPS;
由于 UDP 面向無連接,它可以隨時發送數據,再加上UDP本身的處理既簡單又高效,因此經常用于:
- 包總量較少的通信,如 DNS 、SNMP 等;
- 視頻、音頻等多媒體通信;
- 廣播通信;
TCP 三次握手和四次揮手
TCP 三次握手和四次揮手也是面試題的熱門考點,它們分別對應 TCP 的連接和釋放過程。下面就來簡單認識一下這兩個過程
TCP 三次握手
在了解具體的流程前,我們需要先認識幾個概念
- SYN:它的全稱是 Synchronize Sequence Numbers,同步序列編號。是 TCP/IP 建立連接時使用的握手信號。在客戶機和服務器之間建立 TCP 連接時,首先會發送的一個信號。客戶端在接受到 SYN 消息時,就會在自己的段內生成一個隨機值 X。
- SYN-ACK:服務器收到 SYN 后,打開客戶端連接,發送一個 SYN-ACK 作為答復。確認號設置為比接收到的序列號多一個,即 X + 1,服務器為數據包選擇的序列號是另一個隨機數 Y。
- ACK:Acknowledge character, 確認字符,表示發來的數據已確認接收無誤。最后,客戶端將 ACK 發送給服務器。序列號被設置為所接收的確認值即 Y + 1。
如果用現實生活來舉例的話就是
小明 - 客戶端 小紅 - 服務端
- 小明給小紅打電話,接通了后,小明說喂,能聽到嗎,這就相當于是連接建立。
- 小紅給小明回應,能聽到,你能聽到我說的話嗎,這就相當于是請求響應。
- 小明聽到小紅的回應后,好的,這相當于是連接確認。在這之后小明和小紅就可以通話/交換信息了。
TCP 四次揮手
在連接終止階段使用四次揮手,連接的每一端都會獨立的終止。下面我們來描述一下這個過程。
- 首先,客戶端應用程序決定要終止連接(這里服務端也可以選擇斷開連接)。這會使客戶端將 FIN 發送到服務器,并進入 FIN_WAIT_1 狀態。當客戶端處于 FIN_WAIT_1 狀態時,它會等待來自服務器的 ACK 響應。
- 然后第二步,當服務器收到 FIN 消息時,服務器會立刻向客戶端發送 ACK 確認消息。
- 當客戶端收到服務器發送的 ACK 響應后,客戶端就進入 FIN_WAIT_2 狀態,然后等待來自服務器的 FIN 消息
- 服務器發送 ACK 確認消息后,一段時間(可以進行關閉后)會發送 FIN 消息給客戶端,告知客戶端可以進行關閉。
- 當客戶端收到從服務端發送的 FIN 消息時,客戶端就會由 FIN_WAIT_2 狀態變為 TIME_WAIT 狀態。處于 TIME_WAIT 狀態的客戶端允許重新發送 ACK 到服務器為了防止信息丟失。客戶端在 TIME_WAIT 狀態下花費的時間取決于它的實現,在等待一段時間后,連接關閉,客戶端上所有的資源(包括端口號和緩沖區數據)都被釋放。
還是可以用上面那個通話的例子來進行描述
- 小明對小紅說,我所有的東西都說完了,我要掛電話了。
- 小紅說,收到,我這邊還有一些東西沒說。
- 經過若干秒后,小紅也說完了,小紅說,我說完了,現在可以掛斷了
- 小明收到消息后,又等了若干時間后,掛斷了電話。
責任編輯:華軒
來源:
今日頭條