網絡幀的傳輸
本文主要簡單回顧一下網絡數據包的封裝、分片、傳輸以及重新組裝的過程,幫助我們理解實際的網絡傳輸。
注意,下文中的IP協議如果未作特殊說明指的實IPv4版本。
1. 網絡的分層
剛開始學網絡協議的時候,我們會學習OSI七層參考模型。 《Effective TCP/IP Programming》 這本書裏面提到一個技巧:Don’t Take the OSI Seven-Layer Reference Mode Too Seriously,翻譯過來就是不要把OSI七層參考模型太當回事。事實上,OSI七層參考模型只是理論上的標準,TCP/IP模型 纔是事實上的標準,因此下面的例子不會對OSI七層參考模型做過多的介紹,主要以TCP/IP四層模型爲依據的。
請看OSI七層參考模型與TCP/IP四層模型的對比圖,下圖對相應的層做了相關的映射。
說明:
- TCP/IP模型和OSI七層參考模型中的六層相對應;
- TCP/IP模型不包含OSI七層參考模型中的物理層,也就是不包含硬件;
- TCP/IP模型中的傳輸層、網際層和網絡接口層分別相當於OSI七層參考模型中傳輸層、網絡層和數據鏈路層;
- TCP/IP模型中的應用層相當於OSI七層參考模型中的應用層、表示層和會話層。
2.網絡幀的封裝
剛開始學習網絡協議的時候,一臉懵逼:
網絡協議的分層有什麼意義?
爲什麼還要分那麼多層?
可能大學時代翹課太多,導致這種疑惑一直持續到大學畢業以後,直到後來看了幾本有關網絡協議的書,有些疑惑才慢慢解開。下面還是以圖爲例描述網絡數據包的封裝。
請看下圖,以HTTP爲例,比較形象的說明了數據是怎麼經過層層封裝傳到網絡中,最後接收者又是怎樣經過層層解析獲取網絡數據包。
說明:
發送端在層與層之間傳輸數據時,每經過一層時必定會被打上一個該層所屬的首部信息。反之,接收端段在層與層傳輸數據時,每經過一層時會把對應的首部消去。
經過層層封裝之後,完整的數據包結構如下:
上圖只是一個網絡幀的大概結構,如果對IEEE 802.3規定的幀結構進行詳細講解需要比較長的篇幅,這裏不展開講。我們需要知道的是最終在網絡上以二進制流傳輸的結構大概如上圖所示。
術語說明:
這裏需要對幾個有關網絡包的術語進行說明,以區分每個術語具體指網絡幀的哪一部分。
下圖比較清楚說明了Segment、Packet、Frame的區別,很多文章和書籍並不嚴格區分Packet和Frame的區別。
Segment(數據段):傳輸層傳遞給網絡層的數據是一個段,它通常包含傳輸層頭和數據。
Packet(數據包):段數據+IP頭部=Packet(數據包)
Frame(幀):真正在網絡上傳輸的單元,以太網頭部+Packet+FCS=幀;下圖未具體標出以太網頭部和FCS。
3. 網絡幀的傳輸
網絡幀在網絡中的傳輸同樣是相對複雜的過程,涉及到組裝、分片、重組的過程。
1. 相關概念介紹
下面的概念是針對標準的以太網進行說明的,對於不同的網絡,最大傳輸單元並不相同。對於某些啓用巨幀的網絡,最大傳輸單元可以很大。
網絡幀在網絡上傳輸時有大小限制,無論是何種協議,除去以太網頭部和尾部,剩餘的大小都不能超過以太網規定的最大傳輸單元。
下圖以TCP爲例,較爲直觀的闡述了標準的以太網對網絡中數據大小的限制。
相關概念:
- MSS: 除去以太網頭尾部、IP頭部和傳輸層後剩下的大小。
- MTU: 除去以太網頭部和尾部剩下的網絡數據包的大小。就IPv4而言,標準的以太網MTU最大爲1500字節,最小爲576字節。
- TCP計算公式:
MTU(1500字節) = IP header + TCP Header + MSS = 20字節 + 20字節 + 1460字節- UDP計算公式:
MTU(1500字節) = IP header + UDP Header + MSS = 20字節 + 8字節 + 1472字節
2. 查看MTU大小
知道了MTU的概念後,就可以使用相應的命令查看系統中網卡的MTU大小。Windows、Linux以及路由器均可設置MTU大小,這裏只簡單的查看。
1).windows查看MTU
C:\Users\sunft>netsh interface ipv4 show subinterfaces
MTU MediaSenseState Bytes In Bytes Out Interface
------ --------------- --------- --------- -------------
1500 1 29039078516 1931385600 Ethernet
1500 5 0 0 Wi-Fi
4294967295 1 0 1009988 Loopback Pseudo-Interface 1
1500 5 0 0 Local Area Connection* 3
1500 5 0 0 Bluetooth Network Connection
1500 5 0 0 Local Area Connection* 2
1500 1 0 74847 VMware Network Adapter VMnet1
1500 1 0 40655 VMware Network Adapter VMnet8
說明:
除了路由器本地迴環接口外,其他的網卡MTU大小均爲1500字節。
2). Linux查看MTU
[sunft@localhost ~]$ ifconfig | grep mtu
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
說明:
除了lo網卡外,其他的網卡MTU大小均爲1500字節。
3. 數據包分片和重組
既然MTU不能超過1500字節,那麼對於MTU超過1500字節的數據包怎麼處理呢?
一般情況下,對於MTU超過1500字節的包,會在源機器或者傳輸途中的網絡設備進行分片,而重組只發生在目的機器。
注意:1500字節是針對一般的網絡設備而言,某些網絡設備的MTU可能大於或者小於1500字節。
1). 分片與重組規則
- 發送方根據自身的MTU大小確定是否分片;
- 數據幀在傳輸途中也可能發生分片,例如的路由器MTU小於1500字節;
- 數據幀有可能被直接丟棄,若數據包大小大於傳輸途中網絡設備的MTU,而該網絡設備沒有啓用分片機制;
- 重組只發生在目的機器。也就是說,即使中途遇到大於1500字節的網絡設備,該網絡設備也不會對分片進行重組,而是轉發給下一個網絡設備。
2) 分片與重組圖示
下圖比較形象的說明網絡數據包的分片與重組過程。
過程描述:
設備A的MTU爲3300字節,想要發送12000字節的數據給設備B,於是進行如下操作:
- 數據包大小>3300字節,於是分成4段進行傳輸;
- 遇到MTU爲1300字節的路由器A,於是繼續對每個包進行分片;
- 緊接着遇到MTU爲3300字節的路由器B,不進行組裝,轉發出去;
- 到達設備B,設備B對網絡數據包進行重組。
4. 相關疑問
讀完上面的內容,應該會有以下疑問,以下疑問就留着後續有時間再寫吧。
- 分片具體是怎麼進行的?過程是怎麼樣的?
- 組裝是按照怎樣的規則進行組裝的?
- 如果未被分片的包被丟棄會產生什麼後果?
參考材料
《The TCP/IP Guide》
《圖解HTTP》
《TCP/IP詳解 卷1:協議》
歡迎關注我的技術公衆號,一起學習技術!