1. 程式人生 > >TCP的三次握手與四次揮手(詳解+圖片)

TCP的三次握手與四次揮手(詳解+圖片)

1、TCP與UDP?

1.1、概述

傳輸控制協議(TCP)是一個比較複雜的協議。主要特點如下:

(1)TCP是面向連線的運輸層協議。也就是說,在使用TCP協議之前,需要建立TCP連線,當傳輸資料完畢,必須釋放已經建立的TCP連線。

(2)每一條TCP連線只能是點對點的。

(3)TCP協議是可靠交付的服務。通過TCP連線傳輸的資料,無差錯,不丟失,不重複,並且按順序到達。

(4)TCP提供全雙工通訊。允許雙方程序在任何時候都能傳送資料,TCP連線的兩端都設定有傳送快取和接受快取。

(5)面向位元組流。面向位元組流含義:雖然應用與TCP的互動是一次一塊資料塊,但TCP把互動下來的資料僅僅看成一連串的無結構位元組流,不知道位元組流的含義。

(6)TCP不關心應用程序一次把多長的報文傳送到TCP快取,而是根據對方給出的視窗值和當前網路擁塞程度來解決定一個報文段包含多少個位元組,UDP傳送的報文長度是應用程序給的。

1.2、TCP頭格式

TCP 報文段的報頭有前 20 位元組的固定部分,後面 4n 位元組是根據需要而新增的欄位。 在這裡插入圖片描述

在這裡插入圖片描述

你需要注意這麼幾點:
  • TCP的包是沒有IP地址的,那是IP層上的事。但是有源埠和目標埠
  • 一個TCP連線需要四個元組來表示是同一個連線(src_ip, src_port, dst_ip, dst_port)準確說是五元組,還有一個是協議。但因為這裡只是說TCP協議,所以,這裡我只說四元組。
注意上圖中的四個非常重要的東西:
  • Sequence Number是包的序號就是seq,用來解決網路包亂序(reordering)問題。 佔32位,用來標識從TCP源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。
  • Acknowledgement Number就是ack——用於確認收到,用來解決不丟包的問題。 佔32位,只有ACK標誌位為1時,確認序號欄位才有效,ack=seq+1。
  • Window又叫Advertised-Window,也就是著名的滑動視窗(Sliding Window),用於解決流控的。
  • TCP Flag ,也就是包的型別,主要是用於操控TCP的狀態機的。 標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下: (A)URG:緊急指標(urgent pointer)有效。 (B)ACK:確認序號有效。 (C)PSH:接收方應該儘快將這個報文交給應用層。 (D)RST:重置連線。 (E)SYN:發起一個新連線。 (F)FIN:釋放一個連線。
需要注意的是:

(A)不要將確認序號Ack與標誌位中的ACK搞混了。 (B)確認方Ack=發起方Req+1,兩端配對。

1.3、 三次握手

所謂三次握手(Three-Way Handshake)即建立TCP連線,就是指建立一個TCP連線時,需要客戶端和服務端總共傳送3個包以確認連線的建立。在socket程式設計中,這一過程由客戶端執行connect來觸發,整個流程如下圖所示: 在這裡插入圖片描述

SYN:同步序列編號(Synchronize Sequence Numbers)
  • (1)第一次握手:Client將標誌位SYN置為1,隨機產生一個值seq=J,並將該資料包傳送給Server,Client進入SYN_SENT狀態,等待Server確認。
  • (2)第二次握手:Server收到資料包後由標誌位SYN=1知道Client請求建立連線,Server將標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個值seq=K,並將該資料包傳送給Client以確認連線請求,Server進入SYN_RCVD狀態。
  • (3)第三次握手:Client收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間可以開始傳輸資料了。

1.4、四次揮手

所謂四次揮手(Four-Way Wavehand)即終止TCP連線,就是指斷開一個TCP連線時,需要客戶端和服務端總共傳送4個包以確認連線的斷開。在socket程式設計中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:

在這裡插入圖片描述 由於TCP連線時是全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成資料傳送任務後,傳送一個FIN來終止這一方向的連線,收到一個FIN只是意味著這一方向上沒有資料流動了,即不會再收到資料了,但是在這個TCP連線上仍然能夠傳送資料,直到這一方向也傳送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

  • (1)第一次揮手:Client傳送一個FIN,用來關閉C->S的資料傳送,Client進入FIN_WAIT_1狀態。
  • (2)第二次揮手:Server收到FIN後,傳送一個ACK給Client,確認序號為收到序號+1(與SYN相同,一個 FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
  • (3)第三次揮手:Server傳送一個FIN,用來關閉S->C的資料傳送,Server進入LAST_ACK狀態。
  • (4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接著傳送一個ACK給Server,確認序 號 為收到序號+1,Server進入CLOSED狀態,完成四次揮手。

1.5、為什麼建立連線是三次握手,而關閉連線卻是四次揮手呢?

這是因為服務端在LISTEN狀態下,收到建立連線請求的SYN報文後,把ACK和SYN放在一個報文裡傳送給客戶端。而關閉連線時,當收到對方的FIN報文時,僅僅表示對方不再發送資料了但是還能接收資料,己方也未必全部資料都發送給對方了,所以己方可以立即close,也可以傳送一些資料給對方後,再發送FIN報文給對方來表示同意現在關閉連線,因此,己方ACK和FIN一般都會分開發送。

2、TCP 與 UDP

2.1 運輸層主要使用以下兩種協議:

1、傳輸控制協議 TCP–提供面向連線的,可靠的資料傳輸服務。

2、使用者資料協議 UDP–提供無連線的,盡最大努力的資料傳輸服務。

2.2 TCP 的主要特點:
  1. TCP 是面向連線的(就像打電話一樣,通話前需要先撥號建立連線,通話結束後要掛機釋放連線);
  2. 每一條 TCP 連線只能有兩個端點,每一條TCP連線只能是點對點的(一對一);
  3. TCP 提供可靠交付的服務,通過TCP連線傳送的資料,無差錯、不丟失、不重複、並且按序到達;
  4. TCP 提供全雙工通訊, 允許通訊雙方的應用程序在任何時候都能傳送資料。TCP連線的兩端都設有傳送快取和接收快取,用來臨時存放雙方通訊的資料;
  5. 面向位元組流。TCP 中的“流”指流入程序或從程序流出的位元組序列;“面向位元組流”的含義是:雖然應用程式和 TCP的互動是一次一個資料塊,但 TCP 把應用程式交下來的資料僅僅看成是一連串的無結構的位元組流。
2.3 UDP 的主要特點:
  1. UDP 是無連線的;
  2. UDP 盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連結狀態;
  3. UDP 是面向報文的;
  4. UDP 沒有擁塞控制,因此網路出現擁塞不會使主機的傳送速率降低;
  5. UDP 支援一對一、一對多、多對一和多對多的互動通訊;
  6. UDP 的首部開銷小,只有8個位元組,比TCP的20個位元組的首部要短。

在這裡插入圖片描述