一. 缘由

在网络数据包处理过程中,大量的包处理,就涉及到IP分片和重组。TCP/IP协议原理中,有对为什么要IP分片有描述。

在TCP/IP分层中,数据链路层用MTU(Maximum Transmission Unit,最大传输单元)来限制所能传输的数据包大小,MTU是指一次传送的数据最大长度,不包括数据链路层数据帧的帧头,如以太网的MTU为1500字节,实际上数据帧的最大长度为1512字节,其中以太网数据帧的帧头为12字节。

当发送的IP数据报的大小超过了MTU时,IP层就需要对数据进行分片,否则数据将无法发送成功。

二. 介绍

该库实现IPv4和IPv6包分片和重组。

1. 包分片

包分片程序将一个包分解为多个分片。rte_ipv4_fragment_packet()和rte_ipv6_fragment_packet()函数都假定输入mbuf数据指向分组的IP报头的开始(即L2报头已经被剥离)。

为避免实际包的拷贝,rte_pktmbuf_attach()使用了零拷贝技术。

对于么每个分片将创建两个新的mbufs结构:

Direct mbuf--mbuf将包含新分片的L3头部。

Indirect mbuf--mbuf将附加在原始数据包上。它的数据域指针指向原始数据包附加偏移的开始处。

L3 头部从原来mbuf结构中赋值到direct mbuf结构,并且更新分片状态。注意IPv4,头部校验和不会重新计算,且校验和置位0。

最后,通过mbuf的下一个文件将每个片段的“直接”和“间接”mbuf链接在一起,以构成新片段的数据包。

调用者有能力明确指定哪些mempools应用于从中分配“直接”和“间接”mbufs。

2. 包重组

2.1 IP分片表

分片表维持一个已经接受的包的分片信息。每个Ip 包有一个唯一的标识,通过三元组 源ip-目的ip-id。

注意:所有的更新和查找操作为非线程安全的。因此,如果不同的执行上下文(线程/进程)将同时访问同一个表,那么必须提供一些外部同步机制。

每个表条目能够持有信息关于包由多少分片组成( RTE_LIBRTE_IP_FRAG_MAX,默认为4)。

代码例子,说明一个分片表的创建:

     frag_cycles = (rte_get_tsc_hz() + MS_PER_S - 1) / MS_PER_S * max_flow_ttl;bucket_num = max_flow_num + max_flow_num / 4;frag_tbl = rte_ip_frag_table_create(max_flow_num, bucket_entries, max_flow_num, frag_cycles, socket_id);

内部分片表是一个简单的hash表。这个基本做法是用两个hash函数和桶条目组成。提供了2 * <bucket_entries>可能的位置为每个key的hash表。当发生冲突并且所有2 * <bucket_entries>都被占用时,ip_frag_tbl_add()只是返回失败,而不是将现有的Key重新插入到另外的位置。

而且,表中长于<max cycles>的条目也被认为是无效的,可以被新的条目删除/替换。

请注意,重新组合需要分配很多mbuf。在任何给定时间(2*bucket_entries*RTE_LIBRTE_IP_FRAG_MAX*<每个数据包的最大mbufs数>>)可以存储在等待剩余片段的Fragment Table中。

2.2 包重组

通过rte_ipv4_frag_reassemble_packet()/rte_ipv6_frag_reassemble_packet完成分片和重组处理。它们返回一个指向有效mbuf的指针,它包含重新组合的数据包,或者返回NULL(如果数据包由于某种原因而无法重新组合)。

这些函数负责:

1、用包的三元组(src_ip,dest_ip,id)搜索分片表。

2、如果条目发现,检查条目是否超时。如果超时,释放前面所有分片,然后移除关于这个条目的所有信息。

3、如果这个key没有找到相关条目,按照如下步骤 尝试创建一个新的:

a.用作空条目。

b.删除超时条目,释放相关mbufs,存储一个指定key的新条目。

4、用新的分片信息更新条目,并且检查一个包是否被重组。(这个包条目包含所有的分片)。

a.如果是,重组包,标记表的条目为空,并返回一个重组mbuf的调用。

b.如果不是,返回一个NULL给调用者。

如果在分组处理的任何阶段遇到错误(例如:不能将新条目插入片段表或无效/超时片段),则该函数将释放所有与分组片段相关联的标记表条目 作为无效并将NULL返回给调用者。

2.3 调试日志和统计收集

RTE_LIBRTE_IP_FRAG_TBL_STAT配置宏控制片段表的统计信息收集。此宏默认情况下未启用

RTE_LIBRTE_IP_FRAG_DEBUG控制IP片段处理和重新组装的调试日志记录。 默认情况下禁用此宏。 请注意,在日志记录包含大量详细信息时,会减慢数据包处理速度,并可能导致丢失大量数据包。

三. 源码

     /* if this is an IPv4 packet */if (m->ol_flags & PKT_RX_IPV4_HDR) {struct ipv4_hdr *ip_hdr;uint32_t ip_dst;/* Read the lookup key (i.e. ip_dst) from the input packet */ip_hdr = rte_pktmbuf_mtod(m, struct ipv4_hdr *);ip_dst = rte_be_to_cpu_32(ip_hdr->dst_addr);/* Find destination port */if (rte_lpm_lookup(rxq->lpm, ip_dst, &next_hop) == 0 &&(enabled_port_mask & 1 << next_hop) != 0) {port_out = next_hop;/* Build transmission burst for new port */len = qconf->tx_mbufs[port_out].len;}/* if we don't need to do any fragmentation */if (likely (IPV4_MTU_DEFAULT >= m->pkt_len)) {qconf->tx_mbufs[port_out].m_table[len] = m;len2 = 1;} else {len2 = rte_ipv4_fragment_packet(m,&qconf->tx_mbufs[port_out].m_table[len],(uint16_t)(MBUF_TABLE_SIZE - len),IPV4_MTU_DEFAULT,rxq->direct_pool, rxq->indirect_pool);/* Free input packet */rte_pktmbuf_free(m);/* If we fail to fragment the packet */if (unlikely (len2 < 0))return;}

原文链接:https://blog.csdn.net/pangyemeng/article/details/77644939

更多DPDK学习资料有需要的可以自行添加进入学习交流君 羊 793599096 免费获取,或自行报名学习,免费订阅,永久学习,关注我持续更新哦!!!

DPDK——IP分片和重组库相关推荐

  1. DPDK-IP分片和重组库

    0x01 缘由      在网络数据包处理过程中,大量的包处理,就涉及到IP分片和重组.TCP/IP协议原理中,有对为什么要IP分片有描述.      在TCP/IP分层中,数据链路层用MTU(Max ...

  2. linux系统下的ip分片程序,Linux下IP分片与重组

    Linux下IP――分片与重组 原理介绍 为一个数据包片再次分片 为数据包分片和为数据包片再次分片之间的细微差别就在于网关处理MF比特的不同.但一个网关为原来为分片的数据包分片时,除了末尾的数据包片, ...

  3. 71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 IP 协议又是最重要的协议之一.IP 协议是基于  ...

  4. linux 内核 丢弃分片包,LINUX内核关于IP分片重组问题请教

    最近研究学习IP分片重组,也拜读了不少dx的阅读理解.可还是有疑问,请教xdm. 源代码:linux-2.4.26\linux-2.4.26\net\ipv4\ip_fragment.c IP分片的重 ...

  5. 【最全面的】71张图详解IP 地址、IP 路由、分片和重组、三层转发、ARP、ICMP

    转发自: Original Fox 网络技术平台 目录 有小伙伴问:为什么没有配置 IP 地址就无法上网?IP 协议又是啥? 这要从 TCP/IP 协议说起,互联网使用的是 TCP/IP 协议,其中 ...

  6. 互联网协议 — IPv4 — 分片与重组

    目录 文章目录 目录 MTU IP 分片与重组 Path MTU Discovery(路径 MTU 发现) TCP 数据段的分片 UDP 数据段的分片 MTU 每种数据链路的 MTU(最大传输单元)都 ...

  7. IP协议详解【IP报文头部结构、IP分片、IP路由、IP转发】

    目录 IP协议:全称:Internet Protocol(网际互连协议) IP协议的特点: IP头部结构: IP分片: IP路由: IP转发: IP协议:全称:Internet Protocol(网际 ...

  8. TCP的分片和IP分片的区别

    IP分片与重组 在IP首部中,标识.标志.片偏移这三部分就是与分片的字段. MTU(最大传输单元) MTU前面已经说过了,是链路层中的网络对数据帧的一个限制,依然以以太网为例,MTU为1500个字节. ...

  9. IP协议详解(ip头部,ip分片,ip路由选择)

    IP协议是TCP/IP协议族中至关重要的协议,同时也是socker网络编程的基础之一.其中最重要的部分为 (1)ip头部信息:ip头部信息出现在每个ip报文数据报中,用于指定ip通信的远端ip地址,目 ...

  10. TCP/IP 协议难点之一—— IP分片

    1 IP协议简单介绍 就个人而言,网络中,抛开网络安全加密这些,就只单单讨论协议本身,比较难的有三个地方: IP分片与重组 TCP滑动窗口与TCP状态的改变 TCP定时器 其实协议本身根据<TC ...

最新文章

  1. 关于学习Python的一点学习总结(7->相关字符串操作)
  2. Java设计模式(20)——行为模式之命令模式(Command)
  3. C++ for循环跳过某一项求和
  4. class中一个小技巧
  5. 应用上云 2 小时烧掉近 50 万,创始人:差点破产,简直噩梦
  6. layer弹出层 获取index
  7. python optimize_SciPy优化optimize模块用法
  8. Citrix XenApp6.5 另类发布文档
  9. 智慧校园: 00 开发流程
  10. 22年全国数学建模比赛ABC题思路模型
  11. 抖音巨量千川是什么?和飞瓜智投有什么不同?后者功能更强大!
  12. 德尔玛递交注册:半年营收15亿 小米与欧派是股东
  13. hadoop和spark HA部署
  14. Web Service 自动生成代码报错
  15. MySQL将多条数据合并成一条
  16. 三国志手游挂机脚本 三国志辅助玩法介绍
  17. 京东数据中心主要基础设施系统(一)
  18. 微信小程序获取上一个页面的路由地址
  19. 原来在SOLIDWORKS中,把马鞍面填充为实体这么简单!
  20. 程序员如何提升个人的技术影响力

热门文章

  1. 三维激光雷达点云拼接
  2. 单龙芯3A3000-7A1000PMON研究学习-(30)撸起袖子干-再来一杯代码11-内存初始化3-mc_init
  3. 该死的强迫症,教你stm32怎么把杜邦线弄整齐
  4. 【Codecs系列】HEVC-SCC(四):SCC IBC句法
  5. html5分辨率异常自动检测
  6. ArcMap 小知识(16):栅格计算器 raster calculator
  7. 红旗河工程,南水北调西线工程,藏水入疆工程三合一
  8. NavMeshAgent参数及API
  9. java小程序坦克大战,小程序经典游戏,微信欢乐坦克大战攻略
  10. 写入clickhouse效率低总结