在進行udp程式設計的時候,因此傳送多少bytes比較好呢??當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的。
乙太網資料幀長度必須在46-1500位元組之間,這是由乙太網的屋裡特性決定的。這個1500位元組被稱為鏈路層的mtu,但這並不是指鏈路層的長度被限制再1500位元組,其實這個mtu指的是鏈路層的資料區,並不包括鏈路層的首部和尾部的18個位元組。所以,這個1500位元組就是網路層資料報的長度限制,因為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)以內.
標準乙太網幀長度下限為:64位元組
標準乙太網幀長度上限為:1518位元組
最早的乙太網工作方式:載波多路復用/衝突檢測csma/cd,因為網路是共享的,即任何乙個節點傳送資料之前,先要偵聽線路上是否有資料在傳輸,如果有,需要等待,如果線路可用,才可以傳送。假設a發出第乙個bit位,到達b,而b也正在傳輸第乙個bit位,於是產生衝突,衝突訊號得讓a在完成最後乙個bit位之前到達a,這個一來一回的時間間隙slot time是57.6us。
在10mbps的網路中,在57.6us的時間內,能夠傳輸576個bit,所以要求乙太網幀最小長度為576個bits,從而讓最極端的碰撞都能夠被檢測到。這576bit換算一下就是72個位元組,去掉8個位元組的前導符和幀開始符,乙太網幀的最小長度為64位元組。
如果說乙太網幀的最小長度64byte是由csma/cd限制所致,那麼最大程度1500byte又是處於什麼考慮的呢?ip頭total length為兩個位元組,理論上ip packet可以有65535byte,加上ethernet frame頭和尾,可以有65535 + 14 + 4 = 65553 byte。如果在10mbps乙太網上,將會占用共享鏈路長達50ms,這將嚴重影響其它主機的通訊,特別是對延遲敏感的應用是無法接受的。
由於線路質量差而引起的丟包,發生在大包的概覽也比小包概覽大得多,所以大包在丟包率較高的線路上不是乙個很好的選擇。但是如果選擇乙個較小的長度,傳輸效率又不高,拿tcp應用來說,如果選擇乙太網長度為218byte,tcp payload = 218 - ethernet header - ip header - tcp header = 218-18-20-20=160 byte。那有效傳輸效率= 160/218=73%。如果乙太網長度為1518,那麼有效傳輸效率=1460/1518=96%。
通過比較,選擇較大的幀,有效傳輸效率更高,而更大的幀長度同時也會造成上述的問題,於是最終選擇乙個折中長度:1518byte。對應的ip packet就是1500byte,這就是最大傳輸單元mtu的由來。
參考:
分析udp資料報 網路協議之TCP和UDP
首先強調一點,tcp ip協議是乙個協議簇。裡面包括很多協議的,udp只是其中的乙個,之所以命名為tcp ip協議,因為tcp ip協議是兩個很重要的協議,就用他兩命名了。兩個協議的區別實際使用時,只需要記住 tcp正常連線傳送資料時一般不會產生丟包 排除上下層其他因素 而udp產生丟包是很常見的事...
VC 實現UDP資料報傳送
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!請見 include include 定義了ip hdrincl cinitsock thesock 計算udp偽頭校驗和。udp校驗和基於如下幾個域 源ip位址 目的ip位址 8位0域 8位協議域 16位udp長度 16位源埠號 16位目的埠號 ...
使用 UDP 資料報傳送訊息
使用 udp 資料報傳送短的文字訊息實現是很簡單的並且提供可乙個非常輕量級的訊息傳遞通道。但是這種模式有很大的缺陷,就是不保證的資料的可靠性,有可能會存在丟包的情況,甚至嚴重的情況就是伺服器不可用的時候,會完全丟失你的訊息。不過這個任務會在有些情況下十分有作用 你不關心訊息是否丟失 你不想要終止程式...