UDP中一個包的大小最大能多大?

前言

因爲UDP數據傳輸的無連接特性,最簡單的UDP數據傳輸就是一次數據交互一個UDP包搞定,這樣就不用管分包問題(因爲不像TCP,UDP傳輸時如果分包則是不能保證順序的,這會帶來很多問題)。

所以你一次交互的數據如果太多的話,用UDP實現就很可能並不優雅。

思考

在進行UDP編程的時候,我們最容易想到的問題就是,一次發送多少bytes好?
當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裏僅對像ICQ一類的發送聊天消息的情況作分析,對於其他情況,你或許也能得到一點幫助。

網絡原理

首先,我們知道,TCP/IP通常被認爲是一個四層協議系統:包括鏈路層、網絡層、運輸層、應用層 。

UDP屬於運輸層,下面我們由下至上一步一步來看。

結論1:局域網環境下,建議將UDP數據控制在1472字節以下

以太網(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字節以下爲好。

結論2:Internet編程時,建議將UDP數據控制在548字節以下

進行Internet編程時則不同,因爲Internet上的路由器可能會將MTU設爲不同的值。如果我們假定MTU爲1500來發送數據,而途經的某個網絡的MTU值小於1500字節,那麼系統將會使用一系列的機制來調整MTU值,使數據報能夠順利到達目的地,這樣就會做許多不必要的操作。

鑑於Internet上的標準MTU值爲576字節,所以我建議在進行Internet的UDP編程時, 最好將UDP的數據長度控件在548字節(576-8-20)以內。

這句話貌似有問題,unix網絡編程第一卷裏說:ipv4協議規定ip層的最小重組緩衝區大小爲576!所以,建議udp包不要超過這個大小,而不是因爲internet的標準MTU是576!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章