C 如何在不使用套接字的情况下向网络发送数据包?

C 如何在不使用套接字的情况下向网络发送数据包?,c,linux-kernel,linux-device-driver,interrupt,C,Linux Kernel,Linux Device Driver,Interrupt,我想绕过Linux网络堆栈向网络发送数据包。我的意思是,有没有办法中断网卡驱动程序,直接在网卡缓冲区中放置一个帧,然后将其发送到网络中?我是Linux内核黑客的新手,所以任何关于如何开始的指导都会非常有帮助。如果你使用一些虚拟设备,你会过得更好。您可以轻松地将一个控制接口破解到TAP内核模块中,通过该模块,您可以传递准备发送给驱动程序的帧。这种方法可以与作为基线的常规套接字应用程序的性能进行比较。由于TAP设备最终将通过字符设备“发送”出出口帧,因此您可以轻松编写一个测试应用程序来测量性能和延迟

我想绕过Linux网络堆栈向网络发送数据包。我的意思是,有没有办法中断网卡驱动程序,直接在网卡缓冲区中放置一个帧,然后将其发送到网络中?我是Linux内核黑客的新手,所以任何关于如何开始的指导都会非常有帮助。

如果你使用一些虚拟设备,你会过得更好。您可以轻松地将一个控制接口破解到TAP内核模块中,通过该模块,您可以传递准备发送给驱动程序的帧。这种方法可以与作为基线的常规套接字应用程序的性能进行比较。由于TAP设备最终将通过字符设备“发送”出出口帧,因此您可以轻松编写一个测试应用程序来测量性能和延迟。

您能描述一下为什么要这样做吗?可能有更好的方法来解决这个问题,而不是绕过经过良好测试、调试和高度文档化的接口,该接口专门用于发送数据包。:-)原始IP数据包,还是原始以太网数据包?根据协议栈中需要达到的最低级别,您可以使用原始套接字。恕我直言,我不确定您是否可以从用户空间直接与现有的以太网卡驱动程序通信,但您可以卸载该驱动程序,并将其替换为经过修改的版本以启用此功能。显然,所有这些都需要管理访问权限,通常包括原始套接字。实际上,我的任务是比较一个使用套接字发送数据包的程序和一个不用移动整个Linux内核堆栈就可以发送数据包的程序之间的性能。我的意思是,就像我说的,将数据包直接放入网卡缓冲区。我的印象是,人们玩这个游戏的最常见原因是(至少在延迟之后)如果他们在高频交易系统上工作,那么你可以在此基础上进行一些搜索。@ChrisStratton:原始IP数据包和原始以太网数据包都使用套接字。所以我不能使用它们。我在高频交易系统上做了一些搜索,但找不到任何有用的东西。有任何特定的链接或教程吗?谢谢你的帮助。我是g安娜,看看吧。