TCP分段與IP分片

1、首先根據(jù)Ethernet II類型以太網(wǎng)幀格式可以得知,Ethernet II類型以太網(wǎng)幀的最小長度為64字節(jié),最大長度為1518字節(jié)。(另外還有7字節(jié)前導同步嗎+1字節(jié)幀開始定界符是所有類型的以太網(wǎng)幀格式必要的)

以太網(wǎng)幀格式有四種類型,Ethernet II類型以太網(wǎng)幀格式是我通過WIRESHARK抓包后發(fā)現(xiàn)目前網(wǎng)絡使用的幀格式類型。


Ethernet II
Ethernet II幀格式
一開始我有個問題就是,根據(jù)TCP/IP的傳輸流可以知道,HTTP響應報文是裝到TCP報文的數(shù)據(jù)區(qū),TCP報文又是裝到IP報文的數(shù)據(jù)區(qū),而最后IP報文是裝到以太網(wǎng)幀的數(shù)據(jù)區(qū)中。為什么以太網(wǎng)幀的數(shù)據(jù)區(qū)最大長度為1500字節(jié),而HTTP報文最終是放在以太網(wǎng)幀的數(shù)據(jù)區(qū)中,卻沒有限制HTTP報文的大?。?/h5>

2、在WIRESHRAK抓包的時候會發(fā)現(xiàn)很多長度為1514的TCP報文,但是這個跟以太網(wǎng)幀的數(shù)據(jù)區(qū)最大長度為1518字節(jié)有什么關(guān)聯(lián)嗎?而且這個TCP長度為什么是1460而不是1500 ?

image.png

以太網(wǎng)封裝IP數(shù)據(jù)包的最大長度是1500字節(jié),也就是說以太網(wǎng)最大幀長應該是以太網(wǎng)首部加上1500,再加上7字節(jié)的前導同步碼和1字節(jié)的幀開始定界符,具體就是:7字節(jié)前導同步嗎+1字節(jié)幀開始定界符+6字節(jié)的目的MAC+6字節(jié)的源MAC+2字節(jié)的幀類型+1500+4字節(jié)的CRC校驗。
按照上述,最大幀應該是1526字節(jié),但是實際上我們抓包得到的最大幀是1514字節(jié),為什么不是1526字節(jié)呢?原因是當數(shù)據(jù)幀到達網(wǎng)卡時,在物理層上網(wǎng)卡要先去掉前導同步碼和幀開始定界符,然后對幀進行CRC檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬件地址是否符合自己的接收條件(目的地址是自己的物理硬件地址、廣播地址、可接收的多播硬件地址等),如果符合,就將幀交“設備驅(qū)動程序”做進一步處理。這時我們的抓包軟件才能抓到數(shù)據(jù),因此,抓包軟件抓到的是去掉前導同步碼、幀開始分界符、CRC校驗之外的數(shù)據(jù),其最大值是6+6+2+1500=1514。
再說一下TCP報文內(nèi)部的結(jié)構(gòu)。
一個完整的數(shù)據(jù)包格式,是數(shù)據(jù)幀{IP包{TCP或UDP包{Data}}},如前所述{IP包{TCP或UDP包{Data}}}部分最大是1500字節(jié)。那么根據(jù)目前的IPv4協(xié)議,有如下規(guī)定:
IP首部,版本:4 ,包含源、目的IP、首部校驗和,TTL等,共計20個字節(jié)。TCP首部,包含源、目的端口,一系列指針、標志、校驗和等,共計20字節(jié),因此實際可用的數(shù)據(jù)為1500-20-20=1460字節(jié)。

上面就解釋了抓包中的1514和1460的來歷。簡單來說就是1514指的是以太網(wǎng)幀去除掉一些符號位后的最大長度;1460指的是以太網(wǎng)幀的數(shù)據(jù)區(qū)去除掉TCP和IP的首部后所能存儲的最大數(shù)據(jù)長度,即是HTTP的整個請求或者響應報文。

3、最后再來回答為什么以太網(wǎng)幀的數(shù)據(jù)區(qū)最大長度為1500字節(jié),而HTTP報文最終是放在以太網(wǎng)幀的數(shù)據(jù)區(qū)中,卻沒有限制HTTP報文的大???

TCP分段與IP分片
我們在學習TCP/IP協(xié)議時都知道,TCP報文段如果很長的話,會在發(fā)送時發(fā)生分段,在接受時進行重組,同樣IP數(shù)據(jù)報在長度超過一定值時也會發(fā)生分片,在接收端再將分片重組。

我們先來看兩個與TCP報文段分段和IP數(shù)據(jù)報分片密切相關(guān)的概念。

MTU(最大傳輸單元)
MTU前面已經(jīng)說過了,是鏈路層中的網(wǎng)絡對數(shù)據(jù)幀的一個限制,依然以以太網(wǎng)為例,MTU為1500個字節(jié)。一個IP數(shù)據(jù)報在以太網(wǎng)中傳輸,如果它的長度大于該MTU值,就要進行分片傳輸,使得每片數(shù)據(jù)報的長度小于MTU。分片傳輸?shù)腎P數(shù)據(jù)報不一定按序到達,但IP首部中的信息能讓這些數(shù)據(jù)報片按序組裝。IP數(shù)據(jù)報的分片與重組是在網(wǎng)絡層進完成的。

MSS(最大分段大小)
MSS是TCP里的一個概念(首部的選項字段中)。MSS是TCP數(shù)據(jù)包每次能夠傳輸?shù)淖畲髷?shù)據(jù)分段,TCP報文段的長度大于MSS時,要進行分段傳輸。TCP協(xié)議在建立連接的時候通常要協(xié)商雙方的MSS值,每一方都有用于通告它期望接收的MSS選項(MSS選項只出現(xiàn)在SYN報文段中,即TCP三次握手的前兩次)。MSS的值一般為MTU值減去兩個首部大?。ㄐ枰獪p去IP數(shù)據(jù)包包頭的大小20Bytes和TCP數(shù)據(jù)段的包頭20Bytes)所以如果用鏈路層以太網(wǎng),MSS的值往往為1460。而Internet上標準的MTU(最小的MTU,鏈路層網(wǎng)絡為x2.5時)為576,那么如果不設置,則MSS的默認值就為536個字節(jié)。很多時候,MSS的值最好取512的倍數(shù)。TCP報文段的分段與重組是在運輸層完成的。

到了這里有一個問題自然就明了了,TCP分段的原因是MSS,IP分片的原因是MTU,由于一直有MSS<=MTU,很明顯,分段后的每一段TCP報文段再加上IP首部后的長度不可能超過MTU,因此也就不需要在網(wǎng)絡層進行IP分片了。因此TCP報文段很少會發(fā)生IP分片的情況。

再來看UDP數(shù)據(jù)報,由于UDP數(shù)據(jù)報不會自己進行分段,因此當長度超過了MTU時,會在網(wǎng)絡層進行IP分片。同樣,ICMP(在網(wǎng)絡層中)同樣會出現(xiàn)IP分片情況。

總結(jié):UDP不會分段,就由IP來分。TCP會分段,當然就不用IP來分了!

另外,IP數(shù)據(jù)報分片后,只有第一片帶有UDP首部或ICMP首部,其余的分片只有IP頭部,到了端點后根據(jù)IP頭部中的信息再網(wǎng)絡層進行重組。而TCP報文段的每個分段中都有TCP首部,到了端點后根據(jù)TCP首部的信息在傳輸層進行重組。IP數(shù)據(jù)報分片后,只有到達目的地后才進行重組,而不是向其他網(wǎng)絡協(xié)議,在下一站就要進行重組。

最后一點,對IP分片的數(shù)據(jù)報來說,即使只丟失一片數(shù)據(jù)也要重新傳整個數(shù)據(jù)報(既然有重傳,說明運輸層使用的是具有重傳功能的協(xié)議,如TCP協(xié)議)。這是因為IP層本身沒有超時重傳機制------由更高層(比如TCP)來負責超時和重傳。當來自TCP報文段的某一段(在IP數(shù)據(jù)報的某一片中)丟失后,TCP在超時后會重發(fā)整個TCP報文段,該報文段對應于一份IP數(shù)據(jù)報(可能有多個IP分片),沒有辦法只重傳數(shù)據(jù)報中的一個數(shù)據(jù)分片。

所以之所以卻沒有限制HTTP報文的大小,是因為在傳輸層中已經(jīng)由TCP對HTTP報文做了分段傳輸,達到目標地址后再對所有TCP段進行重組。

下面看一個HTTP包可知,如果HTTP報文過大,會由TCP自動進行分段,這個過程對于應用層來說是透明的。


image.png
image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容