在進行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)以內.
TCP和UDP報文分片的區別
搞了三年網路,今天才知道這個細節,汗,總結下 mtu大家都知道,是鏈路層中的網路對資料幀的乙個限制,依然以乙太網為例,mtu為1500個位元組。乙個ip資料報在乙太網中 傳輸,如果它的長度大於該mtu值,就要進行分片傳輸,使得每片資料報的長度小於mtu。分片傳輸的ip資料報不一定按序到達,但ip首部...
關於udp傳輸分片問題 MTU
編者 李國帥 相關問題在2008年遇到,簡要提供如下建議。對於大批量,高頻度的網路收發,總會遇到這樣的問題。mtu,即maximum transmission unit 最大傳輸單元 此值設定tcp ip協議傳輸資料報時的最大傳輸單元。設定多大的mtu值取決於你的上網方式,不同的上網方式支援不同的m...
IPv4協議中的UDP分片問題
目錄 ipv4協議 分片可能引起的問題 參考文章 先看乙個流傳得比較多的圖,這裡直入主題,只說與分片相關的字段。標識 identification 佔16位。ip軟體在儲存器中維持乙個計數器,每產生乙個 資料報,計數器就加1,並將此值賦給標識字段。標誌 flag 佔3位,但目前只有兩位有意義。最低位...