TCP 和 UDP

東岸往事·發表於2019-03-03

TCP/IP五層網路結構模型

  • 物理層:物理層建立在物理通訊介質的基礎上,作為系統和通訊介質的介面,用來實現資料鏈路實體間透明的位元 (bit) 流傳輸。只有該層為真實物理通訊,其它各層為虛擬通訊

  • 資料鏈路層:在物理層提供位元流服務的基礎上,建立相鄰結點之間的資料鏈路,通過差錯控制提供資料幀(Frame)在通道上無差錯的傳輸,並進行各電路上的動作系列。資料的單位稱為幀(frame)

  • 網路層:選擇合適的路由,使資料分組(packet)可以交付到目的主機

  • 傳輸層:負責主機中程式間的通訊

  • 應用層:直接為使用者的應用程式提供服務

UDP詳解

以下內容來自wiki - 最英俊的百科全書

使用者資料包協議(英語:User Datagram Protocol,縮寫為UDP),又稱使用者資料包協定,是一個簡單的面向資料包的傳輸層協議,正式規範為RFC 768。
在TCP/IP模型中,UDP為網路層以上和應用層以下提供了一個簡單的介面。UDP只提供資料的不可靠傳遞,它一旦把應用程式發給網路層的資料傳送出去,就不保留資料備份(所以UDP有時候也被認為是不可靠的資料包協議)。UDP在IP資料包的頭部僅僅加入了複用和資料校驗(欄位)。

UDP的優點

  • 無需建立連線(減少延遲)
  • 實現簡單:無需維護連線狀態
  • 頭部開銷小(最小值為8byte)
  • 沒有擁塞控制:應用可以更好的控制傳送時間和傳送速率

UDP頭部:


UDP的頭部是由源埠號、目標埠號、包長和校驗4個部分組成,其中兩個是可選的。各16bit的來源埠和目的埠用來標記傳送和接受的應用程式。因為UDP不需要應答,所以來源埠是可選的,如果來源埠不用,那麼置為零。在目的埠後面是長度固定的以位元組為單位的長度域,用來指定UDP資料包包括資料部分的長度,長度最小值為8byte。首部剩下地16bit是用來對首部和資料部分一起做校驗和(Checksum)的,checksum主要是用來檢測UDP段在傳輸中是否發生了錯誤。還有就是,校驗和計算中也需要計算UDP偽頭部,偽頭部包含IP頭部的一些欄位。我們剛才介紹了識別一個通訊需要5項資訊,而UDP頭部只有埠號,餘下的三項在IP頭部,所以引入了偽頭部的概念。(IPv6的IP頭部沒有校驗和欄位)

基於UDP協議的有:

  • 域名系統(DNS)
  • 簡單網路管理協議(SNMP)
  • 動態主機配置協議(DHCP)
  • 路由資訊協議(RIP)
  • 自舉協議(BOOTP)
  • 簡單檔案傳輸協議(TFTP)

TCP詳解

以下內容來自wiki - 最英俊的百科全書
傳輸控制協議(英語:Transmission Control Protocol)是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,由IETF的RFC 793定義。
在因特網協議族(Internet protocol suite)中,TCP層是位於IP層之上,應用層之下的中間層。不同主機的應用層之間經常需要可靠的、像管道一樣的連線,但是IP層不提供這樣的流機制,而是提供不可靠的包交換。
應用層向TCP層傳送用於網間傳輸的、用8位位元組表示的資料流,然後TCP把資料流分割槽成適當長度的報文段(通常受該計算機連線的網路的資料鏈路層的最大傳輸單元(MTU)的限制)。之後TCP把結果包傳給IP層,由它來通過網路將包傳送給接收端實體的TCP層。TCP為了保證不發生丟包,就給每個包一個序號,同時序號也保證了傳送到接收端實體的包的按序接收。然後接收端實體對已成功收到的包發回一個相應的確認(ACK);如果傳送端實體在合理的往返時延(RTT)內未收到確認,那麼對應的資料包就被假設為已丟失將會被進行重傳。TCP用一個校驗和函式來檢驗資料是否有錯誤;在傳送和接收時都要計算校驗和

三次握手

TCP用三路握手(three-way handshake)過程建立一個連線。在連線建立過程中,很多引數要被初始化,例如序號被初始化以保證按序傳輸和連線的強壯性。

  • 客戶端通過向伺服器端傳送一個SYN來建立一個主動開啟,作為三路握手的一部分。客戶端把這段連線的序號設定為隨機數A。
  • 伺服器端應當為一個合法的SYN回送一個SYN/ACK。ACK的確認碼應為A+1,SYN/ACK包本身又有一個隨機序號B。
  • 最後,客戶端再傳送一個ACK。當服務端受到這個ACK的時候,就完成了三路握手,並進入了連線建立狀態。此時包序號被設定為收到的確認號A+1,而響應則為B+1。

TCP狀態編碼

下表為TCP狀態碼列表,以S指代伺服器,C指代客戶端,S&C表示兩者,S/C表示兩者之一:[1]

  • LISTEN S
    等待從任意遠端TCP埠的連線請求。偵聽狀態。
  • SYN-SENT C
    在傳送連線請求後等待匹配的連線請求。通過connect()函式向伺服器發出一個同步(SYNC)訊號後進入此狀態。
  • SYN-RECEIVED S
    已經收到併傳送同步(SYNC)訊號之後等待確認(ACK)請求。
  • ESTABLISHED S&C
    連線已經開啟,收到的資料可以傳送給使用者。資料傳輸步驟的正常情況。此時連線兩端是平等的。
  • FIN-WAIT-1 S&C
    主動關閉端呼叫close()函式發出FIN請求包,表示本方的資料傳送全部結束,等待TCP連線另一端的確認包或FIN請求包。
  • FIN-WAIT-2 S&C
    主動關閉端在FIN-WAIT-1狀態下收到確認包,進入等待遠端TCP的連線終止請求的半關閉狀態。這時可以接收資料,但不再傳送資料。
  • CLOSE-WAIT S&C
    被動關閉端接到FIN後,就發出ACK以回應FIN請求,並進入等待本地使用者的連線終止請求的半關閉狀態。這時可以傳送資料,但不再接收資料。
  • CLOSING S&C
    在發出FIN後,又收到對方發來的FIN後,進入等待對方對連線終止(FIN)的確認(ACK)的狀態。少見。
  • LAST-ACK S&C
    被動關閉端全部資料傳送完成之後,向主動關閉端傳送FIN,進入等待確認包的狀態。
  • TIME-WAIT S/C
    主動關閉端接收到FIN後,就傳送ACK包,等待足夠時間以確保被動關閉端收到了終止請求的確認包。【按照RFC 793,一個連線可以在TIME-WAIT保證最大四分鐘,即最大分段壽命(maximum segment lifetime)的2倍】
  • CLOSED S&C
    完全沒有連線。

基於TCP實現的協議有

  • HTTP/HTTPS,
  • Telnet
  • FTP
  • SMTP

TCP(Transmission Control Protocol)和UDP(User DataGram Protocol)的區別

下面我們主要從連線性(Connectivity)、可靠性(Reliability)、有序性(Ordering)、有界性(Boundary)、擁塞控制(Congestion or Flow control)、傳輸速度(Speed)、量級(Heavy/Light weight)、頭部大小(Header size)等8個方面來對比它們:

  1. TCP是面向連線(Connection oriented)的協議,UDP是無連線(Connection less)協議;
    TCP用三次握手建立連線:1) Client向server傳送SYN;2) Server接收到SYN,回覆Client一個SYN-ACK;3) Client接收到SYN_ACK,回覆Server一個ACK。到此,連線建成。UDP傳送資料前不需要建立連線。
  2. TCP可靠,UDP不可靠;TCP丟包會自動重傳,UDP不會。
  3. TCP有序,UDP無序;訊息在傳輸過程中可能會亂序,後傳送的訊息可能會先到達,TCP會對其進行重排序,UDP不會。
  4. TCP無界,UDP有界;TCP通過位元組流傳輸,UDP中每一個包都是單獨的。
  5. TCP有流量控制(擁塞控制),UDP沒有;主要靠三次握手實現。
  6. TCP傳輸慢,UDP傳輸快;因為TCP需要建立連線、保證可靠性和有序性,所以比較耗時。這就是為什麼視訊流、廣播電視、線上多媒體遊戲等選擇使用UDP。
  7. TCP是重量級的,UDP是輕量級的;TCP要建立連線、保證可靠性和有序性,就會傳輸更多的資訊,如TCP的包頭比較大。
  8. TCP的頭部比UDP大;TCP頭部需要20位元組,UDP頭部只要8個位元組

相關文章