之前我們已經針對以太網、IP、TCP協議,進行了包頭賞析。本次,我們繼續UDP協議包頭賞析。
提到TCP,想必大家會有所了解,它早已是家喻戶曉的一個網絡協議了,而UDP遠沒有他的大哥那么的有名,所以,我們有必要先介紹下這個幕后的英雄。
【UDP是什么】
UDP,是User Datagram Protocol的縮寫,中文翻譯過來就是用戶數據報協議,它和TCP是一對兄弟,同樣位于OSI七層協議體系中的第四層“傳輸層”,向互聯網提供面向事務的簡單不可靠信息傳送服務。
正如剛才介紹的那樣,UDP提供的是一種不可靠信息傳輸,此時,你是否會心生疑惑:“科技都發展的這么厲害了,怎么還有這么不要強的協議呢?竟然自己承認自己的服務不可靠?”
【UDP存在的合理性】
并非UDP自己不要強,而是UDP的確有他存在的合理性和必然性。
眾所周知,網絡數據包在從上層到下層組建時,會由于上層包很大而需要拆分成較小的組再進行傳輸,這樣的話,勢必引出“哪些組先到目的地,哪些組后到目的地”的問題。TCP協議好似一個做事嚴謹的理科生,它對工作非常仔細,要求所有被分了組的數據,要按照原有的順序,從前到后的發送到目的端。而UDP協議則好似一個文科生,它更講究的是抒情和隨性,只要分了組的數據被傳送出去了,它就不會太在意、太上心了。
雖然,大多數人會認為TCP是一個靠譜的學生,但是,這種靠譜,是需要付出效率與性能的代價的。在一些不需要非常嚴謹的場景下,UDP反倒是一個更好的選擇,比如語音傳輸、視頻傳輸時,人們可能對正確性的關注度并非那么敏感,但是流暢度確是影響用戶體驗的關鍵指標。
【UDP的重要用戶】
他們是DNS查詢、視頻傳輸、QQ、TFTP等等。
【UDP協議報頭格式】
慣例,先看圖,后解釋:
圖已經很清晰,UDP報頭要比TCP的簡單許多,只有區區8個字節,即源端口、目的端口、用戶數據報長度、校驗和。就憑這一點,就比TCP那復雜的20字節報頭,要輕便了許多。
此處唯一需要解釋一下的,就是“用戶數據報長度”,它占了16位bit,能表示的最大長度是2^16,單位是字節。這里所指的長度,是包含UDP報頭在內的總長度,而非數據部分的長度。
【UDP數據報長度一般設置為多少比較合適】
看到一位朋友對此問題解釋的很是清晰,在此直接轉帖過來,也對rain_fish表示感謝。(原帖地址在這里):
在進行UDP編程的時候,我們最容易想到的問題就是,一次發送多少bytes好?
當然,這個沒有唯一答案,相對于不同的系統,不同的要求,其得到的答案是不一樣的,我這里僅對
像ICQ一類的發送聊天消息的情況作分析,對于其他情況,你或許也能得到一點幫助:
首先,我們知道,TCP/IP通常被認為是一個四層協議系統,包括鏈路層,網絡層,運輸層,應用層.
UDP屬于運輸層,下面我們由下至上一步一步來看:
以太網(Ethernet)數據幀的長度必須在46-1500字節之間,這是由以太網的物理特性決定的.
這個1500字節被稱為鏈路層的MTU(最大傳輸單元).
但這并不是指鏈路層的長度被限制在1500字節,其實這這個MTU指的是鏈路層的數據區.
并不包括鏈路層的首部和尾部的18個字節.
所以,事實上,這個1500字節就是網絡層IP數據報的長度限制.
因為IP數據報的首部為20字節,所以IP數據報的數據區長度最大為1480字節.
而這個1480字節就是用來放TCP傳來的TCP報文段或UDP傳來的UDP數據報的.
又因為UDP數據報的首部8字節,所以UDP數據報的數據區最大長度為1472字節.
這個1472字節就是我們可以使用的字節數。
當我們發送的UDP數據大于1472的時候會怎樣呢?
這也就是說IP數據報大于1500字節,大于MTU.這個時候發送方IP層就需要分片(fragmentation).
把數據報分成若干片,使每一片都小于MTU.而接收方IP層則需要進行數據報的重組.
這樣就會多做許多事情,而更嚴重的是,由于UDP的特性,當某一片數據傳送中丟失時,接收方便
無法重組數據報.將導致丟棄整個UDP數據報。
因此,在普通的局域網環境下,我建議將UDP的數據控制在1472字節以下為好.
進行Internet編程時則不同,因為Internet上的路由器可能會將MTU設為不同的值.
如果我們假定MTU為1500來發送數據的,而途經的某個網絡的MTU值小于1500字節,那么系統將會使用一系列的機
制來調整MTU值,使數據報能夠順利到達目的地,這樣就會做許多不必要的操作.
鑒于Internet上的標準MTU值為576字節,所以我建議在進行Internet的UDP編程時.
最好將UDP的數據長度控件在548字節(576-8-20)以內.
原文轉自:http://blogread.cn/it/article/6360?f=wb