前言:
來源於《計算機網絡自頂向下方法》,這學期在上計網的課程,順路就補一補相關知識,UDP / TCP平時聽得多了,這次跟住這本書來深入瞭解一下吧。
運輸層
首先udp/tcp是運輸層的協議,我們先來了解一下運輸層的概念。
運輸層協議爲不同主機上的應用程序提供邏輯通信功能,通過邏輯功能,運行不同進程的主機好像直接相連,在發送端,運輸層將發送應用程序進程接收到的報文轉換成運輸層分組(運輸層報文段)。實現的方法將應用報文劃分成較小的塊,併爲每塊加上一個運輸層首部以生成運輸層報文段並向目的地發送。在接收端,網絡層從數據包中提取到運輸層報文段,並將該報文段上交給運輸層。運輸層則處理接收到的報文段,使該報文段中的數據爲接受應用進程使用。
運輸層的多路複用與多路分解
從主機之間交付(網絡層ip)到進程之間交付被稱爲運輸層的多路複用和多路分解
運輸層報文段的結構圖:
多路複用: 在源主機從不同套接字中手機數據塊,併爲每一個數據塊封裝上首部信息(這將以後用於分解)從而生成報文段,然後將報文段傳遞到網絡層
多路複用的要求:1.套接字有唯一的標識符 2.每段報文段有特殊字段來指示該報文段要交付到的套接字。如上圖這些特使的字段是源端口號字段和目的端口號字段。
多路分解: 每個運輸層報文段中具有幾個字段,在接收端,運輸層檢查這些字段,標示出接受套接字,進而將報文段定向到該套接字,將運輸層報文段中的數據交付給正確的套接字
在主機上的每一個套接字能夠分配一個端口號,當報文到達主機時,運輸層檢查豹紋中的目的端口號,並將其定向到相應的套接字,然後報文中的數據通過套接字進入所連接的進程
無連接的多路複用和多路分解
基本和運輸層的基本概念無差,因爲udp只做了運輸協議做的最少工作。一個udp套接字由一個二元組全面標識的,該二元組包含一個目的ip地址和一個目的端口號,因此如果兩個udp報文段有不同的源ip地址和或者源端口號,但是有相同的目的ip地址和目的端口號,那麼這兩個報文將通過相同的目的套接字被定向到相同的目的進程
無連接運輸:UDP
定義的udp只做了運輸協議能夠做的最少工作,除了複用、分解功能和少量的差錯檢測外,他幾乎沒有對IP新增別的東西。使用udp時,在發送報文段之前,發送方和接收方的運輸層實體之間沒有握手,so,udp被稱爲是無連接的。
UDP協議特點:
- 無需鏈接建立
tcp鏈接開始數據傳輸之前要經過三次握手,udp則不需要任何準備即可開始進行數據傳輸,因此udp不會引入建立鏈接的時延 - 無連接狀態
因爲無連接,所以不可靠,數據包會丟失,不可靠協議 - 分組首部開銷少
每個tcp報文段都有20字節的首部開銷,而udp只有8字節的開銷 - UDP使用盡最大努力交付,即不保證可靠交付,不需要維持複雜的連接狀態表
- 面向報文的傳輸
面向報文的傳輸方式是應用層交給UDP多長的報文,UDP添加首部後就照樣發送,即一次發送一個報文。因此,應用程序必須選擇合適大小的報文。若報文太長,則IP層需要分片,降低效率。若太短,會是IP太小。UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界。這也就是說,應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。
UDP報文段結構
- 各16bit的源端口和目的端口用來標記發送和接受的應用進程。因爲UDP不需要應答,所以來源端口是可選的,如果來源端口不用,那麼置爲零。
- 報文長度域,用來指定udp報文段中的字節數(首部➕數據),長度最小值爲8byte。
- 首部剩下地16bit是用來對首部和數據部分一起做校驗和(Checksum)
UDP 檢驗和
udp檢驗和提供了差錯檢測功能。到底是如何的一個操作呢?
發送方的udp對報文段中所有的16bit的和進行反碼運算(c此時還沒有檢驗和),即全部16bit相加,溢出的都被回捲,隨後得到一個16bit的檢驗和,在接收方在將所有的16bit加在一起包括檢驗和,如果沒有引入差錯,則接收方顯示的將是1111111111111111 如果有其中一個爲0則出現了差錯。
注意:
1.校驗時,若UDP數據報部分的長度不是偶數個字節,則需要填入一個全0字節,但是次字節和僞首部一樣,是不發送的。
2.如果UDP校驗和校驗出UDP數據報是錯誤的,可以丟棄,也可以交付上層,但是要附上錯誤報告,告訴上層這是錯誤的數據報。