java udp 协议_网络协议 - UDP 协议详解
? 網絡協議 - UDP 協議詳解 基于TCP和UDP的協議非常廣泛,所以也有必要對UDP協議進行詳解。@pdai
? UDP概述
UDP(User Datagram Protocol)即用戶數據報協議,在網絡中它與TCP協議一樣用于處理數據包,是一種無連接的協議。在OSI模型中,在第四層——傳輸層,處于IP協議的上一層。UDP用來支持那些需要在計算機之間傳輸數據的網絡應用。包括網絡視頻會議系統在內的眾多的客戶/服務器模式的網絡應用都需要使用UDP協議。UDP協議從問世至今已經被使用了很多年,雖然其最初的光彩已經被一些類似協議所掩蓋,但是即使是在今天UDP仍然不失為一項非常實用和可行的網絡傳輸層協議。UDP報文沒有可靠性保證、順序保證和流量控制字段等,可靠性較差。但是正因為UDP協議的控制選項較少,在數據傳輸過程中延遲小、數據傳輸效率高,適合對可靠性要求不高的應用程序,或者可以保障可靠性的應用程序,如DNS、TFTP、SNMP等。
? UDP特點
UDP提供不可靠服務,具有TCP所沒有的優勢: UDP無連接,時間上不存在建立連接需要的時延。空間上,TCP需要在端系統中維護連接狀態,需要一定的開銷。此連接裝入包括接收和發送緩存,擁塞控制參數和序號與確認號的參數。UCP不維護連接狀態,也不跟蹤這些參數,開銷小。空間和時間上都具有優勢。
舉個例子: DNS如果運行在TCP之上而不是UDP,那么DNS的速度將會慢很多。
HTTP使用TCP而不是UDP,是因為對于基于文本數據的Web網頁來說,可靠性很重要。
同一種專用應用服務器在支持UDP時,一定能支持更多的活動客戶機。
分組首部開銷小,TCP首部20字節,UDP首部8字節。
UDP沒有擁塞控制,應用層能夠更好的控制要發送的數據和發送時間,網絡中的擁塞控制也不會影響主機的發送速率。某些實時應用要求以穩定的速度發送,能容 忍一些數據的丟失,但是不能允許有較大的時延(比如實時視頻,直播等)
UDP提供盡最大努力的交付,不保證可靠交付。所有維護傳輸可靠性的工作需要用戶在應用層來完成。沒有TCP的確認機制、重傳機制。如果因為網絡原因沒有傳送到對端,UDP也不會給應用層返回錯誤信息
UDP是面向報文的,對應用層交下來的報文,添加首部后直接鄉下交付為IP層,既不合并,也不拆分,保留這些報文的邊界。對IP層交上來UDP用戶數據報,在去除首部后就原封不動地交付給上層應用進程,報文不可分割,是UDP數據報處理的最小單位。
正是因為這樣,UDP顯得不夠靈活,不能控制讀寫數據的次數和數量。比如我們要發送100個字節的報文,我們調用一次sendto函數就會發送100字節,對端也需要用recvfrom函數一次性接收100字節,不能使用循環每次獲取10個字節,獲取十次這樣的做法。
UDP常用一次性傳輸比較少量數據的網絡應用,如DNS,SNMP等,因為對于這些應用,若是采用TCP,為連接的創建,維護和拆除帶來不小的開銷。UDP也常用于多媒體應用(如IP電話,實時視頻會議,流媒體等)數據的可靠傳輸對他們而言并不重要,TCP的擁塞控制會使他們有較大的延遲,也是不可容忍的
UDP 支持一對一、一對多、多對一和多對多的交互通信。
還要注意的是: IP 數據報要經過互連網中許多路由器的存儲轉發;UDP 用戶數據報是在運輸層的端到端抽象的邏輯信道中傳送的。
UDP 對應用層交下來的報文,既不合并,也不拆分,而是保留這些報文的邊界。應用層交給 UDP 多長的報文,UDP 就照樣發送,即一次發送一個報文。
? UDP的首部格式
在計算檢驗和時,臨時把“偽首部”和 UDP 用戶數據報連接在一起。偽首部僅僅是為了計算檢驗和。
源端口: 占16位、源端口號。在需要對方回信時選用。不需要時可用全0。
目的端口: 占16位、目的端口號。這在終點交付報文時必須使用。
長度: 占16位、UDP用戶數據報的長度,其最小值是8(僅有首部)。
檢驗和: 占16位、檢測UDP用戶數據報在傳輸中是否有錯。有錯就丟棄。
請注意,雖然在 UDP 之間的通信要用到其端口號,但由于 UDP 的通信是無連接的,因此不需要使用套接字。
? UDP校驗 UDP校驗和的計算方法和IP數據報首部校驗和的計算方法相似,都使用二進制反碼運算求和再取反,但不同的是:IP數據報的校驗和之檢驗IP數據報和首部,但UDP的校驗和是把首部和數據部分一起校驗。
發送方,首先是把全零放入校驗和字段并且添加偽首部,然后把UDP數據報看成是由許多16位的子串連接起來,若UDP數據報的數據部分不是偶數個字節,則要在數據部分末尾增加一個全零字節(此字節不發送),接下來就按照二進制反碼計算出這些16位字的和。將此和的二進制反碼寫入校驗和字段。在接收方,把收到得UDP數據報加上偽首部(如果不為偶數個字節,還需要補上全零字節)后,按二進制反碼計算出這些16位字的和。當無差錯時其結果全為1,。否則就表明有差錯出現,接收方應該丟棄這個UDP數據報。
下圖是計算UDP校驗和的例子:
注意: 校驗時,若UDP數據報部分的長度不是偶數個字節,則需要填入一個全0字節,但是次字節和偽首部一樣,是不發送的。
如果UDP校驗和校驗出UDP數據報是錯誤的,可以丟棄,也可以交付上層,但是要附上錯誤報告,告訴上層這是錯誤的數據報。
通過偽首部,不僅可以檢查源端口號,目的端口號和UDP用戶數據報的數據部分,還可以檢查IP數據報的源IP地址和目的地址。
這種差錯檢驗的檢錯能力不強,但是簡單,速度快。
? 參考文章 https://blog.csdn.net/dog250/article/details/6896949
https://blog.csdn.net/qq_42196196/article/details/83956689
https://cloud.tencent.com/developer/article/1004554
https://blog.csdn.net/aa1928992772/article/details/85240358
總結
以上是生活随笔為你收集整理的java udp 协议_网络协议 - UDP 协议详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 字段类型设计_Mysql字段
- 下一篇: 空投坐标怎么看6_嗦粉不咯?桂林米粉店将