UDP中乙個包的大小最大能多大

2021-06-18 10:16:35 字數 1371 閱讀 8368

1.在進行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)以內.   

(ps:這句話貌似有問題,unix網路程式設計第一卷裡說 ipv4協議規定ip層的最小重組緩衝區大小為576!所以,建議udp包不要超過這個大小,而不是因為internet的標準mtu是576!)

記錄乙個UDP收包丟包的問題

這幾天寫gb28181平台接入層 對收到的ps包進行解包時,總是出現誤碼,最終導致rtsp點播服務中畫面花屏。分析了碼流抓包資料之後,發現網路上沒有丟包,遂認為ps流解包 有bug,於是埋頭分析了2個小時的解包函式後,沒有發現問題。將抓包rtp負載中的ps包資料匯出之後,專門利用ps解包 寫了乙個小...

udp程式設計中,一次能傳送多少個bytes為好?

在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對 像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助 首先,我們知道,tcp ip通常被認為是乙個四層協議...

彙編中乙個有趣的問題

int main 問題是下面哪個關係成立 a b c還是 a b c?我們知道區域性變數是存放在棧中的,a先push,然後是b,最後是c。而棧指標sp是從高位址 低位址方向移動的,所以 a b c。如果void f int a int b,int c 這裡就是 a b c,因為引數是逆序進棧的。網上...