TCP \ UDP \ TCP 三次握手和四次揮手

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 狀態下花費的時間取決於它的實現,在等待一段時間後,連線關閉,客戶端上所有的資源(包括連接埠號碼和緩衝區資料)都被釋放。

還是可以用上面那通通話的例子來進行描述

  • 小明對小紅說,我所有的東西都說完了,我要掛電話了。
  • 小紅說,收到,我這邊還有東西沒說。
  • 經過若干秒後,小紅也說完了,小紅說,我說完了,現在可以掛斷了
  • 小明收到訊息後,又等了若干時間後,就掛斷了電話。