我目前正在调查有关TCP_ZEROCOPY_RECEIVE我读到它需要 NIC 的标头数据分割支持。据我了解,此功能是将 DMA 标头(IP、TCP 标头)和数据(其余)放入单独的缓冲区中。 (为了提高缓存效率)对于TCP_ZEROCOPY_RECEIVE,我理解数据必须与页面对齐以映射到进程的虚拟地址。我的问题是为什么将数据对齐到页面需要 NIC 的标头数据分割支持。当网络设备驱动程序创建sk_buff结构时,它不能只读取标头并将数据复制到单独分配的页面以执行零复制吗?我还想知道网卡驱动程序如何与网卡交互以利用标头数据分割功能。
抱歉,如果我的理解有误,如果有什么需要补充的,请告诉我。谢谢。
答案1
我的问题是为什么将数据对齐到页面需要 NIC 的标头数据分割支持。当网络设备驱动程序创建sk_buff结构时,它不能只读取标头并将数据复制到单独分配的页面以执行零复制吗?
对于上下文,标头必须与数据分开,因为只能允许(非特权)用户空间直接访问数据。
零拷贝 TCP 接收的目标是在接收时精确地涉及数据的零副本,一直到用户空间:当情况允许时,NIC 必须将数据包 DMA 到接收进程设置的用户空间内存区域中。如果驱动程序必须复制数据来分割它,那么它就不再是零复制了。
看这 一对有关该主题的更多详细信息,以及这篇文章作者:Jakub Kicinski。