ip數(shù)據(jù)包的長(zhǎng)度是不是比以太網(wǎng)幀要長(zhǎng)?
1、數(shù)據(jù)鏈路層對(duì)數(shù)據(jù)幀的長(zhǎng)度都有一個(gè)限制,也就是鏈路層所能承受的最大數(shù)據(jù)長(zhǎng)度,這個(gè)值
稱為最大傳輸單元,即MTU。以以太網(wǎng)為例,這個(gè)值通常是1500字節(jié)。
2、對(duì)于IP數(shù)據(jù)包來(lái)講,也有一個(gè)長(zhǎng)度,在IP包頭中,以16位來(lái)描述IP包的長(zhǎng)度,也就是說(shuō),
一個(gè)IP包,最長(zhǎng)可能是65535字節(jié)。
3、結(jié)合以上兩個(gè)概念,第一個(gè)重要的結(jié)論就出來(lái)了,如果IP包的大小,起過(guò)了MTU值,那么就需要
分片,也就是把一個(gè)IP包分為多個(gè),這個(gè)概念非常容易理解,一個(gè)載重5T的卡車,要拉10T的貨,它
當(dāng)然就得分幾次來(lái)拉了。
4、IP分片是很多資料常講的內(nèi)容,但是我倒是覺得分不分片其實(shí)不重要,重要的是另一個(gè)東西。一個(gè)
數(shù)據(jù)包穿過(guò)一個(gè)大的網(wǎng)絡(luò),它其間會(huì)穿過(guò)多個(gè)網(wǎng)絡(luò),每個(gè)網(wǎng)絡(luò)的MTU值是不同的。我們可以設(shè)想,如果
接受/發(fā)送端都是以太網(wǎng),它們的MTU都是1500,我們假設(shè)發(fā)送的時(shí)候,數(shù)據(jù)包會(huì)以1500來(lái)封裝,然而,
不幸的是,傳輸中有一段X.25網(wǎng),它的MTU是576,這會(huì)發(fā)生什么呢?我想,這個(gè)才是我們所關(guān)心的。
當(dāng)然,結(jié)論是顯而易見的,這個(gè)數(shù)據(jù)包會(huì)被再次分片,咱開始用火車?yán)搅税肼罚煌ɑ疖嚕煌ㄆ嚕?/p>
那一車貨會(huì)被分為很多車……僅此而已,更重要的是,這種情況下,如果IP包被設(shè)置了“不允許分片標(biāo)志”,那
會(huì)發(fā)生些什么呢?對(duì),數(shù)據(jù)包將被丟棄,然事收到一份ICMP不可達(dá)差錯(cuò),告訴你,需要分片!
這個(gè)網(wǎng)絡(luò)中最小的MTU值,被稱為路徑MTU,我們應(yīng)該有一種有效的手段,來(lái)發(fā)現(xiàn)這個(gè)值,最笨的方法或許是先
用traceroute查看所有節(jié)點(diǎn),然后一個(gè)個(gè)ping……
5、到了傳輸層,也會(huì)有一個(gè)最大值的限制,當(dāng)然,對(duì)于只管發(fā),其它都不管的UDP來(lái)說(shuō),不再我們討論之列。這里
說(shuō)的是TCP協(xié)議。說(shuō)到大小,或許會(huì)讓人想到TCP著名的滑動(dòng)窗口的窗口大小,它跟收發(fā)兩端的緩存有關(guān),這里討論
的是傳輸?shù)淖畲髷?shù)據(jù)包大小,所以,它也不在討論之列。
TCP的選項(xiàng)字段中,有一個(gè)最大報(bào)文段長(zhǎng)度(MSS),表示了TCP傳往另一端的最大數(shù)據(jù)的長(zhǎng)度,當(dāng)一個(gè)連接立時(shí),連接
的雙方都要通告各自的MSS,也就是說(shuō),它說(shuō)是與TCP的SYN標(biāo)志在一起的。當(dāng)然,對(duì)于傳輸來(lái)講,總是希望MSS越大越好,
現(xiàn)在超載這么嚴(yán)重,誰(shuí)家不希望多拉點(diǎn)貨……但是,MSS總是有個(gè)限制的,也就是MTU-IP頭長(zhǎng)度-TCP頭長(zhǎng)度,對(duì)于以太網(wǎng)來(lái)講
它通常是1500-20-20=1460,雖然總是希望它能很大(如1460),但是大多數(shù)BSD實(shí)現(xiàn),它都是512的倍數(shù),如1024……
6、回到分片上來(lái),例如,在Win2000下執(zhí)行如下命令:
ping 192.168.0.1 -l 1473
按剛才的說(shuō)法,1473+20(ip頭)+8(icmp頭)=1501,則好大于1500,它會(huì)被分片,但是,我們關(guān)心的是:
這個(gè)數(shù)據(jù)包會(huì)被怎么樣分法?
可以猜想,第一個(gè)包是
以太頭+IP頭+ICMP頭+1427的數(shù)據(jù);
那第二個(gè)分片包呢?
它可以是:
以太頭+IP頭+ICMP頭+1個(gè)字節(jié)的數(shù)據(jù)
或者是:
以太頭+IP頭+1個(gè)字節(jié)的數(shù)據(jù)
也就是省去ICMP頭的封裝,當(dāng)然,IP頭是不可以省的,否則怎么傳輸了……
事實(shí)上,TCP/IP協(xié)議采用的是后一種封裝方式,這樣,一次可以節(jié)約8個(gè)字節(jié)的空間。IP包頭中,用了三個(gè)標(biāo)志來(lái)描述一個(gè)分片包:
1、分片標(biāo)志:如果一個(gè)包被分片了,被置于1,最后一個(gè)分片除外;——這樣,對(duì)于接收端來(lái)講,可以根據(jù)這個(gè)標(biāo)志位做為重組的重
要依據(jù)之一;
2、分片偏移標(biāo)志:光有一個(gè)標(biāo)志位說(shuō)明“自己是不是分片包”是不夠的,偏移標(biāo)志位說(shuō)明了自己這個(gè)分片拉于原始數(shù)據(jù)報(bào)的什么位置,
很明顯,這兩個(gè)標(biāo)志一結(jié)合,就很容易重組分片包了。
3、不允許分片標(biāo)志:如果數(shù)據(jù)包強(qiáng)行設(shè)置了這個(gè)標(biāo)志,那么在應(yīng)該分片的時(shí)候,…… err,剛才已經(jīng)說(shuō)過(guò)了