UDP協議一次傳送的最大資料量分析

2021-08-09 10:55:12 字數 1185 閱讀 1024

一、從mtu角度看

在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?

當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的。

首先,我們知道,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層就需要分片 .把資料報分成若干片,使每一片都小於mtu.而接收方ip層則需要進行資料報的重組.這樣就會多做許多事情,而更嚴重的是,由於udp的特性,當某一片資料傳送中丟失時,接收方便無法重組資料報.將導致丟棄整個udp資料報。

因此,在普通的區域網環境下,我建議將udp的資料控制在1472位元組以下為好.

進行internet程式設計時則不同,因為internet上的路由器可能會將mtu設為不同的值.如果我們假定mtu為1500來傳送資料的,而途經的某個網路的mtu值小於1500位元組,那麼系統將會使用一系列的機制來調整mtu值,使資料報能夠順利到達目的地,這樣就會做許多不必要的操作.

鑑於internet上的標準mtu值為576位元組,所以我建議在進行internet的udp程式設計時.最好將udp的資料長度控制項在548位元組(576-8-20)以內.

二、從ip封包總長度看

在ip頭中,封包總長度為 2 bytes也就是乙個ip包最多長度為65535個,這樣減去乙個ip頭,再減乙個udp頭就是65535- 20 - 8 = 65507個。

三、總結

從上面兩個來看,udp程式設計時最好不要超過1472(針對乙太網),如果要求不高,就算超過了1472了,也不可以超過65507,即包總大小不要超過64k

一次Mysql使用IN大資料量的優化記錄

mysql版本號是5.7.28,表a有390w條記錄,使用innodb引擎,其中varchar型別欄位mac已建立索引,索引方法為程式設計客棧b tree。b表僅有5000 條記錄。有一條sql指令是這樣寫的 select from a where mac in aa aa www.cppcns.c...

在進行UDP程式設計的時候,一次傳送多少bytes好

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

一種理想的大資料量分頁查詢方案

本文旨在介紹一種對資料庫中的大資料量 進行分頁查詢的實現方法,該方法對應用伺服器 資料庫伺服器 查詢客戶端的cpu和記憶體占用都較低,查詢速度較快,是乙個較為理想的分頁查詢實現方案。1 問題的提出 在軟體開發中,大資料量的查詢是乙個常見的問題,經常會遇到對大量資料進行查詢的場景。常見的對大資料量查詢...