linux 2.6版的内核,网络数据从网线到应用程序需经过3次copy,分别是:
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这四个指针用得相当精巧,对于协议栈的组包和解包极为方便!