【发布时间】:2017-01-31 06:06:25
【问题描述】:
我正在为我最近工作的一个网络项目寻求帮助和意见建议。这要求 Linux 机器是被动网络设备。
网络数据包从一个网络接口传入并从另一个接口(net--eth0-->Linux PC--eth1-->net)传出,而不对数据进行任何修改。
将在 Linux 系统上运行的应用程序只会更改数据包的顺序。这将是一个“愚蠢的”网络仿真器应用程序。
第一个实现是使用 RAW 套接字实现的,其中每次数据包到达用户空间时都会调用 read(),而当以太网数据包应该向下发送到 NIC 时会调用 write()。
我想知道有没有比RAW socket更实用直接的方法,绕过Linux的网络栈。
【问题讨论】:
-
你无法绕过 Linux 网络堆栈,而他们的做法可能是最简单的方法。实用是什么意思?
-
实用的方法是实现的技术部分。套接字实现需要具有非阻塞 IO 的 tx-rx 机制,这就是我首先在 C 下使用 select() 和 pthreads 实现的方式。有更好的设计理念吗?此外,我正在寻找一种中间系统不会处理所有网络流量的方法。只有仿真应用程序应该在两个接口之间运行。
-
您可以做的是创建一个
netfilter挂钩并让它接收您的数据包,然后立即发送它们。这样你的数据包就不必传送到用户空间,你可以在内核空间内进行处理,速度更快。 -
Stack Overflow 是一个编程和开发问题的网站。这个问题似乎离题了,因为它与编程或开发无关。请参阅帮助中心的What topics can I ask about here。也许Super User 或Unix & Linux Stack Exchange 会是一个更好的提问地方。另见Where do I post questions about Dev Ops?