我正在linux内核中编写一个新的网络设备,我必须使用套接字缓冲区。
当我浏览套接字缓冲区的结构时,我可以看到四个字段head
,data
,tail
,end
。插座缓冲器中头部和尾部空间的用途是什么。
答案 0 :(得分:5)
套接字缓冲区(也称为skbuff)在整个内核中沿网络层传递。意思是,它们将从传输层传递到网络层等。这样做的主要原因是性能,避免了内核每次传递时都需要复制和重新创建缓冲区。
这意味着当skbuff数据通过不同的层时,它们将填充相应的协议头数据。例如,在传输层中,它可能获得TCP头,在网络层上获得IP头等。
作为优化,linux内核为这些头预先分配空间,这实际上是head
指向的skbuff内的缓冲区。现在,数据开始的地方,即当前构造的数据包的第一个字节,由data
指向。同样,tail
指向当前构造数据包的末尾,end
指向预分配缓冲区的末尾。
此图片可能会帮助您理解我的文字:http://www.kernelchina.org/files/image_thumb_3_4.png
现在,移动这些指针和(重新)构建内核尝试发送/接收的数据包远远少于实际重新分配内存和复制字节的计算密集程度。