【问题标题】:Working of Raw Sockets in the Linux kernelLinux内核中原始套接字的工作
【发布时间】:2020-02-25 05:40:34
【问题描述】:
我正在努力将 linux 内核的流量控制层集成到自定义用户级网络堆栈。我正在使用原始套接字来做同样的事情。我的问题是,如果我们使用带有AF_PACKET、RAW_SOCK 和IPPROTO_RAW 的原始套接字,是否会调用 dev_queue_xmit(据我所知,该函数是队列层的起点)?还是sockets接口直接调用网卡驱动?
【问题讨论】:
标签:
c
linux-kernel
network-programming
linux-device-driver
raw-sockets
【解决方案1】:
-
SOCK_RAW 表示用户空间程序应该接收消息中的 L2(链路层)标头。
-
IPPROTO_RAW 对 L3 (IP) 标头应用相同。
用户空间程序将SOCK_RAW, IPPROTO_RAW 设置为手动解析或/和组合数据包的协议头。它保证内核不会在往返用户空间的途中修改相应的层标头。原始套接字不会改变数据包被接收或传输的方式——它们像往常一样排队。从网络驱动程序的角度来看,谁设置标头并不重要——用户空间(原始套接字)或内核(例如 SOCK_DGRAM)。
请记住,获取原始数据包需要CAP_NET_RAW 功能 - 通常,程序需要以超级用户权限运行。