Linux 内核中原始套接字的工作
Working of Raw Sockets in the Linux kernel
我正在努力将 linux 内核的流量控制层集成到自定义用户级网络堆栈中。我正在使用原始套接字来做同样的事情。我的问题是,如果我们将原始套接字与 AF_PACKET
、RAW_SOCK
和 IPPROTO_RAW
一起使用,dev_queue_xmit(该函数是队列层的起点,直到我读过)被称为?还是sockets接口直接调用网卡驱动?
SOCK_RAW
表示用户空间程序应该接收消息中的L2(link-layer)header。
IPPROTO_RAW
同样适用于 L3 (IP) header.
用户空间程序设置 SOCK_RAW, IPPROTO_RAW
以手动解析 or/and 组成数据包的协议 header。它保证内核不会在 to/from 用户空间的途中修改相应的层 header。原始套接字不会改变数据包接收或传输的方式——它们像往常一样排队。从网络 driver 的角度来看,谁设置 headers - 用户空间(原始套接字)或内核(例如,SOCK_DGRAM)并不重要。
请记住,获取原始数据包需要 CAP_NET_RAW
能力 - 通常,程序需要 运行 具有超级用户权限。
我正在努力将 linux 内核的流量控制层集成到自定义用户级网络堆栈中。我正在使用原始套接字来做同样的事情。我的问题是,如果我们将原始套接字与 AF_PACKET
、RAW_SOCK
和 IPPROTO_RAW
一起使用,dev_queue_xmit(该函数是队列层的起点,直到我读过)被称为?还是sockets接口直接调用网卡驱动?
SOCK_RAW
表示用户空间程序应该接收消息中的L2(link-layer)header。IPPROTO_RAW
同样适用于 L3 (IP) header.
用户空间程序设置 SOCK_RAW, IPPROTO_RAW
以手动解析 or/and 组成数据包的协议 header。它保证内核不会在 to/from 用户空间的途中修改相应的层 header。原始套接字不会改变数据包接收或传输的方式——它们像往常一样排队。从网络 driver 的角度来看,谁设置 headers - 用户空间(原始套接字)或内核(例如,SOCK_DGRAM)并不重要。
请记住,获取原始数据包需要 CAP_NET_RAW
能力 - 通常,程序需要 运行 具有超级用户权限。