TCP和UDP講解

一、TCP和UDP簡介

TCP 和 UDP 是傳輸層的兩個協議

傳輸控制協議(TCP):

  • TCP(傳輸控制協議)定義了兩臺計算機之間進行可靠的傳輸而交換的數據和確認信息的格式,以及計算機爲了確保數據的正確到達而採取的措施。協議規定了TCP軟件怎樣識別給定計算機上的多個目的進程如何對分組重複這類差錯進行恢復。協議還規定了兩臺計算機如何初始化一個TCP數據流傳輸以及如何結束這一傳輸。TCP最大的特點就是提供的是面向連接、可靠的字節流服務。

用戶數據報協議(UDP):

  • UDP(用戶數據報協議)是一個簡單的面向數據報的傳輸層協議。提供的是非面向連接的、不可靠的數據流傳輸。UDP不提供可靠性,也不提供報文到達確認、排序以及流量控制等功能。它只是把應用程序傳給IP層的數據報發送出去,但是並不能保證它們能到達目的地。因此報文可能會丟失、重複以及亂序等。但由於UDP在傳輸數據報前不用在客戶和服務器之間建立一個連接,且沒有超時重發等機制,故而傳輸速度很快。

二、 UDP

1. 包頭

在這裏插入圖片描述
由上圖可以看出,UDP 除了端口號,基本啥都沒有了。如果沒有這兩個端口號,數據就不知道該發給哪個應用。

2. 特點

  • 溝通簡單,不需要大量的數據結構,處理邏輯和包頭字段
  • 輕信他人。它不會建立連接,但是會監聽這個地方,誰都可以傳給它數據,它也可以傳給任何人數據,甚至可以同時傳給多個人數據。
  • 愣頭青,做事不懂變通。不會根據網絡的情況進行擁塞控制,無論是否丟包,它該怎麼發還是怎麼發

3. 應用場景

  • 需要資源少,網絡情況穩定的內網,或者對於丟包不敏感的應用,比如 DHCP 就是基於 UDP 協議的。
  • 不需要一對一溝通,建立連接,而是可以廣播的應用。因爲它不面向連接,所以可以做到一對多,承擔廣播或者多播的協議。
  • 需要處理速度快,可以容忍丟包,但是即使網絡擁塞,也毫不退縮,一往無前的時候

例如:

  • 直播。直播對實時性的要求比較高,寧可丟包,也不要卡頓的,所以很多直播應用都基於 UDP 實現了自己的視頻傳輸協議
  • 實時遊戲。遊戲的特點也是實時性比較高,在這種情況下,採用自定義的可靠的 UDP 協議,自定義重傳策略,能夠把產生的延遲降到最低,減少網絡問題對遊戲造成的影響
  • 物聯網。一方面,物聯網領域中斷資源少,很可能知識個很小的嵌入式系統,而維護 TCP 協議的代價太大了;另一方面,物聯網對實時性的要求也特別高。比如 Google 旗下的 Nest 簡歷 Thread Group,推出了物聯網通信協議 Thread,就是基於 UDP 協議的

三、TCP

1. 包頭

在這裏插入圖片描述
TCP 的包頭內容 及代表作用 :
(1)序號:Seq序號,佔32位,用來標識從TCP源端向目的端發送的字節流,發起方發送數據時對此進行標記。
(2)確認序號:Ack序號,佔32位,只有ACK標誌位爲1時,確認序號字段纔有效,Ack=Seq+1。
(3)標誌位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

  • URG:緊急指針(urgent pointer)有效。
  • ACK:確認序號有效。
  • PSH:接收方應該儘快將這個報文交給應用層。
  • RST:重置連接。
  • SYN:發起一個新連接。
  • FIN:釋放一個連接。

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

通過對 TCP 頭的解析,我們知道要掌握 TCP 協議,應該重點關注以下問題:

  • 順序問題
  • 丟包問題
  • 連接維護
  • 流量控制
  • 擁塞控制

2. 特點

TCP相對於UDP協議的特點是:面向連接的、字節流和可靠傳輸。

  1. 面向連接的:使用TCP協議通信的雙方必須先建立連接,然後才能開始數據的讀寫,TCP連接是全雙工的,即雙方的數據讀寫可以通過一個連接進行。完成數據交換之後,通信雙方都必須斷開連接以釋放資源
  2. 流式服務:TCP的字節流服務的表現形式就體現在,發送端執行的寫操作數和接收端執行的讀操作次數之間沒有任何數量關係,當發送端應用程序連續執行多次寫操作的時,TCP模塊先將這些數據放入TCP發送緩衝區中。當TCP模塊真正開始發送數據的時候,發送緩衝區中這些等待發送的數據可能被封裝成一個或多個TCP報文段發出。
  3. TCP傳輸是可靠的,原因如下:
    (1)TCP協議採用發送應答機制,即發送端發送的每個TCP報文段都必須得到接收方的應答,才能認爲這個TCP報文段傳輸成功。
    (2)TCP協議採用超時重傳機制,發送端在發送出一個TCP報文段之後啓動定時器,如果在定時時間內未收到應答,它將重新發送該報文段。
    (3)由於TCP報文段最終是以IP數據報發送的,而IP數據報到達接收端可能亂序、重複、所以TCP協議還會將接收到的TCP報文段重排、整理、再交付給應用層。

3. TCP三次握手

所有的問題,首先都要建立連接,所以首先是連接維護的問題

TCP 的建立連接稱爲三次握手,可以簡單理解爲下面這種情況

	A:您好,我是 A
	B:您好 A,我是 B
	A:您好 B
  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之間可以開始傳輸數據了。

圖解爲:
在這裏插入圖片描述

4. 四次揮手

所謂四次揮手(Four-Way Wavehand)即終止TCP連接,就是指斷開一個TCP連接時,需要客戶端和服務端總共發送4個包以確認連接的斷開。在socket編程中,這一過程由客戶端或服務端任一方執行close來觸發,整個流程如下圖所示:
在這裏插入圖片描述
由於TCP連接時全雙工的,因此,每個方向都必須要單獨進行關閉,這一原則是當一方完成數據發送任務後,發送一個FIN來終止這一方向的連接,收到一個FIN只是意味着這一方向上沒有數據流動了,即不會再收到數據了,但是在這個TCP連接上仍然能夠發送數據,直到這一方向也發送了FIN。首先進行關閉的一方將執行主動關閉,而另一方則執行被動關閉,上圖描述的即是如此。

  1. 第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。
  2. 第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。
  3. 第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。
  4. 第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。

5. 應用場景

它適用於對數據傳輸可靠性要求比較高的場景,例如文本傳輸之類的。

四、總計及面試問題

1. TCP 和 UDP 的區別:

  • TCP 是面向連接的,UDP 是面向無連接的
  • UDP程序結構較簡單
  • TCP 是面向字節流的,UDP 是基於數據報的
  • TCP 保證數據正確性,UDP 可能丟包
  • TCP 保證數據順序,UDP 不保證

2. 什麼是面向連接,什麼是面向無連接

在互通之前,面向連接的協議會先建立連接,如 TCP 有三次握手,而 UDP 不會

3. TCP 爲什麼是可靠連接

  • 通過 TCP 連接傳輸的數據無差錯,不丟失,不重複,且按順序到達。
  • TCP 報文頭裏面的序號能使 TCP 的數據按序到達
  • 報文頭裏面的確認序號能保證不丟包,累計確認及超時重傳機制
  • TCP 擁有流量控制及擁塞控制的機制
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章