基于TCP和UDP的協(xié)議非常廣泛,所以也有必要對(duì)UDP協(xié)議進(jìn)行詳解。
UDP概述
UDP(User Datagram Protocol)即用戶數(shù)據(jù)報(bào)協(xié)議,在網(wǎng)絡(luò)中它與TCP協(xié)議一樣用于處理數(shù)據(jù)包,是一種無(wú)連接的協(xié)議。在OSI模型中,在第四層——傳輸層,處于IP協(xié)議的上一層。UDP用來(lái)支持那些需要在計(jì)算機(jī)之間傳輸數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用。包括網(wǎng)絡(luò)視頻會(huì)議系統(tǒng)在內(nèi)的眾多的客戶/服務(wù)器模式的網(wǎng)絡(luò)應(yīng)用都需要使用UDP協(xié)議。UDP協(xié)議從問(wèn)世至今已經(jīng)被使用了很多年,雖然其最初的光彩已經(jīng)被一些類(lèi)似協(xié)議所掩蓋,但是即使是在今天UDP仍然不失為一項(xiàng)非常實(shí)用和可行的網(wǎng)絡(luò)傳輸層協(xié)議。UDP報(bào)文沒(méi)有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因?yàn)閁DP協(xié)議的控制選項(xiàng)較少,在數(shù)據(jù)傳輸過(guò)程中延遲小、數(shù)據(jù)傳輸效率高,適合對(duì)可靠性要求不高的應(yīng)用程序,或者可以保障可靠性的應(yīng)用程序,如DNS、TFTP、SNMP等。
UDP特點(diǎn)
UDP提供不可靠服務(wù),具有TCP所沒(méi)有的優(yōu)勢(shì):
-
UDP無(wú)連接
,時(shí)間上不存在建立連接需要的時(shí)延。空間上,TCP需要在端系統(tǒng)中維護(hù)連接狀態(tài),需要一定的開(kāi)銷(xiāo)。此連接裝入包括接收和發(fā)送緩存,擁塞控制參數(shù)和序號(hào)與確認(rèn)號(hào)的參數(shù)。UCP不維護(hù)連接狀態(tài),也不跟蹤這些參數(shù),開(kāi)銷(xiāo)小??臻g和時(shí)間上都具有優(yōu)勢(shì)。 舉個(gè)例子:- DNS如果運(yùn)行在TCP之上而不是UDP,那么DNS的速度將會(huì)慢很多。
- HTTP使用TCP而不是UDP,是因?yàn)閷?duì)于基于文本數(shù)據(jù)的Web網(wǎng)頁(yè)來(lái)說(shuō),可靠性很重要。
- 同一種專(zhuān)用應(yīng)用服務(wù)器在支持UDP時(shí),一定能支持更多的活動(dòng)客戶機(jī)。
-
分組首部開(kāi)銷(xiāo)小
,TCP首部20字節(jié),UDP首部8字節(jié)。 -
UDP沒(méi)有擁塞控制
,應(yīng)用層能夠更好的控制要發(fā)送的數(shù)據(jù)和發(fā)送時(shí)間,網(wǎng)絡(luò)中的擁塞控制也不會(huì)影響主機(jī)的發(fā)送速率。某些實(shí)時(shí)應(yīng)用要求以穩(wěn)定的速度發(fā)送,能容 忍一些數(shù)據(jù)的丟失,但是不能允許有較大的時(shí)延(比如實(shí)時(shí)視頻,直播等) -
UDP提供盡最大努力的交付,不保證可靠交付
。所有維護(hù)傳輸可靠性的工作需要用戶在應(yīng)用層來(lái)完成。沒(méi)有TCP的確認(rèn)機(jī)制、重傳機(jī)制。如果因?yàn)榫W(wǎng)絡(luò)原因沒(méi)有傳送到對(duì)端,UDP也不會(huì)給應(yīng)用層返回錯(cuò)誤信息 -
UDP是面向報(bào)文的
,對(duì)應(yīng)用層交下來(lái)的報(bào)文,添加首部后直接鄉(xiāng)下交付為IP層,既不合并,也不拆分,保留這些報(bào)文的邊界。對(duì)IP層交上來(lái)UDP用戶數(shù)據(jù)報(bào),在去除首部后就原封不動(dòng)地交付給上層應(yīng)用進(jìn)程,報(bào)文不可分割,是UDP數(shù)據(jù)報(bào)處理的最小單位。 正是因?yàn)檫@樣,UDP顯得不夠靈活,不能控制讀寫(xiě)數(shù)據(jù)的次數(shù)和數(shù)量。比如我們要發(fā)送100個(gè)字節(jié)的報(bào)文,我們調(diào)用一次sendto函數(shù)就會(huì)發(fā)送100字節(jié),對(duì)端也需要用recvfrom函數(shù)一次性接收100字節(jié),不能使用循環(huán)每次獲取10個(gè)字節(jié),獲取十次這樣的做法。 -
UDP常用一次性傳輸比較少量數(shù)據(jù)的網(wǎng)絡(luò)應(yīng)用
,如DNS,SNMP等,因?yàn)閷?duì)于這些應(yīng)用,若是采用TCP,為連接的創(chuàng)建,維護(hù)和拆除帶來(lái)不小的開(kāi)銷(xiāo)。UDP也常用于多媒體應(yīng)用(如IP電話,實(shí)時(shí)視頻會(huì)議,流媒體等)數(shù)據(jù)的可靠傳輸對(duì)他們而言并不重要,TCP的擁塞控制會(huì)使他們有較大的延遲,也是不可容忍的 -
UDP 支持一對(duì)一、一對(duì)多、多對(duì)一和多對(duì)多的交互通信
。
還要注意的是:
- IP 數(shù)據(jù)報(bào)要經(jīng)過(guò)互連網(wǎng)中許多路由器的存儲(chǔ)轉(zhuǎn)發(fā);UDP 用戶數(shù)據(jù)報(bào)是在
運(yùn)輸層的端到端抽象的邏輯信道中傳送的
。
UDP 對(duì)應(yīng)用層交下來(lái)的報(bào)文,既不合并,也不拆分,而是保留這些報(bào)文的邊界。應(yīng)用層交給 UDP 多長(zhǎng)的報(bào)文,UDP 就照樣發(fā)送,即一次發(fā)送一個(gè)報(bào)文
。
UDP的首部格式
在計(jì)算檢驗(yàn)和時(shí),臨時(shí)把“偽首部”和 UDP 用戶數(shù)據(jù)報(bào)連接在一起。偽首部?jī)H僅是為了計(jì)算檢驗(yàn)和
。
-
源端口
: 占16位、源端口號(hào)。在需要對(duì)方回信時(shí)選用。不需要時(shí)可用全0。 -
目的端口
: 占16位、目的端口號(hào)。這在終點(diǎn)交付報(bào)文時(shí)必須使用。 -
長(zhǎng)度
: 占16位、UDP用戶數(shù)據(jù)報(bào)的長(zhǎng)度,其最小值是8(僅有首部)。 -
檢驗(yàn)和
: 占16位、檢測(cè)UDP用戶數(shù)據(jù)報(bào)在傳輸中是否有錯(cuò)。有錯(cuò)就丟棄。
請(qǐng)注意,雖然在 UDP 之間的通信要用到其端口號(hào),但由于 UDP 的通信是無(wú)連接的,因此不需要使用套接字。
UDP校驗(yàn)
UDP校驗(yàn)和的計(jì)算方法和IP數(shù)據(jù)報(bào)首部校驗(yàn)和的計(jì)算方法相似,都使用
二進(jìn)制反碼運(yùn)算求和再取反
,但不同的是:IP數(shù)據(jù)報(bào)的校驗(yàn)和之檢驗(yàn)IP數(shù)據(jù)報(bào)和首部,但UDP的校驗(yàn)和是把首部和數(shù)據(jù)部分一起校驗(yàn)
。
發(fā)送方,首先是把全零放入校驗(yàn)和字段并且添加偽首部,然后把UDP數(shù)據(jù)報(bào)看成是由許多16位的子串連接起來(lái),若UDP數(shù)據(jù)報(bào)的數(shù)據(jù)部分不是偶數(shù)個(gè)字節(jié),則要在數(shù)據(jù)部分末尾增加一個(gè)全零字節(jié)(此字節(jié)不發(fā)送),接下來(lái)就按照二進(jìn)制反碼計(jì)算出這些16位字的和。將此和的二進(jìn)制反碼寫(xiě)入校驗(yàn)和字段。在接收方,把收到得UDP數(shù)據(jù)報(bào)加上偽首部(如果不為偶數(shù)個(gè)字節(jié),還需要補(bǔ)上全零字節(jié))后,按二進(jìn)制反碼計(jì)算出這些16位字的和。當(dāng)無(wú)差錯(cuò)時(shí)其結(jié)果全為1,。否則就表明有差錯(cuò)出現(xiàn),接收方應(yīng)該丟棄這個(gè)UDP數(shù)據(jù)報(bào)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-837128.html
下圖是計(jì)算UDP校驗(yàn)和的例子:
注意:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-837128.html
- 校驗(yàn)時(shí),若UDP數(shù)據(jù)報(bào)部分的長(zhǎng)度不是偶數(shù)個(gè)字節(jié),則需要填入一個(gè)全0字節(jié),但是次字節(jié)和偽首部一樣,是不發(fā)送的。
- 如果UDP校驗(yàn)和校驗(yàn)出UDP數(shù)據(jù)報(bào)是錯(cuò)誤的,可以丟棄,也可以交付上層,但是要附上錯(cuò)誤報(bào)告,告訴上層這是錯(cuò)誤的數(shù)據(jù)報(bào)。
- 通過(guò)偽首部,不僅可以檢查源端口號(hào),目的端口號(hào)和UDP用戶數(shù)據(jù)報(bào)的數(shù)據(jù)部分,還可以檢查IP數(shù)據(jù)報(bào)的源IP地址和目的地址。 這種差錯(cuò)檢驗(yàn)的檢錯(cuò)能力不強(qiáng),但是簡(jiǎn)單,速度快。
參考文章
- 文章轉(zhuǎn)自大佬 pdai 歡迎大家交流學(xué)習(xí)
到了這里,關(guān)于網(wǎng)絡(luò)協(xié)議 - UDP 協(xié)議詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!