是否有一个选项或命令可用于禁用/卸载/或停止 linux 中的 tcp/IP 堆栈。需要它在服务器应用程序中实现用户空间 tcp
Posted
技术标签:
【中文标题】是否有一个选项或命令可用于禁用/卸载/或停止 linux 中的 tcp/IP 堆栈。需要它在服务器应用程序中实现用户空间 tcp【英文标题】:Is there an option or command that I can used to disable/unload/ or stop the tcp/IP stack in linux. Need it to implement user space tcp in server app 【发布时间】:2021-07-30 22:33:03 【问题描述】:我正在使用一个 C 程序,它使用 sockets
在我正在处理的服务器应用程序中实现 tcp 网络。我想知道是否可以禁用内核的 tcp/ip 堆栈,这样我的系统就不会干扰传入的连接同步请求和 IP 数据包。
或者我必须编译内核来禁用它,请告诉是否是这种情况。
关于这个问题How to create a custom packet in c?
它说
另请注意,如果您尝试发送原始 tcp/udp 数据包,您将遇到的一个问题是禁用网络堆栈自动处理回复(将其视为针对现有 IP 地址或尝试转发它) .
如果是这样,那怎么可能。
或者Linux中是否有任何工具或程序可以用来实现这一点,比如这条评论Disable TCP/IP Stack from user-space
当然有一种违反直觉的方法是使用额外的网络功能来禁用正常的网络功能:netfilter。有一些 iptables 匹配/目标可能证明对您有益(例如,可能基于 PID 或 UID 拒绝或接受的“所有者”匹配)。这仍然意味着功能在内核中,它只是限制它。
如果有人从上面知道,那么有什么命令可以做到吗?
【问题讨论】:
我建议使用 netfilter 将收到的相关数据包发送到用户空间,从而绕过对这些数据包的正常 TCP 处理。 home.regit.org/netfilter-en/… @JimD。我可以在 netfilterC
程序中获取以太网帧吗?
我不确定。你真的需要以太网封装还是IP数据包足够好,你肯定可以得到。 @user786
好的,我现在想起来了。 netfilter 进行 IP 碎片整理,因此它会为您提供整个 IP 数据包,而不是碎片。如果你想要以太网帧,除了 TCP 之外,你实际上还必须实现 IP(包括片段重组),而 netfilter 不适合你。
最简单的做法是使用 iptables DROP 目标。但是当客户端发送一个 SYN 时,您将不得不发回一个 SYN,ACK。必须有人实现 TCP。
【参考方案1】:
好吧,你可以自己编译一个内核,而无需联网 :)
几个选项
-
查看 DPDK 项目 (https://www.linuxjournal.com/content/userspace-networking-dpdk)。 DPDK 通过 UIO 驱动将物理网卡传递给用户空间到
igb_uio|uio_pci_generic|vfio-pci
。从而消除了内核堆栈。
将支持 XDP 的 NIC 与零拷贝或驱动程序模式一起使用。通过运行 eBPF,可以绕过内核堆栈将接收到的数据包直接推送到用户空间。
除非这是一个家庭作业项目,否则请记住:不要发明,重复使用。
[基于评论的编辑] 用户空间 TCP-IP 堆栈具有自定义 sock-API 以读取/写入套接字。因此,无论是 LD_PRELOAD 还是源文件更改,都可以使用相同的应用程序。
【讨论】:
如果我在不联网的情况下编译内核,那么我仍然可以将套接字 API 与 RAW 套接字或 Packet MMAP 一起使用吗?发送和接收数据包?以上是关于是否有一个选项或命令可用于禁用/卸载/或停止 linux 中的 tcp/IP 堆栈。需要它在服务器应用程序中实现用户空间 tcp的主要内容,如果未能解决你的问题,请参考以下文章