自己做網(wǎng)站推廣在那個網(wǎng)站鄭州做網(wǎng)站最好的公司
1. 概述
UDP(User Datagram?Protocol)是一種無連接的傳輸層協(xié)議,它提供了一種簡單的數(shù)據(jù)傳輸服務(wù),不保證數(shù)據(jù)的可靠傳輸。在網(wǎng)絡(luò)通信中,UDP通常用于一些對實(shí)時性要求較高、數(shù)據(jù)量較小、傳輸延遲較低的應(yīng)用,如音頻、視頻傳輸?shù)取?/p>
2.?UDP特點(diǎn)
1、無連接
UDP傳輸?shù)倪^程類似于寄信,知道對端的IP和端口號就可以直接進(jìn)行數(shù)據(jù)報傳輸,不用像TCP協(xié)議需要建立連接。
2、不可靠
UDP沒有任何安全機(jī)制,發(fā)送端發(fā)送數(shù)據(jù)報以后,如果因?yàn)榫W(wǎng)絡(luò)故障該段無法發(fā)到對方,UDP協(xié)議層也不會給應(yīng)用層返回任何錯誤信息。
3、面向數(shù)據(jù)報
UDP通過數(shù)據(jù)報的形式進(jìn)行傳輸,用戶的請求或響應(yīng)都會從數(shù)據(jù)報轉(zhuǎn)換成字符串
應(yīng)用層交給UDP多長的報文,UDP原樣發(fā)送,既不會拆分也不會合并
例:用UDP傳輸100個字節(jié)的數(shù)據(jù),如果發(fā)送端一次發(fā)送100個字節(jié),那么接收端也必須一次接收100個字節(jié),而不能循環(huán)接收10次每次接收10個字節(jié)。
4、全雙工通信
UDP的Socket既能讀也能寫,客戶端和服務(wù)器都可以發(fā)送請求/接受響應(yīng)。
3.?UDP的報文結(jié)構(gòu)
UDP數(shù)據(jù)報=報頭+載荷
1、報頭
對于UDP來說,報頭一共有8個字節(jié)????,包含4個字段,每個字段2個字節(jié)。
報頭=源端口+目的端口+報文長度+校驗(yàn)和
應(yīng)用層數(shù)據(jù)報
UDP報頭分為四個部分,每個部分占兩個字節(jié)。
- 源端口
- 目的端口
- 報文長度
- 校驗(yàn)和
3.1源端口和目的端口
源端口和目的端口各占2字節(jié)(Byte)
,端口號范圍:0~65535
比如:源端口是3306,目的端口是8866。
例:
3.2 報文長度
報文的長度也用2個字節(jié)表示,范圍是0~65535
,單位是字節(jié)(Byte)
。
一般我們都說UDP最大報文長度是64KB (65536B)
,實(shí)際上是65535B
。
如果超過了64KB,可以通過以下兩種方式來解決:
- 在應(yīng)用層通過代碼的方式針對應(yīng)用層數(shù)據(jù)報進(jìn)行手動分包,拆成多個包通過多個UDP數(shù)據(jù)報進(jìn)行傳輸。
- 換成TCP協(xié)議
3.3 校驗(yàn)和
1、定義
將發(fā)送前和發(fā)送后的校驗(yàn)和進(jìn)行比較,檢查發(fā)送前后數(shù)據(jù)報是否一致。用來驗(yàn)證傳輸?shù)臄?shù)據(jù)是否是正確的。
2. 校驗(yàn)和存在的意義就是用來判定當(dāng)前傳輸?shù)臄?shù)據(jù)是否出錯:
如果校驗(yàn)和不對,此時數(shù)據(jù)一定不對
如果校驗(yàn)和對,數(shù)據(jù)也有一定概率是錯的
為了讓校驗(yàn)和能夠識別率更高一些,計(jì)算時通常會以數(shù)據(jù)內(nèi)容作為參數(shù)來計(jì)算,數(shù)據(jù)內(nèi)容發(fā)生變化,校驗(yàn)和也會發(fā)生變化。
3.校驗(yàn)和主要校驗(yàn)的內(nèi)容
數(shù)據(jù)內(nèi)容: 校驗(yàn)和對數(shù)據(jù)報中的每個比特位進(jìn)行求和計(jì)算,以確保數(shù)據(jù)內(nèi)容在傳輸過程中沒有被篡改或損壞。
傳輸過程中的錯誤: 校驗(yàn)和可以檢測到數(shù)據(jù)在傳輸過程中是否發(fā)生了錯誤,例如比特翻轉(zhuǎn)或數(shù)據(jù)丟失。
數(shù)據(jù)包的完整性: 通過與發(fā)送端發(fā)送的校驗(yàn)和進(jìn)行比較,接收端可以驗(yàn)證數(shù)據(jù)包在傳輸過程中是否保持完整,即數(shù)據(jù)在發(fā)送端和接收端之間沒有發(fā)生改變。
4. 校驗(yàn)和的實(shí)現(xiàn)方式
校驗(yàn)和使用的是一種簡單的錯誤檢測機(jī)制,它的實(shí)現(xiàn)方式如下:
1.計(jì)算校驗(yàn)和: 發(fā)送端在發(fā)送UDP數(shù)據(jù)包之前,會對UDP數(shù)據(jù)報文的內(nèi)容進(jìn)行校驗(yàn)和的計(jì)算。計(jì)算過程通常包括以下步驟:
? ? ? ? 將UDP數(shù)據(jù)報文劃分為以16比特為單位的字(對于字節(jié)不足16比特的部分,可以補(bǔ)零)。
? ? ? ? 將這些16比特字相加,得到一個32比特的中間結(jié)果。
? ? ? ? 如果中間結(jié)果的高16比特不為0,則將其與低16比特相加,直到高16比特為0為止。
? ? ? ? 最終的校驗(yàn)和就是將最后的結(jié)果按位取反得到的值。
2.校驗(yàn)和字段: 發(fā)送端將計(jì)算得到的校驗(yàn)和值放置在UDP數(shù)據(jù)報的校驗(yàn)和字段中。
3.接收端驗(yàn)證: 接收端在接收到UDP數(shù)據(jù)包后,會進(jìn)行校驗(yàn)和的驗(yàn)證。驗(yàn)證的步驟與計(jì)算過程類似:
? ? ?接收端同樣將UDP數(shù)據(jù)報文劃分為16比特的字,并對其進(jìn)行求和計(jì)算。
? ? ?接收端將計(jì)算得到的校驗(yàn)和與UDP數(shù)據(jù)包中的校驗(yàn)和字段進(jìn)行比較。
? ? ?如果兩者相等,則認(rèn)為數(shù)據(jù)包未損壞;如果不相等,則認(rèn)為數(shù)據(jù)包可能已經(jīng)損壞。
4. 注意事項(xiàng)
1.無連接性:UDP是一種無連接的協(xié)議,不像TCP那樣需要建立連接和維護(hù)狀態(tài)。因此,發(fā)送端發(fā)送UDP數(shù)據(jù)報文后,無法知道是否被接收端正確接收,也無法進(jìn)行重傳操作。應(yīng)用層需要自行處理丟包和數(shù)據(jù)重傳的問題。
2.不可靠性:UDP不提供數(shù)據(jù)的可靠傳輸和重傳機(jī)制,也不具備擁塞控制。因此,數(shù)據(jù)報文在傳輸過程中可能會丟失、重復(fù)或亂序。應(yīng)用層需要自行處理這些問題,如通過數(shù)據(jù)包序號、確認(rèn)應(yīng)答等方式實(shí)現(xiàn)可靠性傳輸。
3.數(shù)據(jù)完整性:UDP提供校驗(yàn)和字段用于檢驗(yàn)數(shù)據(jù)報文的完整性,但并不提供數(shù)據(jù)的糾錯功能。因此,在傳輸過程中可能會出現(xiàn)數(shù)據(jù)損壞的情況。應(yīng)用層可以通過校驗(yàn)和驗(yàn)證數(shù)據(jù)的完整性,但無法進(jìn)行錯誤的糾正。
4.數(shù)據(jù)包大小限制:UDP數(shù)據(jù)報文的最大長度為65535字節(jié),包括UDP頭部和數(shù)據(jù)部分。超過這個長度的數(shù)據(jù)報文將被分片或丟棄。因此,在發(fā)送UDP數(shù)據(jù)時需要注意控制數(shù)據(jù)包的大小,避免過大導(dǎo)致分片或丟包。如果傳輸數(shù)據(jù)超過64K,就需要在應(yīng)用層手動的分包, 多次發(fā)送, 并在接收端手動拼裝。
5.適用場景:UDP適用于對實(shí)時性要求較高、傳輸延遲較低的應(yīng)用場景,如音視頻傳輸、在線游戲等。但對于需要可靠傳輸和數(shù)據(jù)完整性保障的應(yīng)用,應(yīng)該選擇TCP協(xié)議。
6.端口號選擇:在使用UDP通信時,需要選擇合適的端口號進(jìn)行通信。系統(tǒng)保留端口號(0-1023)通常用于特定的協(xié)議和服務(wù),應(yīng)避免使用這些端口號,以免與系統(tǒng)服務(wù)沖突。