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