> 技术文档 > IP报文分片与重组原理及实现分析_ip分片与重组过程

IP报文分片与重组原理及实现分析_ip分片与重组过程


IP报文分片与重组原理及实现分析

引用:

  1. ppp/net/packet/IPFragment.h
  2. ppp/net/packet/IPFragment.cpp
1. IP分片原理

当IP数据包大小超过MTU(最大传输单元)时,路由器/主机将其分割为多个片段传输,每个片段包含:

  • IP头信息(除分片相关字段外与原始包一致)
  • 分片控制字段
    • 标志位(Flags)
      • MF(More Fragments):表示后续还有分片
      • DF(Don’t Fragment):禁止分片
    • 分片偏移(Fragment Offset):以8字节为单位标识片段位置
原始IP包结构:+-----------------+-----------------------+| IP头(20-60字节) | 数据载荷 |+-----------------+-----------------------+分片后:分片1:+-----------------+---------+ (MF=1, Offset=0)分片2:+-----------------+---------+ (MF=1, Offset=N)...分片N:+-----------------+---------+ (MF=0, Offset=M)
2. 关键类关系图

#mermaid-svg-P4UsbGTGpxFDUJ2L {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-P4UsbGTGpxFDUJ2L .error-icon{fill:#552222;}#mermaid-svg-P4UsbGTGpxFDUJ2L .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-P4UsbGTGpxFDUJ2L .marker{fill:#333333;stroke:#333333;}#mermaid-svg-P4UsbGTGpxFDUJ2L .marker.cross{stroke:#333333;}#mermaid-svg-P4UsbGTGpxFDUJ2L svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-P4UsbGTGpxFDUJ2L g.classGroup text{fill:#9370DB;fill:#131300;stroke:none;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:10px;}#mermaid-svg-P4UsbGTGpxFDUJ2L g.classGroup text .title{font-weight:bolder;}#mermaid-svg-P4UsbGTGpxFDUJ2L .nodeLabel,#mermaid-svg-P4UsbGTGpxFDUJ2L .edgeLabel{color:#131300;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edgeLabel .label rect{fill:#ECECFF;}#mermaid-svg-P4UsbGTGpxFDUJ2L .label text{fill:#131300;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edgeLabel .label span{background:#ECECFF;}#mermaid-svg-P4UsbGTGpxFDUJ2L .classTitle{font-weight:bolder;}#mermaid-svg-P4UsbGTGpxFDUJ2L .node rect,#mermaid-svg-P4UsbGTGpxFDUJ2L .node circle,#mermaid-svg-P4UsbGTGpxFDUJ2L .node ellipse,#mermaid-svg-P4UsbGTGpxFDUJ2L .node polygon,#mermaid-svg-P4UsbGTGpxFDUJ2L .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-P4UsbGTGpxFDUJ2L .divider{stroke:#9370DB;stroke:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L g.clickable{cursor:pointer;}#mermaid-svg-P4UsbGTGpxFDUJ2L g.classGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-P4UsbGTGpxFDUJ2L g.classGroup line{stroke:#9370DB;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-P4UsbGTGpxFDUJ2L .classLabel .label{fill:#9370DB;font-size:10px;}#mermaid-svg-P4UsbGTGpxFDUJ2L .relation{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-P4UsbGTGpxFDUJ2L .dashed-line{stroke-dasharray:3;}#mermaid-svg-P4UsbGTGpxFDUJ2L #compositionStart,#mermaid-svg-P4UsbGTGpxFDUJ2L .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #compositionEnd,#mermaid-svg-P4UsbGTGpxFDUJ2L .composition{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #dependencyStart,#mermaid-svg-P4UsbGTGpxFDUJ2L .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #dependencyStart,#mermaid-svg-P4UsbGTGpxFDUJ2L .dependency{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #extensionStart,#mermaid-svg-P4UsbGTGpxFDUJ2L .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #extensionEnd,#mermaid-svg-P4UsbGTGpxFDUJ2L .extension{fill:#333333!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #aggregationStart,#mermaid-svg-P4UsbGTGpxFDUJ2L .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L #aggregationEnd,#mermaid-svg-P4UsbGTGpxFDUJ2L .aggregation{fill:#ECECFF!important;stroke:#333333!important;stroke-width:1;}#mermaid-svg-P4UsbGTGpxFDUJ2L .edgeTerminals{font-size:11px;}#mermaid-svg-P4UsbGTGpxFDUJ2L :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 使用 封装 封装 IPFragment -SubpackageTable:分片缓存 +Input() +Output() +Update() IPFrame +ToArray() +Parse() +Subpackages() IcmpFrame +ToIp() +Parse() UdpFrame +ToIp() +Parse()

3. 分片生成流程(Output)

#mermaid-svg-FqMCk92j4tD6PNbM {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-FqMCk92j4tD6PNbM .error-icon{fill:#552222;}#mermaid-svg-FqMCk92j4tD6PNbM .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-FqMCk92j4tD6PNbM .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-FqMCk92j4tD6PNbM .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-FqMCk92j4tD6PNbM .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-FqMCk92j4tD6PNbM .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-FqMCk92j4tD6PNbM .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-FqMCk92j4tD6PNbM .marker{fill:#333333;stroke:#333333;}#mermaid-svg-FqMCk92j4tD6PNbM .marker.cross{stroke:#333333;}#mermaid-svg-FqMCk92j4tD6PNbM svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-FqMCk92j4tD6PNbM .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FqMCk92j4tD6PNbM text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-FqMCk92j4tD6PNbM .actor-line{stroke:grey;}#mermaid-svg-FqMCk92j4tD6PNbM .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-FqMCk92j4tD6PNbM .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-FqMCk92j4tD6PNbM #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-FqMCk92j4tD6PNbM .sequenceNumber{fill:white;}#mermaid-svg-FqMCk92j4tD6PNbM #sequencenumber{fill:#333;}#mermaid-svg-FqMCk92j4tD6PNbM #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-FqMCk92j4tD6PNbM .messageText{fill:#333;stroke:#333;}#mermaid-svg-FqMCk92j4tD6PNbM .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FqMCk92j4tD6PNbM .labelText,#mermaid-svg-FqMCk92j4tD6PNbM .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-FqMCk92j4tD6PNbM .loopText,#mermaid-svg-FqMCk92j4tD6PNbM .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-FqMCk92j4tD6PNbM .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-FqMCk92j4tD6PNbM .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-FqMCk92j4tD6PNbM .noteText,#mermaid-svg-FqMCk92j4tD6PNbM .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-FqMCk92j4tD6PNbM .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FqMCk92j4tD6PNbM .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FqMCk92j4tD6PNbM .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-FqMCk92j4tD6PNbM .actorPopupMenu{position:absolute;}#mermaid-svg-FqMCk92j4tD6PNbM .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-FqMCk92j4tD6PNbM .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-FqMCk92j4tD6PNbM .actor-man circle,#mermaid-svg-FqMCk92j4tD6PNbM line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-FqMCk92j4tD6PNbM :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} App IPFragment IPFrame Network 调用Output(原始IP包) 调用Subpackages() 计算分片数量 创建新分片对象 设置MF/Offset 返回分片列表 loop [每个分片] 序列化分片 发送分片 App IPFragment IPFrame Network

4. 分片重组流程(Input)

#mermaid-svg-x26GHYw0qqELJKxK {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-x26GHYw0qqELJKxK .error-icon{fill:#552222;}#mermaid-svg-x26GHYw0qqELJKxK .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-x26GHYw0qqELJKxK .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-x26GHYw0qqELJKxK .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-x26GHYw0qqELJKxK .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-x26GHYw0qqELJKxK .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-x26GHYw0qqELJKxK .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-x26GHYw0qqELJKxK .marker{fill:#333333;stroke:#333333;}#mermaid-svg-x26GHYw0qqELJKxK .marker.cross{stroke:#333333;}#mermaid-svg-x26GHYw0qqELJKxK svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-x26GHYw0qqELJKxK .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-x26GHYw0qqELJKxK .cluster-label text{fill:#333;}#mermaid-svg-x26GHYw0qqELJKxK .cluster-label span{color:#333;}#mermaid-svg-x26GHYw0qqELJKxK .label text,#mermaid-svg-x26GHYw0qqELJKxK span{fill:#333;color:#333;}#mermaid-svg-x26GHYw0qqELJKxK .node rect,#mermaid-svg-x26GHYw0qqELJKxK .node circle,#mermaid-svg-x26GHYw0qqELJKxK .node ellipse,#mermaid-svg-x26GHYw0qqELJKxK .node polygon,#mermaid-svg-x26GHYw0qqELJKxK .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-x26GHYw0qqELJKxK .node .label{text-align:center;}#mermaid-svg-x26GHYw0qqELJKxK .node.clickable{cursor:pointer;}#mermaid-svg-x26GHYw0qqELJKxK .arrowheadPath{fill:#333333;}#mermaid-svg-x26GHYw0qqELJKxK .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-x26GHYw0qqELJKxK .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-x26GHYw0qqELJKxK .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-x26GHYw0qqELJKxK .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-x26GHYw0qqELJKxK .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-x26GHYw0qqELJKxK .cluster text{fill:#333;}#mermaid-svg-x26GHYw0qqELJKxK .cluster span{color:#333;}#mermaid-svg-x26GHYw0qqELJKxK div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-x26GHYw0qqELJKxK :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} MF=1 或 Offset>0 收到IP分片 分片检查 生成分片Key 查找/创建Subpackage 按Offset排序插入 是否连续且完整 重组数据包 等待更多分片 触发重组事件 更新超时时间

5. 关键数据结构

分片缓存表(SubpackageTable):

struct Subpackage { UInt64 FinalizeTime; // 超时时间戳 vector<IPFramePtr> Frames; // 有序分片列表};unordered_map<Int128, Subpackage::Ptr> IPV4_SUBPACKAGES_;

分片Key生成算法:

Int128 key = (Int128)Source | (Destination << 32) | (Id << 64);
6. 分片重组验证逻辑
bool fullFragementOffset = true;int nextOffset = 0;for (分片 in 有序列表) { if (分片.Offset != nextOffset) { fullFragementOffset = false; break; } nextOffset += 分片.Payload长度;}if (fullFragementOffset && 末片.MF==0) { // 执行重组}
7. 分片超时管理

#mermaid-svg-IFyx7zlZjyWVNCs7 {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .error-icon{fill:#552222;}#mermaid-svg-IFyx7zlZjyWVNCs7 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IFyx7zlZjyWVNCs7 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-IFyx7zlZjyWVNCs7 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IFyx7zlZjyWVNCs7 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IFyx7zlZjyWVNCs7 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IFyx7zlZjyWVNCs7 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .marker.cross{stroke:#333333;}#mermaid-svg-IFyx7zlZjyWVNCs7 svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IFyx7zlZjyWVNCs7 .mermaid-main-font{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-IFyx7zlZjyWVNCs7 .exclude-range{fill:#eeeeee;}#mermaid-svg-IFyx7zlZjyWVNCs7 .section{stroke:none;opacity:0.2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .section0{fill:rgba(102, 102, 255, 0.49);}#mermaid-svg-IFyx7zlZjyWVNCs7 .section2{fill:#fff400;}#mermaid-svg-IFyx7zlZjyWVNCs7 .section1,#mermaid-svg-IFyx7zlZjyWVNCs7 .section3{fill:white;opacity:0.2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .sectionTitle0{fill:#333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .sectionTitle1{fill:#333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .sectionTitle2{fill:#333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .sectionTitle3{fill:#333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .sectionTitle{text-anchor:start;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-IFyx7zlZjyWVNCs7 .grid .tick{stroke:lightgrey;opacity:0.8;shape-rendering:crispEdges;}#mermaid-svg-IFyx7zlZjyWVNCs7 .grid .tick text{font-family:\"trebuchet ms\",verdana,arial,sans-serif;fill:#333;}#mermaid-svg-IFyx7zlZjyWVNCs7 .grid path{stroke-width:0;}#mermaid-svg-IFyx7zlZjyWVNCs7 .today{fill:none;stroke:red;stroke-width:2px;}#mermaid-svg-IFyx7zlZjyWVNCs7 .task{stroke-width:2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskText{text-anchor:middle;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutsideRight{fill:black;text-anchor:start;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutsideLeft{fill:black;text-anchor:end;}#mermaid-svg-IFyx7zlZjyWVNCs7 .task.clickable{cursor:pointer;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskText.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163!important;font-weight:bold;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskText0,#mermaid-svg-IFyx7zlZjyWVNCs7 .taskText1,#mermaid-svg-IFyx7zlZjyWVNCs7 .taskText2,#mermaid-svg-IFyx7zlZjyWVNCs7 .taskText3{fill:white;}#mermaid-svg-IFyx7zlZjyWVNCs7 .task0,#mermaid-svg-IFyx7zlZjyWVNCs7 .task1,#mermaid-svg-IFyx7zlZjyWVNCs7 .task2,#mermaid-svg-IFyx7zlZjyWVNCs7 .task3{fill:#8a90dd;stroke:#534fbc;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutside0,#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutside2{fill:black;}#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutside1,#mermaid-svg-IFyx7zlZjyWVNCs7 .taskTextOutside3{fill:black;}#mermaid-svg-IFyx7zlZjyWVNCs7 .active0,#mermaid-svg-IFyx7zlZjyWVNCs7 .active1,#mermaid-svg-IFyx7zlZjyWVNCs7 .active2,#mermaid-svg-IFyx7zlZjyWVNCs7 .active3{fill:#bfc7ff;stroke:#534fbc;}#mermaid-svg-IFyx7zlZjyWVNCs7 .activeText0,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeText1,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeText2,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeText3{fill:black!important;}#mermaid-svg-IFyx7zlZjyWVNCs7 .done0,#mermaid-svg-IFyx7zlZjyWVNCs7 .done1,#mermaid-svg-IFyx7zlZjyWVNCs7 .done2,#mermaid-svg-IFyx7zlZjyWVNCs7 .done3{stroke:grey;fill:lightgrey;stroke-width:2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .doneText0,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneText1,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneText2,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneText3{fill:black!important;}#mermaid-svg-IFyx7zlZjyWVNCs7 .crit0,#mermaid-svg-IFyx7zlZjyWVNCs7 .crit1,#mermaid-svg-IFyx7zlZjyWVNCs7 .crit2,#mermaid-svg-IFyx7zlZjyWVNCs7 .crit3{stroke:#ff8888;fill:red;stroke-width:2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCrit0,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCrit1,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCrit2,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCrit3{stroke:#ff8888;fill:#bfc7ff;stroke-width:2;}#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCrit0,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCrit1,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCrit2,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCrit3{stroke:#ff8888;fill:lightgrey;stroke-width:2;cursor:pointer;shape-rendering:crispEdges;}#mermaid-svg-IFyx7zlZjyWVNCs7 .milestone{transform:rotate(45deg) scale(0.8,0.8);}#mermaid-svg-IFyx7zlZjyWVNCs7 .milestoneText{font-style:italic;}#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCritText0,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCritText1,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCritText2,#mermaid-svg-IFyx7zlZjyWVNCs7 .doneCritText3{fill:black!important;}#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCritText0,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCritText1,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCritText2,#mermaid-svg-IFyx7zlZjyWVNCs7 .activeCritText3{fill:black!important;}#mermaid-svg-IFyx7zlZjyWVNCs7 .titleText{text-anchor:middle;font-size:18px;fill:#333;font-family:\'trebuchet ms\',verdana,arial,sans-serif;font-family:var(--mermaid-font-family);}#mermaid-svg-IFyx7zlZjyWVNCs7 :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;} 0 5 10 15 20 25 30 35 40 分片到达 定时扫描 等待重组 定时扫描 超时清除 定时扫描 分片生命周期 清理任务 分片超时管理

8. 分片/重组性能优化
  1. 内存管理

    • 使用BufferswapAllocator减少内存碎片
    • 分片数据共享原始缓冲区(wrap_shared_pointer)
  2. 算法优化

    • 分片插入使用二分查找(O(log n))
    • 重组检查使用增量偏移计算
  3. 安全防护

    • 分片超时强制清理(默认1秒)
    • 分片偏移范围校验
9. 协议处理差异
协议 封装方式 校验机制 ICMP 直接封装在IP载荷中 标准IP校验和 UDP 伪头部参与校验和计算 包含源/目的IP的校验和 TCP (未展示) 需要序列号重组 复杂流重组逻辑
10. 关键代码实现

分片生成核心逻辑:

int IPFrame::Subpackages(vector<IPFramePtr>& out, const IPFramePtr& packet) { while (剩余数据 > MTU) { auto fragment = make_shared<IPFrame>(); fragment->Flags = IPFlags::IP_MF; // 设置MF标志 fragment->SetFragmentOffset(current_offset); // ... 数据切割 ... out.push_back(fragment); } // 处理最后分片(清除MF标志)}

重组缓冲区构建:

MemoryStream ms(buffer, total_size);for (auto& frame : subpackage->Frames) { ms.Write(frame->Payload->Buffer, frame->Payload->Length);}
总结

该实现完整覆盖了IP分片/重组核心功能:

  1. 分片生成:按MTU切割数据,动态设置MF/Offset
  2. 分片重组:基于五元组Key缓存,有序验证连续性
  3. 资源管理:智能指针自动释放+超时清理
  4. 协议支持:统一处理ICMP/UDP等上层协议

改进建议:

  • 增加分片重叠处理(RFC815)
  • 实现分片攻击防护(如偏移量验证)
  • 支持IPv6分片扩展头