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 int        truesize; 
    atomic_t        users;
    unsigned char        *head, /* 整个网络数据包的头部 */
                *data, /* 相对于本层的有效数据头部,要么还有协议头,要么还要协议尾 */
                *tail, /* 相对于本层的有效数据尾部 */
                *end; /* 整个网络数据包的尾部 */
}


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




你可能感兴趣的:(大数据)