從“碎片化”到“完美重組”:IP報文的分片藝術

前言
????????在網絡通信中,當IP層需要傳輸的數據包大小超過數據鏈路層的MTU限制時,就必須進行分片處理。本文將完整解析IP分片的工作機制,包括分片字段的作用、如何減少分片,以及分片報文的組裝原理。

IP報頭解析請參考:子網劃分核心原理 (網絡原理1)-CSDN博客

????????在上一期的IP報頭解析文章中,我們遺留了幾個關鍵字段未作詳述,即16位標識符、3位標志位以及13位片偏移量。這些字段實際上與IP分片和組裝機制緊密相關,本章將對此展開詳盡講解。

一、什么是分片技術?

????????由于物理介質等因素的限制,數據鏈路層規定從上層接收下來的完整報文大小不超過MTU(最大的傳送單元),標準通常是1500字節就像寄包裹時不能超過1kg,需要我們分成小塊寄

????????如果從IP層傳下來的超過MTU就需要分片發送。到了對端IP層會再進行組裝。

????????分片并不是一件好事,分片會增加丟包率——任意一個分片丟失都會導致整個報文失效。舉個例子,假設報文的丟包率為1%,而一個報文被分成10份。要保證每一個報文都收到,才算不丟包,那么丟包率就變為1-99%^10,最后丟包率變為10%左右。

????????所以分片和組裝不是主流,是被迫為之,不是“原罪”。既然分片有顯著弊端,如何減少?關鍵在哪一層控制?

????????為什么說IP分片是被迫為之,傳輸層并不關心報文大小,只管將數據傳給網絡層,最終必須交付給對端傳輸層。而數據鏈路層的標準是不能超過1500字節,那么網絡層夾在中間就很為難,需要自己解決這個問題,所以有了分片技術,在IP層分片交付到對端IP層在進行組裝。分片技術的分與組均由網絡層獨立完成,與其他層解耦。

? ? ? ? 所以要減少分片,即IP層的工作。那么就要從數據鏈路層的下手。

? ? ? ? 怎么控制傳輸層數據量減少分片?MTU為1500字節,去掉IP報頭20字節,那么從傳輸層傳輸下來的報文就要控制在1480字節以下。去掉傳輸層報頭20字節,那么從發送緩存區取的報文就要控制在1460字節(稱為MSS 最大段尺寸)以下。

????????而數據發送多少又跟滑動窗口有關。滑動窗口里面的數據是分段發送的,而不是大塊數據一次性發送,就是在控制數據發送量減少分片。

關于滑動窗口講解:TCP協議可靠性設計的核心機制與底層邏輯-CSDN博客

注意:不同鏈路層有自己的?MTU,網絡層需要兼容。

二、IP報頭分片字段作用:

  • 16位標識:相同報文分出來的分片包標識相同,不同報文及它們的分片包不同。該字段是用來把分片包分類的。
  • 3位標志:
    • 第1位:未來功能擴展是使用。
    • 第2位:是否禁止分片(1表示禁止分片,被禁止分片的報文超過MTU直接丟包),通常都是設位0。
    • 第3位:更多分片。表示是否有更多分片,1表是有更多分片,0表示最后一分片。
  • 13位片偏移:表示當前分片包在第一個分片包的相對偏移位置。

三、如何分片和組裝?

接下來講解分片是如何組裝的,理解如何組裝,如何分片自然就能理解。

首先需要甄別出是否是分片報文?

????????看3位標志的第三位,如果是1,那么它100%是分片報文。如果是0我們還不能確定,需要繼續看13位片偏移,如果不為0則就是分片報文(而且是最后一片)。對立的,如果3位標第3位為0,且13位片偏移為0則不是分片報文。

? ? ? ? 確定它是分片報文后,通過16位標識把它分類(相同報文的放在一起)。

怎么判斷分片報文是否已經收全了?(或是否有丟失?)

劃分為三種情況檢測,第一片,中間片,最后一片。

  • 如果有13位片偏移為0的分片報文,則第一片沒有丟失。
  • 3位標志的第三位,如果是0的分片報文,則最后一片沒有丟失。
  • 判斷中間片是否丟失可以把所有分片報文按13位片偏移排序(升序),13位片偏移+自己的報文長度就是下一片的13位片偏移,如果找不到對應的片,那就是丟失了。

如何組裝?

????????按13位片偏移升序排序后直接拼接就好。

非常感謝您能耐心讀完這篇文章。倘若您從中有所收獲,還望多多支持呀!74c0781738354c71be3d62e05688fecc.png

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91915.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91915.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91915.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[GESP202306 四級] 2023年6月GESP C++四級上機題超詳細題解,附帶講解視頻!

本文為2023年6月GESP C四級的上機題目的詳細題解!覺得寫的不錯或者有幫助可以點個贊啦! (第一次講解視頻,有問題可以指出,不足之處也可以指出) 目錄 題目一講解視頻: 題目二講解視頻: 題目一: 幸運數 題目大意: …

內網穿透 FRP 配置指南

關鍵詞:內網穿透、FRP配置、frps、frpc、遠程訪問、自建服務器、反向代理、TCP轉發、HTTP轉發 在開發或部署項目時,我們經常遇到內網設備無法被公網訪問的問題,例如你想從外網訪問你家里的 NAS、遠程調試開發板,或是訪問本地測試環…

SpringBoot 信用卡檢測、OpenAI gym、OCR結合、DICOM圖形處理、知識圖譜、農業害蟲識別實戰

信用卡欺詐檢測通常使用公開數據集 數據準備與預處理 信用卡欺詐檢測通常使用公開數據集如Kaggle的信用卡交易數據集。數據預處理包括處理缺失值、標準化數值特征、處理類別特征。在Spring Boot中,可以使用pandas或sklearn進行數據預處理。 // 示例:使用Spring Boot讀取CS…

使用 Docker 部署 Golang 程序

Docker 是部署 Golang 應用程序的絕佳方式,它可以確保環境一致性并簡化部署流程。以下是完整的指南: 1. 準備 Golang 應用程序 首先確保你的 Go 應用程序可以正常構建和運行。一個簡單的示例 main.go: package mainimport ("fmt""net/http" )func ha…

從零開始的CAD|CAE開發: LBM源碼實現分享

起因:上期我們寫了流體仿真的經典案例: 通過LBM,模擬計算渦流的形成,當時承諾: 只要驗證通過,就把代碼開源出來;ok.驗證通過了,那么我也就將代碼全都貼出來代碼開源并貼出:public class LidDrivenCavityFlow : IDisposable{public LidDrivenCavityFlow(int width 200, int hei…

倉庫管理系統-17-前端之物品類型管理

文章目錄 1 表設計(goodstype) 2 后端代碼 2.1 Goodstype.java 2.2 GoodstypeMapper.java 2.3 GoodstypeService.java 2.4 GoodstypeServiceImpl.java 2.5 GoodstypeController.java 3 前端代碼 3.1 goodstype/GoodstypeManage.vue 3.2 添加菜單 3.3 頁面顯示 1、goodstype表設…

共識算法深度解析:PoS/DPoS/PBFT對比與Python實現

目錄 共識算法深度解析:PoS/DPoS/PBFT對比與Python實現 1. 引言:區塊鏈共識的核心挑戰 2. 共識算法基礎 2.1 核心設計維度 2.2 關鍵評估指標 3. PoS(權益證明)原理與實現 3.1 核心機制 3.2 Python實現 4. DPoS(委托權益證明)原理與實現 4.1 核心機制 4.2 Python實現 5. P…

3.JVM,JRE和JDK的關系是什么

3.JVM,JRE和JDK的關系是什么 1.JDK(Java Development Kit),是功能齊全的Java SDK,包含JRE和一些開發工具(比如java.exe,運行工具javac.exe編譯工具,生成.class文件,javaw.exe,大多用…

深度學習技術發展思考筆記 || 一項新技術的出現,往往是為了解決先前范式中所暴露出的特定局限

深度學習領域的技術演進,遵循著一個以問題為導向的迭代規律。一項新技術的出現,往往是為了解決先前范式中所暴露出的特定局限。若將這些新技術看作是針對某個問題的“解決方案”,便能勾勒出一條清晰的技術發展脈絡。 例如,傳統的前…

Promise的reject處理: then的第二個回調 與 catch回調 筆記250804

Promise的reject處理: then的第二個回調 與 catch回調 筆記250804 Promise 錯誤處理深度解析:then 的第二個回調 vs catch 在 JavaScript 的 Promise 鏈式調用中,錯誤處理有兩種主要方式:.then() 的第二個回調函數和 .catch() 方法。這兩種方…

Maven模塊化開發與設計筆記

1. 模塊化開發模塊化開發是將大型應用程序拆分成多個小模塊的過程,每個模塊負責不同的功能。這有助于降低系統復雜性,提高代碼的可維護性和可擴展性。2. 聚合模塊聚合模塊(父模塊)用于組織和管理多個子模塊。它定義了項目的全局配…

sqli-labs:Less-21關卡詳細解析

1. 思路🚀 本關的SQL語句為: $sql"SELECT * FROM users WHERE username($cookee) LIMIT 0,1";注入類型:字符串型(單引號、括號包裹)、GET操作提示:參數需以)閉合關鍵參數:cookee p…

大模型+垂直場景:技術縱深、場景適配與合規治理全景圖

大模型垂直場景:技術縱深、場景適配與合規治理全景圖??核心結論?:2025年大模型落地已進入“深水區”,技術價值需通過 ?領域縱深(Domain-Deep)?、數據閉環(Data-Driven)?、部署友好&#x…

Kotlin Daemon 簡介

Kotlin Daemon 是 Kotlin 編譯器的一個后臺進程,旨在提高編譯性能。它通過保持編譯環境的狀態來減少每次編譯所需的啟動時間,從而加快增量編譯的速度。 Kotlin Daemon 的主要功能增量編譯: 只編譯自上次編譯以來發生更改的文件,節…

鴻蒙南向開發 編寫一個簡單子系統

文章目錄 前言給設備,編寫一個簡單子系統總結 一、前言 對于應用層的開發,搞了十幾年,其實已經有點開發膩的感覺了,翻來覆去,就是調用api,頁面實現,最多就再加個性能優化,但對底層…

超詳細:2026年博士申請時間線

博士申請是一場持久戰,需要提前規劃。那么,如何科學安排2026年博士申請時間線?SCI論文發表的最佳時間節點是什么?今天給所有打算申博的同學們,詳細解析下,每個時間節點的重點內容。2025年4月:是…

Python爬蟲實戰:研究tproxy代理工具,構建電商數據采集系統

1. 引言 1.1 研究背景 在大數據與人工智能技術快速發展的背景下,網絡數據已成為企業決策、學術研究、輿情監控的核心資源。據 Statista 統計,2024 年全球互聯網數據總量突破 180ZB,其中 80% 為非結構化數據,需通過爬蟲技術提取與轉化。Python 憑借其簡潔語法與豐富的爬蟲…

HighgoDB查詢慢SQL和阻塞SQL

文章目錄環境文檔用途詳細信息環境 系統平臺:N/A 版本:6.0,5.6.5,5.6.4,5.6.3,5.6.1,4.5.2,4.5,4.3.4.9,4.3.4.8,4.3.4.7,4.3.4.6,4.3.4.5,4.3.4.4,4.3.4.3,4.3.4.2,4.3.4,4.7.8,4.7.7,4.7.6,4.7.5,4.3.2 文檔用途 本文介紹了如何對數據庫日志進行分析…

day15 SPI

1串行外設接口概述1.1基本概念SPI(串行外設接口)是一種高速、全雙工、同步的串行通信協議。串行外設接口一般是需要4根線來進行通信(NSS、MISO、MOSI、SCK),但是如果打算實現單向通信(最少3根線&#xff09…

阿里云微服務引擎 MSE 及 API 網關 2025 年 7 月產品動態

點擊此處,了解微服務引擎 MSE 產品詳情。