buf存储器缓存

pbuf、mbuf和skbuff

在三种协议栈中,携带数据包的实现不同,但都采用链表形式。

pbuf是lwip的实现,作为一个轻量级协议栈,pbuf的结构体比较简单,但具有多种形式适用于不同场景。

mbuf是BSD的实现,通过小内存块和外部数据区域相结合,提高内存利用率,该实现强调内存效率和灵活性。

skbuff则是Linux的实现,采用引用计数机制,包含了数据包处理所需的各种元数据,如协议头部指针、时间戳、路由信息等,便于内核对数据包进行灵活操控。

skbuff的数据挂载具有两种实现,并使用union关键字修饰:一种是传统的链表,另一种是红黑树。

Linux中的协议栈实现是比较繁琐的,这与Linux是宏内核实现有关,协议栈中有大量的抽象层匹配,不过正因如此,Linux才能应对复杂的网络数据处理。

mbuf

mbuf共有四种,其中一种是mbuf簇。

mbuf簇

mbuf簇是一种固定大小的大块内存缓冲区,mbuf簇的大小通常为2KB或4KB,具体取决于系统的配置

M_PREPEND函数

该函数用于在给定的 mbufm 的开头添加 plen 字节的空间,如果头部空间不足,那么就会分配一个新的mbuf(新的mbuf在旧的之前),这个机制也与分片有关。当数据报大于MTU(链路层最大传输)时,就会产生分片,一旦一个分片丢失,那么整个数据报都无效了,UDP常常产生分片,即使丢失,重发即可。但在TCP协议中,分片应该被避免,因为TCP协议会重传整个IP层,不仅仅是重发这么简单。

复制代码
#define M_PREPEND(m, plen, how) do {                               \
    if (M_LEADINGSPACE(m) >= (plen)) {                             \
        (m)->m_data -= (plen);                                     \
        (m)->m_len += (plen);                                      \
        if ((m)->m_flags & M_PKTHDR)                               \
            (m)->m_pkthdr.len += (plen);                           \
    } else {                                                       \
        (m) = m_prepend((m), (plen), (how));                       \
    }                                                              \
} while (0)

其中M_LEADINGSPACE是计算mbuf簇前可用的空间,如果sosend函数将数据放到一个mbuf簇中,那么通常该簇前面有56个字节未使用,可以为IP,UDP等其他首部提供空间。

mtod函数

该函数十分简单,就是指针类型转换。

复制代码
#define mtod(m, t)    ((t)((m)->m_data))
相关推荐
CylMK3 分钟前
题解:UVA1218 完美的服务 Perfect Service
数据结构·c++·算法·深度优先·图论
坤坤藤椒牛肉面8 分钟前
ARM———UART
网络
丶小鱼丶12 分钟前
数据结构和算法之【阻塞队列】上篇
java·数据结构
凤年徐16 分钟前
封装红黑树实现 mymap 和 myset
网络·c++·算法
攻城狮在此17 分钟前
ping命令中TTL值是什么?详解与用法
linux·网络·windows
学术小白人18 分钟前
EI会议征稿!IEEE出版|第二届通信网络与智能系统工程国际会议(ICCNSE 2026)
网络·能源·电子电路·传感器技术·电气工程·rdlink研发家
zs宝来了21 分钟前
Redis 数据结构底层实现:intset、ziplist、skiplist 深度剖析
数据结构·redis·源码解析·skiplist·ziplist·intset
弹简特34 分钟前
【JavaSE-网络部分05】TCP 可靠性 + 高性能的三大核心机制:滑动窗口・流量控制・拥塞控制
网络·网络协议·tcp/ip
OPHKVPS37 分钟前
网络安全新威胁:开源AI平台CyberStrikeAI显著降低攻击门槛
大数据·网络·人工智能·安全
liuyao_xianhui43 分钟前
优选算法_topk问题_快速排序算法_堆_C++
java·开发语言·数据结构·c++·算法·链表·排序算法