linux 网卡zero copy 学习总结



linux 2.6版的内核,网络数据从网线到应用程序需经过3次copy,分别是:

1. 网线上的电信号经过网卡驱DMA到网卡的环形FIFO里;
2. 从网卡的接收环形FIFO里copy到TCP/IP协议栈的sk_buff里;
3. 应用程序的socket调用recv()函数从协议栈的buffer里copy到用户进程的buffer里。


sk_buff的重要数据结构

/* These elements must be at the end, see alloc_skb() for details.*/ unsigned inttruesize; atomic_tusers; unsigned char*head, /* 整个网络数据包的头部 */ *data, /* 相对于本层的有效数据头部,要么还有协议头,要么还要协议尾 */ *tail, /* 相对于本层的有效数据尾部 */ *end; /* 整个网络数据包的尾部 */ }



head, data, tail, end这四个指针用得相当精巧,对于协议栈的组包和解包极为方便!




【linux 网卡zero copy 学习总结】

    推荐阅读