UDP

UDP 和 TCP 的不同

TCP 在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接。

TCP 不提供廣播或多播服務(wù),由于 TCP 要提供可靠的、面向連接的運(yùn)輸服務(wù),因此不可避免地增加了許多的開銷,如確認(rèn)、流量控制、計(jì)時器以及連接管理等。

而 UDP 在傳送數(shù)據(jù)之前不需要先建立連接。接收方收到 UDP 報(bào)文之后,不需要給出任何確認(rèn)。

雖然 UDP 不提供可靠交付,但在某些情況下 UDP 卻是一種最有效的工作方式。

簡單來說就是:

UDP:單個數(shù)據(jù)報(bào),不用建立連接,簡單,不可靠,會丟包,會亂序;

TCP:流式,需要建立連接,復(fù)雜,可靠 ,有序。

UDP 概述

UDP 全稱 User Datagram Protocol, 與 TCP 同是在網(wǎng)絡(luò)模型中的傳輸層的協(xié)議。

UDP 的主要特點(diǎn)是:

無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接,因此減少了開銷和發(fā)送數(shù)據(jù)之前的時延。

不保證可靠交付,因此主機(jī)不需要為此復(fù)雜的連接狀態(tài)表

面向報(bào)文的,意思是 UDP 對應(yīng)用層交下來的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界,在添加首部后向下交給 IP 層。

沒有阻塞控制,因此網(wǎng)絡(luò)出現(xiàn)的擁塞不會使發(fā)送方的發(fā)送速率降低。

支持一對一、一對多、多對一和多對多的交互通信,也即是提供廣播和多播的功能。

首部開銷小,首部只有 8 個字節(jié),分為四部分。

UDP 的常用場景:

名字轉(zhuǎn)換(DNS)

文件傳送(TFTP)

路由選擇協(xié)議(RIP)

IP 地址配置(BOOTP,DHTP)

網(wǎng)絡(luò)管理(SNMP)

遠(yuǎn)程文件服務(wù)(NFS)

IP 電話

流式多媒體通信

UDP 報(bào)文結(jié)構(gòu)

UDP 數(shù)據(jù)報(bào)分為數(shù)據(jù)字段和首部字段。

首部字段只有 8 個字節(jié),由四個字段組成,每個字段的長度是 2 個字節(jié)。

首部各字段意義

源端口:源端口號,在需要對方回信時選用,不需要時可全 0.

目的端口:目的端口號,在終點(diǎn)交付報(bào)文時必須要使用到。

長度:UDP 用戶數(shù)據(jù)報(bào)的長度,在只有首部的情況,其最小值是 8 。

檢驗(yàn)和:檢測 UDP 用戶數(shù)據(jù)報(bào)在傳輸中是否有錯,有錯就丟棄。

UDP 如何進(jìn)行校驗(yàn)和

偽首部

UDP 數(shù)據(jù)報(bào)首部中檢驗(yàn)和的計(jì)算方法比較特殊。

在計(jì)算檢驗(yàn)和時,要在數(shù)據(jù)報(bào)之前增加 12 個字節(jié)的偽首部,用來計(jì)算校驗(yàn)和。

偽首部并不是數(shù)據(jù)報(bào)真正的首部,是為了計(jì)算校驗(yàn)和而臨時添加在數(shù)據(jù)報(bào)前面的,在真正傳輸?shù)臅r候并不會把偽首部一并發(fā)送。

偽首部個字段意義

第一字段,源 IP 地址

第二字段,目的 IP 地址

第三字段,字段全 0

第四字段,IP 首部中的協(xié)議字段的值,對于 UDP,此字段值為 17

第五字段,UDP 用戶數(shù)據(jù)報(bào)的長度

校驗(yàn)和計(jì)算方法

校驗(yàn)和的計(jì)算中,頻繁用到了二進(jìn)制的反碼求和運(yùn)算,運(yùn)算規(guī)則見下:

二進(jìn)制反碼求和運(yùn)算

0 + 0 = 0

1 + 0 = 0 + 1 = 1

1 + 1 = 10

其中 10 中的 1 加到了下一列去,如果是最高列的 1 + 1 ,那么得到的 10 留下 0 , 1 移到最低列,與最低位再做一次二進(jìn)制加法即可。

檢驗(yàn)和計(jì)算過程

把首部的檢驗(yàn)和字段設(shè)置為全 0

把偽首部以及數(shù)據(jù)段看成是許多 16 位的字串接起來。

若數(shù)據(jù)段不是偶數(shù)個字節(jié),則填充一個全 0 字節(jié),但是這個字節(jié)不發(fā)送。

通過二進(jìn)制反碼運(yùn)算,計(jì)算出 16 位字的和。

讓第一行和第二行做二進(jìn)制反碼運(yùn)算。

將第一行和第二行的結(jié)果與第三行做二進(jìn)制反碼計(jì)算,以此類推。

最后運(yùn)算結(jié)果取反,得到校驗(yàn)和。

把計(jì)算出來的校驗(yàn)和值,填入首部校驗(yàn)和字段。

接收方收到數(shù)據(jù)報(bào)之后,按照同樣的方法計(jì)算校驗(yàn)和,如果有差錯,則丟棄這個數(shù)據(jù)報(bào)。

可以看出校驗(yàn)和,既檢查了 UDP 用戶數(shù)據(jù)報(bào)的源端口號和目的端口號以及數(shù)據(jù)報(bào)的數(shù)據(jù)部分,又檢查了 IP 數(shù)據(jù)報(bào)的源 IP 地址和目的地址。

一個校驗(yàn)和例子假設(shè)一個 UDP 數(shù)據(jù)報(bào):

各字段以二進(jìn)制表示:

1001 1001 0001 0011 //偽首部源IP地址前16位,值:153.19

0000 1000 0110 1000 //偽首部源IP地址后16位,值:8.104

1010 1011 0000 0011 //偽首部目的IP地址前16位,值:171.3

0000 1110 0000 1011 //偽首部目的IP地址后16位,值:14.11

0000 0000 0001 0001 //偽首部UDP協(xié)議字段代表號,值:17

0000 0000 0000 1111 //偽首部UDP長度字段,值:15

0000 0100 0011 1111 //UDP頭部源IP地址對應(yīng)的進(jìn)程端口號,值:1087

0000 0000 0000 1101 //UDP頭部目的IP地址對應(yīng)的進(jìn)程端口號,值:13

0000 0000 0000 1111 //UDP頭部UDP長度字段,值:15

0000 0000 0000 0000 //UDP頭部UDP檢驗(yàn)和,值:0

0101 0100 0100 0101 //數(shù)據(jù)字段

0101 0011 0101 0100 //數(shù)據(jù)字段

0100 1001 0100 1110 //數(shù)據(jù)字段

0100 0111 0000 0000 //數(shù)據(jù)字段+填充0字段

按照二進(jìn)制反碼運(yùn)算求和,結(jié)果:10010110 11101101

結(jié)果求反碼得出校驗(yàn)和:01101001 00010010

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容