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