IP數(shù)據(jù)包長度問題總結(jié)

TCP/IP協(xié)議,涉及到四層:鏈路層、網(wǎng)絡(luò)層、傳輸層、應(yīng)用層。

其中以太網(wǎng)的數(shù)據(jù)幀在鏈路層

IP包在網(wǎng)絡(luò)層

TCP或UDP包在傳輸層

TCP或UDP中的數(shù)據(jù)(Data)在應(yīng)用層

它們的關(guān)系是數(shù)據(jù)幀{IP包{TCP或者UDP包{Data}}}

————————————————————————————————

在應(yīng)用程序中我們用到的Data的長度最大是多少,直接取決于底層限制。

我們從下到上分析一下:

1.在鏈路層,由以太網(wǎng)的物理特性決定了數(shù)據(jù)幀的長度為(46+18)—(1500 + 18),其中的18是數(shù)據(jù)幀的頭和尾,也就是說數(shù)據(jù)幀的內(nèi)容最大為1500(不包括幀頭和幀尾),即MTU(Maximum Transmission Unit)為1500;

2.在網(wǎng)絡(luò)層,因?yàn)镮P包的首部要占用20字節(jié),所以這的MTU為1500-20 = 1480;

3.在傳輸層,對于UDP包的首部要占8字節(jié),所以這的MTU為1480 - 8 = 1472;

所以,在應(yīng)用層,您的Data最大長度為1472字節(jié)。(當(dāng)我們UDP包中的數(shù)據(jù)多于1472時,發(fā)送方的IP層需要分片fragmentation進(jìn)行傳輸,而在接收方IP層則需要進(jìn)行數(shù)據(jù)報重組,由于UDP是不可靠的傳輸協(xié)議,如果分片丟失導(dǎo)致重組失敗,將導(dǎo)致UDP數(shù)據(jù)包被丟棄。)

從上面的分析來看,普通的局域網(wǎng)環(huán)境下,UDP的數(shù)據(jù)最大是1472字節(jié)最好,避免分片重組。

但是在網(wǎng)絡(luò)編程中,Internet中的路由器可能設(shè)置成不同的值(小于默認(rèn)值),Internet上的標(biāo)準(zhǔn)MTU值為576,所以Internet的UDP編程時的數(shù)據(jù)長度最好在576 - 20 -8 = 548字節(jié)以內(nèi)。

Mac OS點(diǎn)擊系統(tǒng)偏好設(shè)置——網(wǎng)絡(luò)——高級——硬件可以查看本機(jī)的MTU設(shè)置。

IP數(shù)據(jù)包的最大長度是64K字節(jié)(2^16 -1),因?yàn)樵贗P包頭中用2個字節(jié)描述報文長度,2個字節(jié)所能表示的最大數(shù)字就是2^16-1 = 65536 -1 = 65535.

由于IP協(xié)議提供為上層協(xié)議分割和重組報文的功能,因此傳輸層協(xié)議的數(shù)據(jù)包長度原則上來說沒有限制。實(shí)際上限制還是有的,因?yàn)镮P包的標(biāo)識字段終究不可能無限長,按照IPv4,上限是2^32=4G字節(jié)。依照這種機(jī)制,TCP包頭中就沒有“包長度”字段,而完全依靠IP層去處理分幀。這就是為什么TCP常常被稱作一種“流協(xié)議”的原因,開發(fā)者在使用TCP服務(wù)的時候,不必關(guān)心數(shù)據(jù)包的大小,只需要將SOCKET看作一條數(shù)據(jù)流的入口,往里面放數(shù)據(jù)就是了,TCP協(xié)議本身會進(jìn)行擁塞/流量控制。

UDP則和TCP不同,UDP包頭內(nèi)有總長度字段,同樣為2個字節(jié),因此UDP數(shù)據(jù)包的總長度被限制為(2^16-1),這樣恰好可以放進(jìn)一個IP包內(nèi),使得UDP/IP協(xié)議棧的實(shí)現(xiàn)非常簡單高效。65535再減去UDP頭本身所占據(jù)的8個字節(jié),UDP服務(wù)中的最大有效負(fù)載長度僅為65527.這個值也就是調(diào)用getsockopt()時指定SO_MAC_MSG_SIZE所得到的返回值,任何使用SOCK_DGRAM屬性的socket,一次send的數(shù)據(jù)都不能超過這個值,否則必然得到一個錯誤。

那么,IP包提交給下層協(xié)議時將會得到怎樣的處理呢?取決于數(shù)據(jù)鏈路層協(xié)議,一般得到數(shù)據(jù)鏈路層協(xié)議都會負(fù)責(zé)將IP包分割成更小的幀,然后在目的端重組它,在EtherNet上,數(shù)據(jù)鏈路幀的大小如開篇所述。而如果是IP over ATM,則IP包將被切分成一個一個的ATM Cell,大小為53字節(jié)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容