TCP/IP-UDP

來源:互聯網
上載者:User

標籤:

  We read the world wrong but say that it deceives us.

  "我們看錯了世界,卻說世界欺騙了我們"

 

參考資料:TCP/IP入門經典 (第五版)

        TCP/IP詳解 卷一:協議

 

一、簡介

  UDP(使用者資料包通訊協定),是一個簡單的面向資料報的傳輸層協議,進程的每個輸出操作都正好產生一個UDP資料報,並組裝成一份待發送的IP資料報。它在協議棧中的位置如下

 

  特點:UDP是一個面向資料報的協議,所以它不提供可靠性:它把應用程式傳給IP層的資料發送出去,但並不保證它們能到達目的地

 

二、UDP首部

  由於不提供可靠性,所以UDP的首部比較簡單

 

  各欄位含義如下:

  ● 連接埠號碼:就是傳輸層識別應用程式的一個正整數

  ● 16位UDP長度:UDP長度指的是UDP首部和UDP資料的總長度。注意,UDP長度的最小值為8位元組,也就是說可以發送一個沒有資料的UDP資料報。記得在 TCP/IP協議-IP協議 中說到IP首部中有一個首部長度,那麼用IP資料報的總長減去IP首部的長度就可以得到UDP資料報的長度了

  ● 16位UDP檢驗和:關於檢驗和,要特別留意幾點。

  首先,UDP的檢驗和覆蓋了UDP首部和UDP資料,而IP首部的檢驗和只覆蓋了IP首部;其次,UDP的檢驗和是可選的,而TCP的檢驗和是必須的;UDP資料報的長度可以是奇數位元組,所以在計算時要在末尾填充0,但是這些0可能不被傳送;UDP檢驗和的計算方法與IP首部的檢驗和一樣(16個bit的二進位反碼求和)

  最後,UDP在計算檢驗和的時候包含了一個12位元組長的偽首部,它僅僅是為了計算檢驗和而設定。UDP檢驗和計算過程中使用的各個欄位如下

 

  如果檢驗和的計算結果為0,則存入的值全為1。如果傳送的檢驗和為0,說明發送端沒有計算檢驗和。這樣,如果接收端計算的檢驗和不為全0,但是檢驗和欄位為全0的話,說明傳送過程中出錯了,UDP資料報將會被丟棄,並且不產生任何差錯報文

  雖然UDP檢驗和是可選的,但是它們應該總是在用,畢竟還是要確報資料轉送的正確性

 

三、IP分區和重組

  為什麼要在這裡討論IP分區呢?前面講到UDP是不提供傳輸的可靠性的,但是至少要保證資料能完整的傳輸,所以只能把這個責任留給IP。下面先來瞭解幾個概念

  最大UDP資料報長度

  IP資料報的最大長度為65535個位元組,去掉IP首部的20個位元組和UDP首部的8個位元組,UDP資料報的最大長度理論上應該為65507位元組。但事實上,大多數實現都達不到這個長度,原因有下:

   ● 應用程式介面限制:socket API提供了一個可供應用程式調用的函數,用來設定接收和發送緩衝的長度,大部分系統都預設提供了可讀寫大於8192位元組的UDP資料報。

   ● 核心實現:可能存在一些實現特性(或差錯),使IP資料報長度小於65535

  雖然IP可以發送那麼長的資料報,但應用程式並不保證能夠讀取該長度的資料。因此,UDP編程介面允許應用程式設定能處理的最大長度。當資料報長度超出應用程式能處理的最大長度時,不同的API有著不同的處理策略,這就要求發送端控制資料報的大小

  路徑MTU

  MTU(傳輸單元最大值),指的是資料連結層對傳輸的資料幀長度的一個上限值,不同的網路類型有著不同的值。而路徑MTU指的是兩台通訊主機路徑中最小的MTU。兩台主機之間的路徑MTU不一定是一個常數,因為路由選擇並不一定是對稱的,而且網路隨時都在發生變化

  ICMP

  ICMP(Internet控制報文協議),是一個位於網路層的協議。它經常被認為是IP層的一個組成部分,因為ICMP的主要功能是傳遞差錯報文及其他需要注意的資訊,並且ICMP報文是封裝在IP資料報內部的

  常見的幾種差錯報文:

    ● 連接埠不可達:如果接收端收到一份UDP資料報而目的連接埠與某個正在使用的進程不相符,那麼UDP返回一個ICMP不可達報文

    ● 分區衝突不可達:當路由器收到一份需要分區的資料報,而在IP首部又設定了不分區的標誌位,那麼路由器返回一個ICMP不可達報文。並且,此時可以把這條路徑的路徑MTU返回給源主機或路由器,這樣就可以協助這條路徑上的其他路由器確定每個子路徑上的MTU,這被稱作路徑MTU發現機制

    ● 來源站點抑制:當一個系統(路由器或主機)接收資料報的速度比其處理速度快時,它有可能會返回一個來源站點抑制差錯報文。由於來源站點抑制需要消耗頻寬,並且實際上沒有什麼作用,所以人們並不支援產生來源站點抑制報文

  IP分區

  前面已經講過,資料連結層一般要限制每次發送資料幀的最大長度(MTU)。任何時候IP層接收到一份要發送的IP資料報時,它要判斷向本地哪個介面發送資料(選路),並查詢介面獲得MTU,如果資料報長度大於MTU,那就需要進行分區。分區可以發生在原始發送端主機上,也可以發生在中間路由器上。

  在介紹IP首部欄位的時候,談到IP首部的“第二行”有三個欄位:16位標識、3位標誌和13位片位移,它們就是被用在IP分區過程中。對於發送端發送的每份IP資料報來說,其識別欄位都包含一個唯一值,在資料報分區時被複製到每個片中,表明它們是來自同一個資料報。標誌欄位用其中一個bit來表示“更多的片”,把該位置1表示這個還有其他分區,所以最後一片要把該位置0。片位移欄位指的是該片位移未經處理資料報開始處的位置。另外,分區以後,每個片的總長度值要改為該片的長度值。標誌欄位中有一個bit稱作“不分區”位,如果將這個置1,IP將不對資料報進行分區。如果此時導致資料報不能發送,那麼將會返回一個ICMP不可達差錯報文(分區衝突)

  分區之後,每一片都成為一個分組,這裡的分組指的是網路層到資料連結層之間的傳輸單元,而IP資料報是指IP層端到端的傳輸單元。每個分組都有自己的IP首部

  需要注意是:

    ● 在分區時,除最後一個片外,其他每一個片中的資料部分(除IP首部外的其餘部分)必須是8位元組的整數倍(暫時沒搞清楚為什麼,個人猜測是為了方便計算片位移,還有接收端的重組)

    ● 任何傳輸層首部只出現在第一片資料中

    ● 分區可能發生在源主機或者路徑上的路由器,但重組只可能發生在目的主機上。因為路徑上的路由器只負責轉寄,並不關心IP資料報的資料內容

    ● 即使只丟失了一片資料也需要重新傳整個資料報,因為上一點,中間路由器可能再次分區,而目的端並不知道丟失的片是被如何分區的

    ● 各個片到達目的端時可能是亂序的,但是IP首部利用前面講的三個欄位,可以將分區正確地拼接起來

  下面來完整描述一個IP資料報的傳輸過程作為總結,假設待發送的傳輸層資料報需要進行分區,並且發送端和接收端不是直接相連:

   ①源主機的傳輸層將資料報發送到網路層;

  分區:②

   ②IP探索資料報太大,需要分區,就將資料報分區:第一片包含了資料報的開頭部分資料,資料大小為8位元組的整數倍,包含了傳輸層首部,並將標誌欄位中表示“更多的片”欄位置1,片位移欄位置0,然後把總長度值改為分區以後的片長度值;第二片到倒數第二片包含了某個長度的資料,並且資料大小為8位元組的整數倍,但是它們都沒有包含傳輸層首部,它們的“更多的片”欄位置為1,片位移欄位根據片序號和前一片的資料長度設定,總長度設定同第一片;最後一片包含了剩餘的資料部分,資料長度不一定是8位元組的整數倍,沒有包含傳輸層首部,“更多的片”欄位被置0,片位移欄位根據前面的資料長度設定,總長度值也根據前面的片進行設定;所有片的識別欄位都相同

   ③網路層把每一個片作為一個分組傳送給資料連結層;

  傳輸:④~⑥

   ④資料連結層將分組轉化為資料幀發送給下一個系統(路由器或者主機);

   ⑤接收到資料幀的路由器向上傳送至網路層;

   ⑥IP檢查資料報長度和MTU,如果需要分區,就跳到第②步;如果不需要分區,就跳到第④步,直到發送到目的主機;

  重組:⑦

   ⑦目的主機陸續收到各個片,如果目的主機發現缺失了某個片,那麼將會返回一個ICMP錯誤判文,源主機將會重新發送資料報,回到第①步;如果沒有片缺失,目的主機將會根據識別欄位、標誌欄位和片位移將所有片重組為傳輸層資料報,傳輸層發送給應用程式,資料轉送完成

  關於IP分區重組的實現,可以參考 Linux TCP/IP協議棧關於IP分區重組的實現

 

 

四、UDP伺服器設計

  最後來討論一下UDP那些影響使用該協議的伺服器的設計和實現方面的協議特性

  客戶IP地址及連接埠號碼

  UDP伺服器必須儲存來自客戶資料報的源IP地址和源連接埠號碼,這個特性允許一個互動UDP伺服器對多個客戶進行處理

  目的IP地址

  某些應用程式需要知道資料報是發送給誰的,即目的IP地址

  UDP輸入隊列

  大多數UDP伺服器是重複型伺服器,單個伺服器處理序對單個UDP連接埠上的所有客戶請求進行處理。所以必須維護一個輸入隊列來對差不多同時到達的請求進行處理

  限制本地IP地址

  大多數UDP伺服器在建立UDP端點是都使其IP地址具有萬用字元的特點,這樣可以從任何的本地介面來接收使用者請求

  限制遠端IP地址

  限制遠端IP地址和連接埠號碼可以只接收特定地址的UDP資料報

  每個連接埠有多個接收者

  當UDP資料報到達目的IP地址為廣播或多播地址,而且在目的IP地址和連接埠號碼處有多個端點時,就向每個端點傳送一份資料報的複製。如果UDP資料報到達的是一個單播地址,那麼只向其中一個端點傳送一份資料報的複製

 

總結:UDP是一個簡單的協議,本文大部分篇幅都用在介紹IP分區的內容,等到介紹TCP的時候,再討論UDP與TCP之間的區別和聯絡

TCP/IP-UDP

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.