UDP是什么東西???
前言
上一篇說(shuō)了路由協(xié)議相關(guān)知識(shí)點(diǎn),包括如何通過(guò)路由規(guī)則選擇數(shù)據(jù)報(bào)出口,動(dòng)態(tài)路由協(xié)議等信息。
今天是五一,那么就來(lái)聊一下UDP相關(guān)的知識(shí)點(diǎn),依然是八股文。
?如果MAC層定義了本地局域網(wǎng)的傳輸行為, IP層定義了整個(gè)網(wǎng)絡(luò)端到端的傳輸行為, 這兩層基本定義了這樣的現(xiàn)象:網(wǎng)絡(luò)傳輸是以包為單位的,二層叫幀,網(wǎng)絡(luò)層叫包,傳輸層叫段。包單獨(dú)傳輸,自行選路,在不同的設(shè)備封裝解封裝,不保證到達(dá)。
?
UDP
UDP是一個(gè)簡(jiǎn)單的面向數(shù)據(jù)包的運(yùn)輸層協(xié)議
進(jìn)程的每個(gè)輸出操作都正好產(chǎn)生一個(gè)UDP數(shù)據(jù)報(bào),并組裝成一份待發(fā)送的IP數(shù)據(jù)報(bào)。

UDP不提供可靠性,只負(fù)責(zé)把應(yīng)用程序傳給IP層的數(shù)據(jù)發(fā)送出去,但并不保證它們能到達(dá)目的地。
「UDP特點(diǎn)」
溝通簡(jiǎn)單 隨意傳輸,誰(shuí)都可以傳輸數(shù)據(jù)到相應(yīng)端口上 不會(huì)根據(jù)網(wǎng)絡(luò)情況進(jìn)行改變
1、UDP首部

端口號(hào)表示發(fā)送進(jìn)程和接收進(jìn)程。
由于IP層已經(jīng)把IP數(shù)據(jù)報(bào)分配給TCP或UDP(根據(jù)IP首部中協(xié)議字段值)
因此TCP端口號(hào)由TCP來(lái)查看,而UDP端口號(hào)由UDP來(lái)查看。
TCP端口號(hào)與UDP端口號(hào)是相互獨(dú)立的。
UDP長(zhǎng)度字段值是UDP首部和UDP數(shù)據(jù)的字節(jié)長(zhǎng)度。
最小值為8字節(jié),也就是沒(méi)有數(shù)據(jù)
IP數(shù)據(jù)報(bào)長(zhǎng)度值是數(shù)據(jù)報(bào)全長(zhǎng),因此UDP數(shù)據(jù)報(bào)長(zhǎng)度是全長(zhǎng)減去IP首部的長(zhǎng)度。
2、UDP校驗(yàn)和
UDP檢驗(yàn)和覆蓋UDP首部和UDP數(shù)據(jù),而IP檢驗(yàn)和只覆蓋IP的首部,不涉及到數(shù)據(jù)。
UDP的檢驗(yàn)和是可選的,而TCP的檢驗(yàn)和是必需的。
UDP檢驗(yàn)和的基本計(jì)算方法與IP首部檢驗(yàn)和計(jì)算方法類(lèi)似,但存在不同點(diǎn)。
UDP數(shù)據(jù)報(bào)的長(zhǎng)度可以為奇數(shù)字節(jié),但檢驗(yàn)和算法是把若干個(gè)16bit字相加。解決方法是在必要時(shí)在最后增加填充字節(jié)0,這只是為了檢驗(yàn)和的計(jì)算。
UDP數(shù)據(jù)報(bào)和TCP端都包含一個(gè)12字節(jié)長(zhǎng)的偽首部,為了計(jì)算檢驗(yàn)和而設(shè)置的。
偽首部包含IP首部的一些字段,目的是讓UDP兩次檢查數(shù)據(jù)是否已經(jīng)正確到達(dá)目的地。

如果檢驗(yàn)和的計(jì)算結(jié)果是0,則存入的值為全1(65535),這在二進(jìn)制反碼計(jì)算中是等效的。
如果傳送的檢驗(yàn)和為0,說(shuō)明發(fā)送端沒(méi)有計(jì)算檢驗(yàn)和。
如果發(fā)送端沒(méi)有計(jì)算檢驗(yàn)和而接收端檢測(cè)到檢驗(yàn)和有差錯(cuò),那么UDP數(shù)據(jù)報(bào)就要被悄悄地丟棄。
3、IP分片

「當(dāng)需發(fā)送的數(shù)據(jù)包大小大于路徑MTU時(shí),就需要進(jìn)行IP數(shù)據(jù)報(bào)分片」
把一份IP數(shù)據(jù)報(bào)分片以后,只有到達(dá)目的地才進(jìn)行重新組裝。
重新組裝由目的端的IP層來(lái)完成,目的是使分片和重新組裝過(guò)程對(duì)運(yùn)輸層(TCP和UDP)是透明的。
已經(jīng)分片過(guò)的數(shù)據(jù)報(bào)有可能會(huì)再次進(jìn)行分片,IP首部中包含的數(shù)據(jù)為分片和重新組裝提供了足夠的信息。
對(duì)于發(fā)送端發(fā)送的每份IP數(shù)據(jù)報(bào)來(lái)說(shuō),其標(biāo)識(shí)字段都包含一個(gè)唯一值,在數(shù)據(jù)報(bào)分片時(shí)非復(fù)制到每個(gè)片中。
標(biāo)志字段用其中一個(gè)比特來(lái)表示“更多的片”。
除了最后一片外,其他每個(gè)組成數(shù)據(jù)報(bào)的片都要把該比特置 1。
片偏移字段指的是該片偏移原始數(shù)據(jù)報(bào)開(kāi)始處的位置。
當(dāng)數(shù)據(jù)報(bào)被分片后,每個(gè)片的總長(zhǎng)度值要改為該片的長(zhǎng)度值。
標(biāo)志字段中有一個(gè)比特稱(chēng)作“不分片”位,如果這一比特為1,IP將不對(duì)數(shù)據(jù)報(bào)進(jìn)行分片。相反把數(shù)據(jù)報(bào)丟棄并發(fā)送一個(gè)ICMP差錯(cuò)報(bào)文。
當(dāng)IP數(shù)據(jù)報(bào)分片后,每一片都成為一個(gè)分組,有自己的IP首部,并在選擇路由器時(shí)與其他分組獨(dú)立。固有可能在到達(dá)目的端時(shí)失序。
一片數(shù)據(jù)的丟失也要重傳整個(gè)數(shù)據(jù)報(bào)。因?yàn)閷?duì)數(shù)據(jù)報(bào)分片的是中間路由器,而不是起始端系統(tǒng),后者根本不知道數(shù)據(jù)報(bào)是如何分片的。
4、ICMP不可達(dá)報(bào)錯(cuò)(需分片)
發(fā)生ICMP不可達(dá)差錯(cuò)的另一種情況是,當(dāng)路由器收到一份需要分片的數(shù)據(jù)報(bào),而在IP首部又設(shè)置了不分片(DF)的標(biāo)志比特。

如果路由器沒(méi)有提供過(guò)這種新的ICMP差錯(cuò)報(bào)文格式,那么下一站的MTU就設(shè)為0.
5、Traceroute
能深入探索TCP/IP協(xié)議的方便可用的工具。
不能保證從源端發(fā)往目的端的兩份連續(xù)的IP數(shù)據(jù)報(bào)具有相同的路由。
開(kāi)始時(shí)發(fā)送一個(gè)TTL字段為1的UDP數(shù)據(jù)報(bào),然后將TTL字段每次加1,以確定路徑中的每個(gè)路由器。每個(gè)路由器在丟棄UDP數(shù)據(jù)報(bào)時(shí)都返回一個(gè)ICMP超時(shí)報(bào)文2,而最終目的主機(jī)則產(chǎn)生一個(gè)ICMP端口不可達(dá)的報(bào)文。
Traceroute除了能發(fā)現(xiàn)路由之外,還能用它來(lái)確定路徑MTU。
「確定路徑MTU:」 發(fā)送分組,設(shè)置“不分片”標(biāo)志比特。發(fā)送的第一個(gè)分組長(zhǎng)度正好與出口MTU相等,每次收到ICMP“不能分片”差錯(cuò)是就減少分組的長(zhǎng)度。
6、最大UDP數(shù)據(jù)報(bào)長(zhǎng)度
理論上,IP數(shù)據(jù)報(bào)的最大長(zhǎng)速度是65535字節(jié),這是IP首部16比特總長(zhǎng)度字段所限制的。
去除20字節(jié)的IP首部和8字節(jié)的UDP首部,UDP數(shù)據(jù)報(bào)中用戶(hù)數(shù)據(jù)的最長(zhǎng)長(zhǎng)度為65507字節(jié)。
但一般實(shí)現(xiàn)所提供的長(zhǎng)度比這個(gè)最大值小。
兩個(gè)限制因素:
(1)應(yīng)用程序可能會(huì)受到其程序接口的限制。例如socket API可以設(shè)置接收和發(fā)送緩存的長(zhǎng)度。
(2)TCP/IP的內(nèi)核實(shí)現(xiàn)。可能存在一些實(shí)現(xiàn)特性(或差錯(cuò)),使IP數(shù)據(jù)報(bào)長(zhǎng)度小于65535字節(jié)。
7、ICMP源站抑制報(bào)錯(cuò)
當(dāng)一個(gè)系統(tǒng)接收數(shù)據(jù)報(bào)的速度比其處理速度快時(shí),可能會(huì)產(chǎn)生此報(bào)錯(cuò)。
「可能」一詞是因?yàn)榧词挂粋€(gè)系統(tǒng)已經(jīng)沒(méi)有緩存并丟棄數(shù)據(jù)報(bào),也不要求它一定要發(fā)送源站抑制報(bào)文。

UDP與TCP的區(qū)別
(1) TCP是面向連接的,UDP是面向無(wú)連接的。
「什么是面向連接?」
面向連接的協(xié)議會(huì)先建立連接,例如,TCP會(huì)進(jìn)行三次握手,UDP不會(huì)。
所謂的建立連接,是為了在客戶(hù)端和服務(wù)端維護(hù)連接,而建立一定的數(shù)據(jù)結(jié)構(gòu)來(lái)維護(hù)雙方交互的狀態(tài),用這樣的數(shù)據(jù)結(jié)構(gòu)來(lái)保證所謂的面向連接的特性。
(2)TCP提供可靠交互,通過(guò)TCP連接傳輸?shù)臄?shù)據(jù),無(wú)差錯(cuò)、不丟失、不重復(fù)、按序到達(dá)。
而UDP繼承了IP包的特性,不保證不丟失,不保證按順序到達(dá)。
(3)TCP是面向字節(jié)流的,而UDP繼承了IP的特性,基于數(shù)據(jù)包的,一個(gè)一個(gè)發(fā),一個(gè)一個(gè)收。
(4)TCP有擁塞控制,根據(jù)接收方的吞吐量控制發(fā)送速度,但UDP沒(méi)有。
(5)TCP是有狀態(tài)的服務(wù),UDP是無(wú)狀態(tài)服務(wù)。
使用場(chǎng)景
需要資源少,在網(wǎng)絡(luò)情況較好的內(nèi)網(wǎng),或者對(duì)于丟包不敏感的應(yīng)用。
不需要建立連接,而是可以廣播的應(yīng)用
DHCP就是一種廣播的形式,基于UDP協(xié)議。
多播,D類(lèi)地址,也即組播地址。使用此地址可將包組播給一批機(jī)器。
需要處理速度快,時(shí)延低,可以容忍少數(shù)丟包,但是要求即便網(wǎng)絡(luò)擁塞,也不改變發(fā)送速度。

往期推薦:
瀏覽器發(fā)起HTTP請(qǐng)求后經(jīng)歷了什么?
