在内核中通过网络发送数据

时间:2012-07-06 18:10:34

标签: linux network-programming linux-kernel linux-device-driver

我正在Linux内核中编写一个通过网络发送数据的驱动程序。现在假设我要发送的数据(缓冲区)在内核空间中。如何在不创建套接字的情况下发送数据(首先,这是一个好主意?)。我正在寻找代码中的性能而不是简单的编码。我如何设计接收器端?没有套接字连接,我可以在接收端获取和查看数据(如何)?如果缓冲区在用户空间中,所有这些都会改变(包括性能)(如果是这样的话,我会从用户那里复制:-))?

2 个答案:

答案 0 :(得分:0)

您应该使用netlink,如果您想真正与远程主机通信(例如通过TCP / IPv6),请使用用户级代理应用程序。 (所以内核模块使用netlink到您的应用程序代理,它可以使用TCP,甚至通过ssh或HTTP,远程发送数据,或将其存储在磁盘上......)。

我认为让内核模块直接与远程主机通信是不合理的(例如安全问题,过滤,路由,iptables ...)

真正的瓶颈几乎总是(物理)网络本身。 1Gbit以太网几乎总是比内核模块或应用程序可持续生成(以及延迟问题)慢得多。

答案 1 :(得分:0)

如果您希望在没有套接字的情况下在网络上发送数据,则需要挂钩网络驱动程序并通过它们发送原始数据包,并为您想要劫持的数据包过滤其传入的数据包。我认为性能优势不足以保证这一点。

我甚至认为在网络驱动程序中没有正常的钩子,我在过去做了一些相关的事情来实现防火墙。您可以设想使用netfilter挂钩做类似的事情,以便从网络驱动程序连接到接收端。