貴州網(wǎng)站建設(shè)公司網(wǎng)絡(luò)營銷專業(yè)的就業(yè)方向
UDP的詳細(xì)解析
文章目錄
- UDP的詳細(xì)解析
- UDP 概述
- UDP的首部格式
- 檢驗和的計算
- 抓包測試
- 參考
TCP/IP運輸層的兩個主要協(xié)議都是互聯(lián)網(wǎng)的正式標(biāo)準(zhǔn),即:
- 用戶數(shù)據(jù)報協(xié)議UDP (User Datagram Protocol)
- 傳輸控制協(xié)議TCP (Transmission Control Protocol)
按照OSI的術(shù)語,兩個對等運輸實體在通信時傳送的數(shù)據(jù)單位叫做運輸協(xié)議數(shù)據(jù)單元 TPDU.但在TCP/IP體系中,根據(jù)所使用的協(xié)議是TCP或UDP,分別稱之為TCP報文段或UDP用戶數(shù)據(jù)報。
UDP在傳送數(shù)據(jù)之前不需要先建立連接。遠(yuǎn)地主機的運輸層在收到UDP報文后,不需要給出任何確認(rèn)。雖然UDP不提供可靠交付,但在某些情況下UDP卻是一種最有效的工作方式。
下表為一些應(yīng)用和應(yīng)用層協(xié)議主要使用的運輸層協(xié)議。
應(yīng)用 | 應(yīng)用層協(xié)議 | 運輸層協(xié)議 |
---|---|---|
名字轉(zhuǎn)換 | DNS(域名系統(tǒng)) | UDP |
文件傳送 | TDTP(簡單文件傳送協(xié)議) | UDP |
路由選擇協(xié)議 | RIP(路由選擇協(xié)議) | UDP |
IP地址配置 | DHCP(動態(tài)主機配置協(xié)議) | UDP |
網(wǎng)絡(luò)管理 | SNMP(簡單網(wǎng)絡(luò)管理協(xié)議) | UDP |
遠(yuǎn)程文件服務(wù) | NFS(網(wǎng)絡(luò)文件系統(tǒng)) | UDP |
IP電話 | 專用協(xié)議 | UDP |
流式多媒體通信 | 專用協(xié)議 | UDP |
多播 | IGMP(網(wǎng)際組管理協(xié)議) | UDP |
電子郵件 | SMTP(簡單郵件傳送協(xié)議) | TCP |
遠(yuǎn)程終端接入 | TELNET(遠(yuǎn)程終端協(xié)議) | TCP |
萬維網(wǎng) | HTTP(超文本傳送協(xié)議) | TCP |
文件傳送 | FTP(文件傳送協(xié)議) | TCP |
UDP 概述
用戶數(shù)據(jù)報協(xié)議UDP只在IP的數(shù)據(jù)服務(wù)之上加了很少一點功能,這就是復(fù)用和分用的功能以及差錯檢測的功能。UDP的主要特點是:
-
UDP是無連接的,即數(shù)據(jù)發(fā)送之前不需要建立連接
-
UDP使用盡最大努力交付,即不保證可靠交付,因此主機不需要維持復(fù)雜的連接狀態(tài)表。
-
UDP是面向報文的。UDP對應(yīng)用層交下來的報文,既不合并,也不拆分,而是保留這些報文的邊界。這就是說應(yīng)用層交給UDP多長的報文,UDP就照樣發(fā)送,UDP一次交付一個完整的報文。若報文太長,UDP把它交給IP層后,IP層在傳送時可能要進行分片。
-
UDP沒有擁塞控制 網(wǎng)絡(luò)出現(xiàn)擁塞不會使源主機的發(fā)送速率降低。這對某些實時應(yīng)用使很重要的。
-
UDP 支持一對一、一對多、多對一和多對多的交互通信
-
UDP 的首部開銷小,只有8個字節(jié),比TCP的20個字節(jié)的首部要短。
UDP的首部格式
用戶數(shù)據(jù)報UDP有兩個字段:數(shù)據(jù)字段和首部i段。首部字段只有8個字節(jié),由四個字段組成,每個字段的長度都是兩個字節(jié)。
- 源端口 源端口號。在需要對方回信時選用。不需要時可用全0
- 目的端口 目的端口號。這在終點交付報文時必須使用
- 長度 UDP 用戶數(shù)據(jù)報的長度,其最小值時8(僅有首部)
- 檢驗和 檢測UDP用戶數(shù)據(jù)報在傳輸中是否有錯。有錯就丟棄。
當(dāng)接收方UDP發(fā)現(xiàn)收到的報文中的目的端口號不正確(即不存在對應(yīng)于該端口號的應(yīng)用進程),就丟棄該報文,并由網(wǎng)際控制報文協(xié)議ICMP發(fā)送“端口不可達”差錯報文給發(fā)送方。
檢驗和的計算
UDP用戶數(shù)據(jù)報首部中檢驗和的計算方法有些特殊。在計算檢驗和時要在UDP用戶數(shù)據(jù)報之前加12個字節(jié)的偽首部。偽首部既不向下傳送也不向上遞交,而僅僅是為了計算檢驗和。通過上面那幅圖我們可以看到偽首部中的字段信息:
- 32位源IP地址
- 32位目的IP地址
- 8位保留字節(jié)(置0)
- 8位傳輸層協(xié)議號(TCP是6,UDP是17)
- 16位報文長度(首部+數(shù)據(jù))
檢驗和是如何工作的,我們可以通過觀察下圖:
我們對應(yīng)著上面這副圖看,其實計算這個檢驗和的過程其實就是,將加上偽首部后的數(shù)據(jù)按照每16位相加求和。將求和后的結(jié)果取反與UDP自帶的檢驗和相與,若得到的結(jié)果是全1的則說明數(shù)據(jù)傳輸無誤。(剛好這里的檢驗和在UDP是以2字節(jié)存儲的,剛好是12位)。
若在求16位求和結(jié)果時發(fā)生進位,那么需要進行回卷。計算的過程可以參考這篇 回卷計算。
讀到這里不知道大家會不會有問題,就是為什么UDP在計算檢驗和的時候需要加上偽首部。
對于這個問題最簡單的回答就是:出于歷史原因。如下圖David P. Reed的解釋:
前面這個不好翻譯,在StackOverflow中找到了一個相關(guān)的解答:
抓包測試
UDP有著很廣泛的應(yīng)用場景。它的特點就像上面看到的很簡單,沒有流量控制以及差錯重傳等特點,作為傳輸層的協(xié)議常常被拿來和tcp協(xié)議比較。所以廣泛應(yīng)用于qq聊天,視頻,網(wǎng)絡(luò)電視,迅雷等場景。缺點就是容易丟包。
我拿qq聊天來抓個UDP數(shù)據(jù)包試試。
首先通過終端查看本機的ip地址和物理地址:
我們首先打開抓包工具然后,用qq給自己的Android手機發(fā)送聊天,可以發(fā)現(xiàn)抓包工具成功捕獲信息,如下圖。
我們查看一下第二條記錄中的詳細(xì)信息
現(xiàn)在我們再去看看所有qq是否有占用52652這個端口。用netstat -ano
列出所有占用的端口號,同時用任務(wù)管理器查看qq的PID。查看的結(jié)果如下圖,發(fā)現(xiàn)52652這個端口確實被qq所占用。
參考
-
UDP 檢驗和原理
-
為什么校驗時要加上IP信息的偽首部
-
UDP/TCP 中使用偽標(biāo)頭的意義是什么
-
《計算機網(wǎng)絡(luò) 第7版》