【轉】TCP分段與IP分區

來源:互聯網
上載者:User

標籤:ipv4   資料區段   分段   接收   端點   ip頭部   鏈路層   idt   關聯   

原文: :https://www.jianshu.com/p/f9a5b07d99a2

-------------------------------------------------------------------------------------

1、首先根據Ethernet II類型乙太網路框架格式可以得知,Ethernet II類型乙太網路幀的最小長度為64位元組,最大長度為1518位元組。(另外還有7位元組前置同步嗎+1位元組幀開始定界符是所有類型的乙太網路框架格式必要的)

乙太網路框架格式有四種類型,Ethernet II類型乙太網路框架格式是我通過WIRESHARK抓包後發現目前網路使用的框架格式類型。


 Ethernet II Ethernet II框架格式一開始我有個問題就是,根據TCP/IP的傳輸串流可以知道,HTTP響應報文是裝到TCP報文的資料區,TCP報文又是裝到IP報文的資料區,而最後IP報文是裝到乙太網路幀的資料區中。為什麼乙太網路幀的資料區最大長度為1500位元組,而HTTP報文最終是放在乙太網路幀的資料區中,卻沒有限制HTTP報文的大小?2、在WIRESHRAK抓包的時候會發現很多長度為1514的TCP報文,但是這個跟乙太網路幀的資料區最大長度為1518位元組有什麼關聯嗎?而且這個TCP長度為什麼是1460而不是1500 ? image.png

乙太網路封裝IP資料包的最大長度是1500位元組,也就是說乙太網路最大幀長應該是乙太網路首部加上1500,再加上7位元組的前置同步碼和1位元組的幀開始定界符,具體就是:7位元組前置同步嗎+1位元組幀開始定界符+6位元組的目的MAC+6位元組的源MAC+2位元組的框架類型+1500+4位元組的CRC校正。
按照上述,最大幀應該是1526位元組,但是實際上我們抓包得到的最大幀是1514位元組,為什麼不是1526位元組呢?原因是當資料幀到達網卡時,在物理層上網卡要先去掉前置同步碼和幀開始定界符,然後對幀進行CRC檢驗,如果幀校正和錯,就丟棄此幀。如果校正和正確,就判斷幀的目的硬體地址是否符合自己的接收條件(目的地址是自己的物理硬體地址、廣播位址、可接收的多播硬體地址等),如果符合,就將幀交“裝置驅動程式”做進一步處理。這時我們的抓包軟體才能抓到資料,因此,抓包軟體抓到的是去掉前置同步碼、幀開始分界符、CRC校正之外的資料,其最大值是6+6+2+1500=1514。
再說一下TCP報文內部的結構。
一個完整的資料包格式,是資料幀{IP包{TCP或UDP包{Data}}},如前所述{IP包{TCP或UDP包{Data}}}部分最大是1500位元組。那麼根據目前的IPv4協議,有如下規定:
IP首部,版本:4 ,包含源、目的IP、首部校正和,TTL等,共計20個位元組。TCP首部,包含源、目的連接埠,一系列指標、標誌、校正和等,共計20位元組,因此實際可用的資料為1500-20-20=1460位元組。

上面就解釋了抓包中的1514和1460的來曆。簡單來說就是1514指的是乙太網路幀去除掉一些符號位後的最大長度;1460指的是乙太網路幀的資料區去除掉TCP和IP的首部後所能儲存的最大資料長度,即是HTTP的整個請求或者響應報文。3、最後再來回答為什麼乙太網路幀的資料區最大長度為1500位元組,而HTTP報文最終是放在乙太網路幀的資料區中,卻沒有限制HTTP報文的大小?

TCP分段與IP分區
我們在學習TCP/IP協議時都知道,TCP報文段如果很長的話,會在發送時發生分段,在接受時進行重組,同樣IP資料報在長度超過一定值時也會發生分區,在接收端再將分區重組。

我們先來看兩個與TCP報文段分段和IP資料報分區密切相關的概念。

MTU(傳輸單元最大值)
MTU前面已經說過了,是鏈路層中的網路對資料幀的一個限制,依然以乙太網路為例,MTU為1500個位元組。一個IP資料報在乙太網路中傳輸,如果它的長度大於該MTU值,就要進行分區傳輸,使得每片資料報的長度小於MTU。分區傳輸的IP資料報不一定按序到達,但IP首部中的資訊能讓這些資料報片按序組裝。IP資料報的分區與重組是在網路層進完成的。

MSS(最大分段大小)
MSS是TCP裡的一個概念(首部的選項欄位中)。MSS是TCP資料包每次能夠傳輸的最大資料分段,TCP報文段的長度大於MSS時,要進行分段傳輸。TCP協議在建立串連的時候通常要協商雙方的MSS值,每一方都有用於通告它期望接收的MSS選項(MSS選項只出現在SYN報文段中,即TCP三向交握的前兩次)。MSS的值一般為MTU值減去兩個首部大小(需要減去IP資料包包頭的大小20Bytes和TCP資料區段的包頭20Bytes)所以如果用鏈路層乙太網路,MSS的值往往為1460。而Internet上標準的MTU(最小的MTU,鏈路層網路為x2.5時)為576,那麼如果不設定,則MSS的預設值就為536個位元組。很多時候,MSS的值最好取512的倍數。TCP報文段的分段與重組是在運輸層完成的。

到了這裡有一個問題自然就明了了,TCP分段的原因是MSS,IP分區的原因是MTU,由於一直有MSS<=MTU,很明顯,分段後的每一段TCP報文段再加上IP首部後的長度不可能超過MTU,因此也就不需要在網路層進行IP分區了。因此TCP報文段很少會發生IP分區的情況。

再來看UDP資料報,由於UDP資料報不會自己進行分段,因此當長度超過了MTU時,會在網路層進行IP分區。同樣,ICMP(在網路層中)同樣會出現IP分區情況。

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

另外,IP資料報分區後,只有第一片帶有UDP首部或ICMP首部,其餘的分區只有IP頭部,到了端點後根據IP頭部中的資訊再網路層進行重組。而TCP報文段的每個分段中都有TCP首部,到了端點後根據TCP首部的資訊在傳輸層進行重組。IP資料報分區後,只有到達目的地後才進行重組,而不是向其他網路通訊協定,在下一站就要進行重組。

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

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

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


 image.png image.png



晚歌y
連結:https://www.jianshu.com/p/f9a5b07d99a2
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

【轉】TCP分段與IP分區

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.