簡(jiǎn)介
用戶數(shù)據(jù)報(bào)協(xié)議UDP(User Datagram Protocol)[RFC 793]
- 無連接的,即發(fā)送數(shù)據(jù)之前不需要建立連接,因此減少了開銷和發(fā)送數(shù)據(jù)之前的時(shí)延。
- 不保證可靠交付,因此主機(jī)不需要為此復(fù)雜的連接狀態(tài)表
- 面向報(bào)文的,意思是 UDP 對(duì)應(yīng)用層交下來的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界,在添加首部后向下交給 IP 層。
- 沒有阻塞控制,因此網(wǎng)絡(luò)出現(xiàn)的擁塞不會(huì)使發(fā)送方的發(fā)送速率降低。
- 支持一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多的交互通信,也即是提供廣播和多播的功能。
- 首部開銷小,首部只有 8 個(gè)字節(jié),分為四部分。
udp報(bào)文結(jié)構(gòu)

源端口:源端口號(hào),在需要對(duì)方回信時(shí)選用,不需要時(shí)可全 0.
目的端口:目的端口號(hào),在終點(diǎn)交付報(bào)文時(shí)必須要使用到。
長(zhǎng)度:UDP 用戶數(shù)據(jù)報(bào)的長(zhǎng)度,在只有首部的情況,其最小值是 8 。
檢驗(yàn)和:檢測(cè) UDP 用戶數(shù)據(jù)報(bào)在傳輸中是否有錯(cuò),有錯(cuò)就丟棄。
UDP 如何進(jìn)行校驗(yàn)和:
UDP 數(shù)據(jù)報(bào)首部中檢驗(yàn)和的計(jì)算方法比較特殊。
在計(jì)算檢驗(yàn)和時(shí),要在數(shù)據(jù)報(bào)之前增加 12 個(gè)字節(jié)的偽首部,用來計(jì)算校驗(yàn)和。
偽首部并不是數(shù)據(jù)報(bào)真正的首部,是為了計(jì)算校驗(yàn)和而臨時(shí)添加在數(shù)據(jù)報(bào)前面的,在真正傳輸?shù)臅r(shí)候并不會(huì)把偽首部一并發(fā)送。

第一字段,源 IP 地址
第二字段,目的 IP 地址
第三字段,字段全 0
第四字段,IP 首部中的協(xié)議字段的值,對(duì)于 UDP,此字段值為 17
第五字段,UDP 用戶數(shù)據(jù)報(bào)的長(zhǎng)度
UDP與TCP對(duì)比

TCP與UDP的連接方式
從程序?qū)崿F(xiàn)的角度來看

tcp中需要客戶端向服務(wù)器發(fā)起連接,服務(wù)器需要接受客戶端的連接以后才可以收發(fā)數(shù)據(jù)。而udp中客戶端不需要向服務(wù)器發(fā)起連接,只需要知道服務(wù)器綁定的端口就可以向服務(wù)器發(fā)送數(shù)據(jù)。由此可知,tcp是面向連接的,udp是非面向連接的。
UDP面向報(bào)文 ,TCP面向字節(jié)流
UDP是面向報(bào)文。
發(fā)送方的UDP對(duì)應(yīng)用程序交下來的報(bào)文在添加首部后就向下交付給IP層,對(duì)交下來的報(bào)文既不合并也不拆分。因此,應(yīng)用進(jìn)程必須選擇合適大小的報(bào)文,若報(bào)文太長(zhǎng),UDP把它交付給IP層后,IP層在傳送時(shí)可能要進(jìn)行分片,這會(huì)降低IP層的效率;反之,若報(bào)文太短,UDP把它交給IP層后,會(huì)使IP數(shù)據(jù)報(bào)的首部的相對(duì)長(zhǎng)度太大,也降低了IP層的效率。TCP面向字節(jié)流。
雖然應(yīng)用程序和TCP的交互是一次一個(gè)數(shù)據(jù)塊,但TCP把應(yīng)用程序交下來的數(shù)據(jù)看成是一連串的務(wù)結(jié)構(gòu)的字節(jié)流。TCP不保證接收方應(yīng)用程序所收到的數(shù)據(jù)塊和發(fā)送方應(yīng)用程序所發(fā)出的數(shù)據(jù)塊具有對(duì)應(yīng)大小的關(guān)系(例如,發(fā)送方應(yīng)用程序交給發(fā)送方TCP共有10個(gè)數(shù)據(jù)塊,但接收方TCP可能只用了4個(gè)數(shù)據(jù)塊就把收到的字節(jié)流交付給了上層應(yīng)用程序)。但接收方應(yīng)用程序收到的字節(jié)流必須和發(fā)送方應(yīng)用程序發(fā)出的字節(jié)流完全一樣。(原理參考每日一問20——TCP中tcp滑動(dòng)窗口的介紹)
UDP單播,廣播,多播
- 單播把數(shù)據(jù)報(bào)發(fā)送給單一主機(jī)
- 廣播把數(shù)據(jù)報(bào)發(fā)送給指定網(wǎng)絡(luò)上的所有主機(jī)
- 多播發(fā)送給指定的多個(gè)主機(jī)
廣播
廣播域
首先我們來了解一下廣播域的概念。
廣播域是網(wǎng)絡(luò)中能接收任一臺(tái)主機(jī)發(fā)出的廣播幀的所有主機(jī)集合。也就是說,如果廣播域內(nèi)的其中一臺(tái)主機(jī)發(fā)出一個(gè)廣播幀,同一廣播域內(nèi)所有的其它主機(jī)都可以收到該廣播幀。
廣播域的計(jì)算
如何知道一臺(tái)主機(jī)是屬于哪一個(gè)廣播域呢?其實(shí)計(jì)算很簡(jiǎn)單,只要用主機(jī)的IP地址與子網(wǎng)掩碼進(jìn)行與運(yùn)算即可知道該主機(jī)屬于哪一個(gè)廣播域。例如:一臺(tái)主機(jī)的IP地址為192.168.23.150,子網(wǎng)掩碼為255.255.255.0,那么它所屬的廣播域就是192.168.23.150&255.255.255.0=192.168.23.0。那么其它的在廣播域192.168.23.0內(nèi)的所有主機(jī)就可以到該設(shè)備發(fā)送的廣播包。如果把子網(wǎng)掩碼改為255.255.0.0,那么它所屬的廣播域就是192.168.23.150&255.255.0.0=192.168.0.0。那么其它的在廣播域192.168.0.0內(nèi)的所有主機(jī)都可以收到該設(shè)備發(fā)送的廣播包。
廣播地址的計(jì)算
要想相同廣播域內(nèi)的其它主機(jī)能收到的廣播幀,還需要在發(fā)送廣播包的時(shí)候指定當(dāng)前所屬廣播域內(nèi)的廣播地址。廣播地址的計(jì)算方法為子網(wǎng)掩碼取反再與廣播域進(jìn)行或運(yùn)算。
例如:如果主機(jī)當(dāng)前所屬廣播域?yàn)?92.168.0.0,子網(wǎng)掩碼為255.255.0.0,那么廣播地址則為192.168.255.255。
使用UDP進(jìn)行跨網(wǎng)段廣播
要使主機(jī)A發(fā)送的廣播包能夠被另一網(wǎng)段的主機(jī)B收到,那么只需要更改主機(jī)A的子網(wǎng)掩碼使得與主機(jī)B在同一個(gè)廣播域內(nèi),再使用新的廣播域的廣播地址發(fā)送廣播包即可。
例如:要使用192.168.23.150發(fā)送廣播包讓192.168.27.135收到,只需要設(shè)置192.168.23.150的子網(wǎng)掩碼為255.255.0.0,然后再使用廣播地址192.168.255.255即可。
廣播UDP與單播UDP的區(qū)別就是IP地址不同,廣播使用廣播地址255.255.255.255,將消息發(fā)送到在同一廣播網(wǎng)絡(luò)上的每個(gè)主機(jī)。
多播
多播是一組主機(jī)的標(biāo)示符,它已經(jīng)加入到一個(gè)多播組中。在以太網(wǎng)中,多播地址是一個(gè)48位的標(biāo)示符,命名了一組應(yīng)該在這個(gè)網(wǎng)絡(luò)中應(yīng)用接收到一個(gè)分組的站點(diǎn)。在IPv4中,它歷史上被叫做D類地址,一種類型的IP地址,它的范圍從224.0.0.0到239.255.255.255。D類地址用于組播。
相關(guān)文章:
TCP/IP詳解學(xué)習(xí)筆記(6)-UDP
多播(組播)原理分析
UDP廣播原理簡(jiǎn)介
UDP 和 TCP 的不同