1. 程式人生 > 實用技巧 >03-傳輸層(2)

03-傳輸層(2)

UDP 概述

  • UDP 只在 IP 的資料報服務之上增加了很少一點的功能
    • 複用和分用的功能
    • 差錯檢測的功能
  • 主要特點
    • UDP 是無連線的,傳送資料之前不需要建立連線,因此減少了開銷和傳送資料之前的時延
    • UDP 使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持複雜的連線狀態表
    • UDP 是面向報文的
    • UDP 沒有擁塞控制,因此網路出現的擁塞不會使源主機的傳送速率降低,這對某些實時應用是很重要的。很多的實時應用(如IP電話、實時視訊會議等)要求源主機以恆定的速率傳送資料,並且允許在網路上發生擁塞時丟失一些資料,但不允許資料有太大的時延
    • UDP 支援一對一、一對多、多對一和多對多的互動通訊
    • UDP 的首部開銷小,只有 8 個位元組,比 TCP 的 20 個位元組的首部要短

UDP 首部格式

使用者資料報 UDP 有兩個欄位:資料欄位 和 首部欄位

  • 首部欄位有 8 個位元組,由 4 個欄位組成,每個欄位都是 2 個位元組
  • 首部中的檢驗和的計算方法有些特殊
    • 在計算檢驗和時,要在 UDP 使用者資料報之前新增12個位元組的 [偽首部]
    • 臨時把 [偽首部] 新增在 UDP 使用者資料報前面,得到一個 {臨時的 UDP 資料報}
    • 檢驗和就是按照這個 {臨時的 UDP 使用者資料報} 來計算的。[偽首部] 既不向下傳送也不向上提交,而僅僅是為了計算檢驗和

UDP 基於埠的分用

如果接收方 UDP 發現收到的報文中的目的埠號不正確(即不存在對應於該埠號的應用程序),就丟棄該報文,並由網際控制報文協議 ICMP 傳送"埠不可達"差錯報文給傳送方。

TCP 概述

特點

  • TCP 是面向連線的運輸層協議
    • 應用程式在使用 TCP 協議之前,必須先建立 TCP 連線
    • 在傳送資料完畢後,必須釋放已經建立的 TCP 連線
    • 也就是說,應用程式之間的通訊好像在"打電話":通話之前要撥號建立連線,通話結束後要掛機釋放連線
  • 每一條 TCP 連線只能有兩個端點 (endpoint),每一條 TCP 連線只能是點對點的(一對一)
  • TCP 提供可靠交付的服務,通過 TCP 連線傳送的資料,無差錯、不丟失、不重複,並且還能做到按序到達
  • TCP 提供全雙工通訊
  • 面向位元組流

面向位元組流

  • TCP - 流:流入或流出程序的位元組序列
  • "面向位元組流"的含義:雖然應用程式和 TCP 的互動是一次一個資料塊,但 TCP 把應用程式交下來的資料看成僅僅是一連串無結構的位元組流。TCP 並不知道所傳送的位元組流的含義
  • TCP 不保證 {接收方應用程式所收到的資料塊} 和 {傳送方應用程式所發出的資料塊} 具有對應大小的關係
    • TCP 傳送的報文段大小與應用程序傳送到 TCP 快取中的資料塊大小無關,並不是資料塊多大,TCP 報文裡就一次放多少,組裝報文的過程和資料塊大小無關係
    • 讀的時候同理,都在接收端的 TCP 快取裡,它一次往上扔幾個和收到的報文大小無關
  • 但接收方應用程式收到的位元組流必須和傳送方應用程式發出的位元組流完全一樣
  • 圖中指出,TCP 和 UDP 在傳送報文時所採用的方式完全不同。TCP 並不關心應用程序一次把多長的報文傳送到 TCP 快取中,而是根據對方給出的 [視窗值] 和 {當前網路擁堵的程度} 來決定一個報文段應包含多少個位元組(UDP 傳送的報文長度是應用程式給出的)
    • 如果應用程序傳送到 TCP 快取的資料塊太長,TCP 就可以把它劃分短一些再發送
    • 如果應用程序一次只發來一個位元組,TCP 也可以等待積累有足夠多的位元組後再構成報文段傳送出去

TCP 的連線

  • TCP 把 [連線] 作為 最基本的抽象
  • 每一條 TCP 連線有兩個端點
    • TCP 連線的端點不是主機,不是主機的IP地址,不是應用程序,也不是運輸層的協議埠
    • {TCP 連線的端點} 叫做 [套接字 (socket)] 或插口
  • 埠號拼接到 IP 地址 即構成了 [套接字]:Socket = IP:port
  • 每一條 TCP 連線唯一地被通訊兩端的兩個端點(即兩個套接字)所確定
  • TCP連線、IP地址、套接字
    • TCP 連線就是由協議軟體所提供的一種抽象
    • TCP 連線的端點是個很抽象的套接字,即(IP 地址:埠號)
    • 同一個 IP 地址可以有多個不同的 TCP 連線
    • 同一個埠號也可以出現在多個不同的 TCP 連線中

關於TCP的主要問題

  1. 如何實現可靠傳輸?
  2. 如何實現流量控制?
  3. 如何處理網路堵塞?