UDP 協議解析 - 1


1. 概述

用戶數據報協議(UDP,User Datagram Protocol)為應用程序提供了一種無需建立連接就可以發送封裝的 IP 數據報的方法。UDP是一種保留消息邊界的簡單的面向數據報的協議。UDP不提供差錯糾正、隊列管理、重復消除、流量控制和擁塞控制,但提供差錯檢測(包含我們在傳輸層中碰到的第一個真實的端到端(end-to-end)校驗和)。這種協議自身提供最小功能,因此使用它的應用程序要做許多關於數據報如何發送和處理的控制工作。想要保證數據被可靠傳遞或正確排序,應用程序必須自己實現這些保護功能。一般來說,每個被應用程序請求的UDP輸出操作只產生一個UDP數據報,從而發送一個IP數據報。而對於面向數據流的傳輸層協議(例如TCP),應用程序寫入的全部數據與真正在單個IP數據報里傳送的或接收方接收的內容可能沒有聯系。

2. UDP 的主要特點

1). UDP 是無連接的,即發送數據之前不需要建立連接,因此減少了開銷和發送數據之前的時延。
2). UDP 使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復雜的連接狀態表。
3). UDP 是面向報文的。發送方的UDP對應用程序交下來的報文,在添加首部后就向下交付IP層。UDP對應用層交下來的報文,既不合並,也不拆分,而是保留這些報文的邊界。因此,應用程序必須選擇合適大小的報文。
4). UDP 沒有擁塞控制,因此網絡出現的擁塞不會使源主機的發送速率降低。很多的實時應用(如IP電話、實時視頻會議等)要去源主機以恆定的速率發送數據,並且允許在網絡發生擁塞時丟失一些數據,但卻不允許數據有太多的時延。UDP正好符合這種要求。
5). UDP 支持一對一、一對多、多對一和多對多的交互通信
6). UDP 的首部開銷小,只有8個字節,比TCP的20個字節的首部要短。

雖然某些實時應用需要使用沒有擁塞控制的UDP,但當很多的源主機同時都向網絡發送高速率的實時視頻流時,網絡就有可能發生擁塞,結果大家都無法正常接收。因此,不使用擁塞控制功能的UDP有可能會引起網絡產生嚴重的擁塞問題。
還有一些使用UDP的實時應用,需要對UDP的不可靠的傳輸進行適當的改進,以減少數據的丟失。在這種情況下,應用進程本身可以在不影響應用的實時性的前提下,增加些提高可靠性的措施,如采用前向糾錯重傳已丟失的報文

3. UDP 的首部格式

UDP有兩個字段:數據字段和首部字段。首部字段很簡單,只有8個字節,由4個字段組成,每個字段的長度都是兩個字節。各字段意義如下:

  1. 源端口:源端口號。在需要對方回信時選用。不需要時可用全0。
  2. 目的端口:目的端口號。這在終點交付報文時必須要使用到。
  3. 長度: UDP用戶數據報的長度,其最小值是8(僅有首部),發送一個帶0字節數據的UDP數據報是允許的。值得注意的是,UDP長度字段是冗余的;IPV4頭部包含了數據報的總長度,同時IPV6頭部包含了負載長度。因此,一個UDP/IPV4數據報的長度等於IPV4數據報的總長度減去IPV4頭部的長度。一個UDP/IPV6數據報的長度等於包含在IPV6頭部中的負載長度(payload length)字段的值減去所有擴展頭部(除非使用了超長數據報)的長度。這兩種情況下,UDP長度字段應該與從IP層提供的信息計算得到的長度是一致的。
  4. 校驗和:檢測UDP用戶數據報在傳輸中是否有錯。有錯就丟棄。

當運輸層從 IP 層收到 UDP 數據報時,根據目的端口,通過相應的端口上交給應用進程。

如果接收方 UDP發現報文中的目的端口號不正確(即不存在對應於該端口號的應用進程),就丟棄該報文,並由網際控制報文協議 ICMP 發送“端口不可達”差錯報文給發送方。
請注意,雖然在 UDP 之間的通信要用到其端口號,但由於 UDP 的通信是無連接的,因此不需要使用套接字(TCP 之間的通信必須要在兩個套接字之間建立連接)。

3. UDP 校驗和

UDP 校驗和是一個端到端的傳輸層校驗和,是對包含了IP頭部中的源(Source)和目的IP地址(Destination Address)字段的 UDP 偽首部計算得到的。它由初始的發送方計算得到,由最終的目的方校驗。它在傳輸中不會被修改(除非它通過一個NAT)。IPV4 頭部中的校驗和只覆蓋整個頭部(即它不覆蓋IP分組中的任何數據),它在每個IP跳都要被重新計算(因為IPV4 TTL字段的值在數據報轉發時會被路由器減少)。傳輸協議(如 TCP、UDP)使用校驗和來覆蓋它們的頭部和數據。對於 UDP 來說,校驗和是可選的,而其他的則是強制的。當 UDP 在IPV6中使用時,校驗和的計算與使用是強制的,因為在IP層沒有頭部校驗和。為了給應用程序提供無差錯數據,像UDP這樣的傳輸層協議,在投遞數據到接收方應用程序之前,必須計算校驗和或者使用其他差錯監測機制。

3.1 偽首部

在UDP偽首部中,包含32位源IP地址,32位目的IP地址,8位填充0,8位協議,16位UDP長度。偽首部並非TCP&UDP數據報中實際的有效成分。偽首部是一個虛擬的數據結構,其中的信息是從數據報所在IP分組頭的分組頭中提取的,既不向下傳送也不向上遞交,而僅僅是為計算校驗和。
偽頭部的目的是讓UDP層驗證數據是否已經到達正確的目的地(即,該IP沒有接受地址錯誤的數據報,也沒有給UDP一個本該其他傳輸協議的數據報),計算UDP校驗和時覆蓋的字段,包含了偽頭部以及UDP頭部和負載。

3.2 UDP 校驗和計算方法

UDP計算校驗和的方法和計算IP數據報首部校驗和的方法相似。但不同的是:IP數據報的校驗和只檢驗IP數據報的首部,但UDP的校驗和是將首部和數據部分一起都檢驗
在發送方,首先是將全零放入檢驗和字段。再將偽首部以及UDP用戶數據報看是由許多16位的字串接起來。若UDP用戶數據報的數據部分不是偶數個字節,則要填入一個全零字節(最后一個奇數字節應是16位數的高字節而低字節填0,此字節不發送)。 然后按二進制反碼計算出這些16位字的和。 將此和的二進制反碼寫入校驗和字段后,發送此UDP用戶數據報。
在接收方,把收到的UDP用戶數據報連同偽首部(以及可能的填充全零字節)一起,按二進制反碼求這些16位字的和。當無差錯時其結果應全為1。否則就表明有差錯出現,接收方就丟棄此UDP用戶數據報(也可以上交給應用層,但附上出現了差錯的警告)。如果校驗和字段值為0x0000表示發送方沒有計算校驗和。

如上圖所示,偽首部的第3字段是全零;第4字段是IP首部中的協議字段的值。對於UDP,此協議字段值為17;第5字段是UDP用戶數據報的長度。因此,這樣的檢驗和,既檢查了UDP用戶數據報的源端口和目的端口以及UDP用戶數據報的數據部分,又檢查了IP數據報的源IP地址和目的地址。注意,UDP數據報的長度在校驗和的計算中出現了兩次。

計算原理是二進制反碼求和運算,具體來說就是:

0 + 0 = 0
1 + 0 = 0 + 1 = 1
1 + 1 = 10

如果最高位有進位,就把進位的1取下來與最低位再做一次二進制加法
示例:

圖3-2-1 中二進制反碼求和的參考代碼:

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAX_NUM = 65536; // 2^16 = 1 0000 0000 0000 0000
int a[15] = {153*256+19,8*256+104,171*256+3,14*256+11,17,15,1087,13,15,21573,21332,18766,18176};
// 256 = 2^8 = 1 0000 0000
int main()
{
    int sum = 0;
    for(int i=0;i<13;i++){
		sum += a[i];
		if(sum > MAX_NUM){
			sum = sum % MAX_NUM + 1;
		}
    }
	printf("%d\n",sum);
    
    return 0;
}

注意:UDP協議(傳輸層)直接操作IP(網絡層)的比特,會導致所謂的“違反分層”(layering violation)規則。但這只對協議實現產生微小的影響,因為一般來說,當數據傳遞到(或來自於)UDP時,IP層的信息已經是現成的了。相比之下,更應該關注NAT,特別是當UDP數據報被分片時。

盡管UDP數據報校驗和在原始UDP規范中是可選的,目前它們還是被要求在主機中默認使用[RFC1122]。在20世紀80年代,一些計算機供應商默認關閉了UDP校驗和功能以加速其Sun網絡文件系統(NFS)的實現,該網絡文件系統使用了UDP。因為有第2層的CRC保護(這要比互聯網校驗和更強壯),在許多情況下這可能不會產生問題,然而默認關閉校驗和功能被認為是一種不好的方法(也是違反RFC規范的)。早期的互聯網經驗表明,當數據報通過路由器時,總會存在有軟件和硬件漏洞的路由器在轉發數據報時會修改其中的比特。如果端到端的UDP校驗和被關閉的話,這些UDP數據報中的錯誤就無法檢測到。同時注意到一些更老的數據鏈路協議(比如,串行線IP或SLIP)沒有任何形式的數據鏈路校驗和,因此存在IP分組被修改而檢測不到的可能性,除非引入另一種校驗和。
考慮到偽頭部這樣的結構,可以很清楚地看到,當一個UDP/IPv4數據報穿過一個NAT時,不僅IP層頭部的校驗和要被修改,而且UDP偽頭部的校驗和也必須被正確地修改,因為IP層的地址和/或UDP層的端日號可能會改變。因此NAT通常因同時修玫分組中協議的多層而違反分層規則。當然,考慮到偽頭部本身就是違反分層規則的, NAT沒有選擇。UDP流量被NAT處理時的一些特定規則由[RFC4784]給出。

[參考文獻]

  1. 《TCP/IP 詳解卷1:第2版》
  2. 《計算機網絡》 謝希仁.
  3. 百度百科 偽頭部
  4. IP,UDP,TCP校驗和有什么區別 http://www.lianhekj.com/question/328086705.html
  5. 二進制反碼求和運算 https://www.cnblogs.com/jcchan/p/10400504.html
  6. UDP檢驗和中的二進制反碼運算 https://blog.csdn.net/weixin_43790264/article/details/92847622


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM