溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

UDP是怎么工作的

發(fā)布時間:2021-06-12 11:02:10 來源:億速云 閱讀:244 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)UDP是怎么工作的,小編覺得挺實(shí)用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

IETF(互聯(lián)網(wǎng)工程任務(wù)組)是一個由工程師和計算機(jī)科學(xué)家組成的社區(qū),他們致力于帶來新的互聯(lián)網(wǎng)技術(shù)、標(biāo)準(zhǔn)和規(guī)范。RFC文檔就是由IETF發(fā)布的。

RFC通常是為了進(jìn)行同行評審而編寫的正式文檔。RFC主要討論了不同協(xié)議的方法及其完整的細(xì)節(jié)和特性。它主要是作為標(biāo)準(zhǔn)文件,以便工程師實(shí)現(xiàn)、提供反饋、提交與新協(xié)議相關(guān)的信息及其概念(RFC類似提案,因此以“Request for Comments(征求意見)”命名)。為什么要此處要討論IETF和RFC呢?

那是因?yàn)橐粋€編號為768的RFC文檔。這可能是最短的RFC文檔(只有幾段文字和協(xié)議的少量細(xì)節(jié))。RFC通常非常詳細(xì),有數(shù)百頁。但是這個RFC非常短小緊湊。

這份RFC所描述的協(xié)議稱為UDP(用戶數(shù)據(jù)報協(xié)議)。UDP協(xié)議的復(fù)雜性較低,并且非常直觀(和相對的TCP協(xié)議不同。TCP協(xié)議稍微復(fù)雜一些,因?yàn)橐恍┛煽啃苑矫娴臋C(jī)制)。

TCP/IP參考模型包含5層。每層執(zhí)行不同的工作來實(shí)現(xiàn)網(wǎng)絡(luò)通信。最頂端的是應(yīng)用層。這一層為軟件和應(yīng)用程序在網(wǎng)絡(luò)中使用協(xié)議(如HTTP、FTP、SMTP)通訊提供方法。下一層是傳輸層,TCP和UDP(我們討論的主題)在這里進(jìn)入視野。TCP提供可靠的通信,而UDP不提供任何可靠傳輸機(jī)制。UDP也不提供任何順序傳輸機(jī)制。再下一層是IP層,它提供了將消息傳送到目標(biāo)IP的方法。接下來是數(shù)據(jù)鏈路層,在這里物理地址(MAC)被添加到數(shù)據(jù)包頭部,以便通過物理層將消息傳遞到網(wǎng)關(guān)。

功能
應(yīng)用層這諸如入HTTP、FTP、SMTP等應(yīng)用層協(xié)議工作的地方。應(yīng)用程序使用這些協(xié)議進(jìn)行通信。
傳輸層這一層為正確傳輸消息添加了大量特性?;旧纤ㄟ^TCP來增加可靠性。
網(wǎng)絡(luò)層這是IP地址進(jìn)入視野的地方。這一層不提供任何可靠性保證。
數(shù)據(jù)鏈路層添加源和目標(biāo)(網(wǎng)關(guān))的MAC地址。
物理層這是網(wǎng)絡(luò)硬件工作的地方。

不管你使用的是TCP還是UDP,IP協(xié)議是讓上層協(xié)議可以在網(wǎng)絡(luò)中工作(這是因?yàn)門CP和UDP位于傳輸層,而IP位于網(wǎng)絡(luò)層)。看看上面的表格。通信從應(yīng)用層開始,然后向下通過不同的層。每個層將在其上一層數(shù)據(jù)上添加自己的字段和頭部。在源頭,消息每進(jìn)入下一層,都被添加相關(guān)的字節(jié)和信息。在目的地,消息每進(jìn)入上一層,下層的無用信息都被剝離。

因此無論你根據(jù)需求選擇了TCP還是UDP,都會使用IP協(xié)議,讓網(wǎng)絡(luò)通信變成可能。

相關(guān)閱讀:理解TCP三次握手

在本文中我們不會討論TCP。這是因?yàn)樗悬c(diǎn)復(fù)雜,需要單獨(dú)的文章來闡述。UDP是傳輸層協(xié)議中使用最少的。這是因?yàn)槲覀內(nèi)粘J褂玫拇蠖鄶?shù)應(yīng)用程序都需要可靠性。UDP基本上是一種面向消息的不可靠協(xié)議。

在某種程度上UDP和IP非常相似。IP也不提供任何形式的傳輸或可靠性保證機(jī)制。

讓我們使用tcpdump看看當(dāng)建立UDP連接時會發(fā)生什么。tcpdump是可以捕獲網(wǎng)絡(luò)數(shù)據(jù)包的工具。幾乎所有的Linux發(fā)行版都支持tcpdump。

相關(guān)閱讀:使用tcpdump分析網(wǎng)絡(luò)包

tcpdump可以幫助我們查看網(wǎng)絡(luò)流量的詳細(xì)信息。為了理解這一點(diǎn),我們需要首先發(fā)送一個UDP請求,同時捕獲網(wǎng)絡(luò)數(shù)據(jù)包。

讓我們向遠(yuǎn)程服務(wù)器發(fā)送一個DNS請求。然后在另一個終端上捕獲數(shù)據(jù)包并查看。

相關(guān)閱讀:DNS服務(wù)器是如何工作的

在第一個終端上執(zhí)行以下命令:

ubuntu@testing:~$ sudo tcpdump -n -vvv host 8.8.8.8 and port 53

在第二個終端上執(zhí)行以下命令:

ubuntu@testing:~$ dig @8.8.8.8 www.google.com

在第二個終端上執(zhí)行命令時,你會在第一個終端中看到一系列消息,看起來類似:

18:40:39.758842 IP (tos 0x0, ttl 64, id 4636, offset 0, flags [none], proto UDP (17), length 56)
    192.168.40.27.55625 > 8.8.8.8.53: [udp sum ok] 63851+ A? google.com. (28)
18:40:39.812844 IP (tos 0x0, ttl 59, id 53901, offset 0, flags [none], proto UDP (17), length 104)
    8.8.8.8.53 > 192.168.40.27.55625: [udp sum ok] 63851 q: A? google.com. 3/0/0 google.com. [32s] A 172.217.26.174, google.com. [32s] A 172.217.26.174, google.com. [32s] A 172.217.26.174 (76)

第一行表示IP包的內(nèi)容。它和UDP協(xié)議沒有關(guān)系。字符串“proto UDP (17)”表示用于標(biāo)識上一層協(xié)議的一個8位字段。不同的協(xié)議用不同的數(shù)字表示。如果是TCP協(xié)議,那么你在輸出中看到的數(shù)字將是6,而非17。

如果IP報頭中沒有protocol字段,接收方將無法知道IP分組所傳遞的數(shù)據(jù)屬于哪種協(xié)議,是ICMP還是GRE等等。我們例子中的協(xié)議是UDP,因此顯示數(shù)字17。第一行輸出不包含任何與UDP相關(guān)的內(nèi)容,它只是告訴IP包傳遞的是UDP數(shù)據(jù)。

請記住,UDP包的信息,以及程序數(shù)據(jù)都封裝在IP包中(正如我們前面討論的,接收方將剝離包中與每層協(xié)議相關(guān)聯(lián)的特定數(shù)據(jù),然后提交到上一層協(xié)議,向上傳遞直到應(yīng)用層)。

“id 4636” 是IP標(biāo)識字段的一部分,在處理分片時很有用。

如果IP包過大,中間網(wǎng)絡(luò)設(shè)備無法直接發(fā)送,這是需要對IP包進(jìn)行分片。再將各個分片發(fā)送到目標(biāo)地址。接收方需要使用某種標(biāo)識來重新組裝收到的分片。所有分片擁有相同的標(biāo)識數(shù)字。接收方據(jù)此把分片視為同一個包的一部分。如果沒有發(fā)生分片(比如我們的例子),大多數(shù)IP頭將具有唯一的標(biāo)識。

“tos 0x0”表示服務(wù)類型。

TOS(Type Of Service,服務(wù)類型)表明應(yīng)該如何處理數(shù)據(jù)包。有些數(shù)據(jù)包可能需要特殊處理(例如語音電話)。

“ttl 64”表示生存時間。

生存時間是在到達(dá)最終目的地之前,一個IP數(shù)據(jù)包可能經(jīng)過的最大網(wǎng)絡(luò)設(shè)備數(shù)。如果在源和目標(biāo)之間有68個設(shè)備,例子中的IP包將在第64個設(shè)備上被丟棄(因?yàn)閠tl是64),并不會到達(dá)目的地。不同系統(tǒng)默認(rèn)的生存周期是不同的。

推薦閱讀:ttl在traceroute中扮演什么角色

“offset 0”也和IP分片有關(guān)。默認(rèn)情況下,它始終設(shè)置為0。如果IP分片,各分片將具有相同的標(biāo)識字段(如前所述),同時還有一個偏移量字段,表明重組時分片數(shù)據(jù)的位置。

讓我們考慮分片的例子。假設(shè)第1個分片的標(biāo)識是100,偏移量是0。第2個分片的標(biāo)識是100,偏移量是170。這表示在重組時,第2個分片的數(shù)據(jù)位于原始IP包的第1360(170*8=1360)字節(jié)處。

現(xiàn)在我們回到主題:UDP。下面是tcpdump輸出中的第二行:

192.168.40.27.55625 > 8.8.8.8.53: [udp sum ok] 63851+ A? google.com. (28)

這一行有5個主要部分。這些是UDP的全部內(nèi)容。這里看到的IP地址實(shí)際上是IP包的一部分,IP地址屬于UDP。IP地址存在于IP層。源IP地址是192.168.40.27,這是我電腦的IP地址。8.8.8.8是google的公共DNS地址,我們正式向這個地址發(fā)送的DNS請求。

下面是UDP的頭字段。 

UDP是怎么工作的

  • 源端口。這是發(fā)送UDP請求時隨機(jī)選擇的端口號(在例子中是55625,從第二行可以看出)。

  • 目標(biāo)端口:接收我們請求的應(yīng)用程序的目標(biāo)端口。DNS默認(rèn)使用端口號53,和例子中的相同。

  • 長度:請求發(fā)送的實(shí)際用戶數(shù)據(jù)大小。在例子中(通過dig發(fā)送的DNS請求),請求長度是UDP請求數(shù)據(jù)長度加上UDP頭長度。第二行的最后一個字段是數(shù)字28,表示用戶數(shù)據(jù)占28字節(jié)。UDP包有8字節(jié)的頭部數(shù)據(jù)。即UDP包的長度是28+8=36字節(jié)。

  • 校驗(yàn)和:UDP校驗(yàn)和的計算有點(diǎn)復(fù)雜。我將寫一篇文章介紹UDP和TCP校驗(yàn)和的計算(對于TCP和UDP,校驗(yàn)和計算方式是相同的)。雖然tcpdump輸出中沒有顯示校驗(yàn)和值,但它看起來像0xaab或0x8921之類的值。

相關(guān)閱讀:UDP和TCP校驗(yàn)和是如何計算的?

  • 有效載荷:這是客戶端實(shí)際發(fā)送的數(shù)據(jù)。在例子中是由dig生成的DNS請求 63851+ A? google.com 。A代表請求google.com的A記錄,63851+是DNS事務(wù)標(biāo)識,它幫助DNS客戶端識別應(yīng)答。

關(guān)于UDP校驗(yàn)和需要記住的一點(diǎn)是,它是可選的。UDP協(xié)議沒有強(qiáng)制要求計算校驗(yàn)和。校驗(yàn)和用于判斷數(shù)據(jù)在傳輸過程中是否遭到篡改。它提供了一種“錯誤檢測”機(jī)制。

為什么UDP使用校驗(yàn)和進(jìn)行錯誤檢測?

這是個好問題,是個實(shí)際的問題。因?yàn)閁DP要求輕量級,并未提供任何可靠性或糾錯機(jī)制。既然UDP是無連接的、不可靠的,為什么還要校驗(yàn)和呢?

UDP不關(guān)心被丟棄的數(shù)據(jù)包,也不關(guān)心亂序傳遞。但是UDP希望收到的數(shù)據(jù)包是完整的(盡管是可選的,有完整性驗(yàn)證的規(guī)定)。但是,如果不能糾錯,用校驗(yàn)和檢查完整性又有什么用呢?。

它的確不能糾正完整性錯誤。但是可以丟棄校驗(yàn)和錯誤的數(shù)據(jù)包。接收方不會收取校驗(yàn)和錯誤的數(shù)據(jù)包。沒有什么機(jī)制可以反饋給發(fā)送方,錯誤的數(shù)據(jù)包會被默默地丟棄。

如果UDP是無連接的,它如何識別應(yīng)答?

8.8.8.8.53 > 192.168.40.27.55625: [udp sum ok] 63851 q: A? google.com. 3/0/0 google.com. [32s] A 172.217.26.174, google.com. [32s] A 172.217.26.174, google.com. [32s] A 172.217.26.174 (76)

上面顯示的是對DNS請求應(yīng)答(tcpdump輸出中的最后一行)。這里的源IP和源端口是8.8.8.8和53。目標(biāo)IP和目標(biāo)端口為192.168.40.27和55625。

應(yīng)答中的目標(biāo)端口與原始請求中的源端口相同(tcpdump輸出中的第二行)。

也就是說,應(yīng)答直接發(fā)送給發(fā)出原始請求的端口。這是客戶端程序識別正確應(yīng)答的方法。

在理想情況下,客戶端程序打開端口等待響應(yīng)。只有在收到應(yīng)答時,源端口(套接字)才會關(guān)閉。

將UDP與TCP進(jìn)行比較的最佳用例

想象一下,你希望將一個視頻直播給數(shù)百萬用戶(可能是一場板球比賽)。TCP需要大量的開銷來處理這類請求。就直播流而言,如果TCP收到太多請求,操作系統(tǒng)必須等待所有未確認(rèn)的數(shù)據(jù)。這意味著,如果有數(shù)百萬個請求,操作系統(tǒng)將把所有未確認(rèn)數(shù)據(jù)保存在緩沖區(qū)中。在這種情況下,TCP不是個好主意。

如果你需要快速且簡單的響應(yīng),那么UDP是最好的選擇。比如DNS、NTP等。

想想游戲之類的場景。游戲中新的狀態(tài)正在不斷地替換舊狀態(tài)。這意味著舊狀態(tài)對于客戶端來說是沒有用的(忘了重發(fā)缺失包的面向連接的TCP吧)。在這里UDP是一個不錯的選擇。

關(guān)于“UDP是怎么工作的”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

udp
AI