是否有一个选项或命令可用于在linux中禁用/卸载/或停止tcp/IP堆栈。需要它在服务器应用程序中实现用户空间tcp吗

是否有一个选项或命令可用于在linux中禁用/卸载/或停止tcp/IP堆栈。需要它在服务器应用程序中实现用户空间tcp吗,c,linux,tcp,raw-sockets,C,Linux,Tcp,Raw Sockets,我正在开发一个C程序,它使用sockets在我正在开发的服务器应用程序中实现tcp网络。我想知道是否可以禁用内核的tcp/ip堆栈,这样我的系统就不会干扰传入的连接同步请求和ip数据包 或者我必须编译内核来禁用它,请告诉我是否是这样 关于这个问题 上面说 还请注意,如果您试图发送原始tcp/udp数据包,您将遇到的一个问题是禁用网络堆栈自动处理回复(将其视为已寻址到现有IP地址或尝试转发) 如果是这样,那怎么可能呢 或者Linux中是否有任何工具或程序可以用来实现这一点 当然,有一种违反直觉的方

我正在开发一个C程序,它使用
sockets
在我正在开发的服务器应用程序中实现tcp网络。我想知道是否可以禁用内核的tcp/ip堆栈,这样我的系统就不会干扰传入的连接同步请求和ip数据包

或者我必须编译内核来禁用它,请告诉我是否是这样

关于这个问题

上面说

还请注意,如果您试图发送原始tcp/udp数据包,您将遇到的一个问题是禁用网络堆栈自动处理回复(将其视为已寻址到现有IP地址或尝试转发)

如果是这样,那怎么可能呢

或者Linux中是否有任何工具或程序可以用来实现这一点

当然,有一种违反直觉的方法,即使用额外的网络功能来禁用正常的网络功能:netfilter。有一些iptables匹配/目标可能对您有利(例如,“所有者”匹配可能基于PID或UID拒绝或接受)。这仍然意味着功能在内核中,它只是限制了它


如果有人从上面知道如何做到这一点,那么有任何命令吗?

好吧,您可以自己编译一个内核,而无需联网:)

有几个选择

  • 查看DPDK项目()。DPDK通过UIO驱动程序将物理NIC传递到用户空间,以
    igb_UIO | UIO_pci |通用| vfio pci
    。这样就消除了内核堆栈
  • 在零拷贝或驱动程序模式下使用支持XDP的NIC。在eBPF运行时,可以绕过内核堆栈将接收到的数据包直接推送到用户空间
  • 除非这是一个家庭作业项目,否则请记住:不要发明,重复使用


    [根据注释编辑]用户空间TCP-IP堆栈具有自定义的sock API,可读取/写入套接字。因此,无论是LD_预加载还是源文件更改,都可以使用相同的应用程序。

    如果我编译内核时没有联网,那么我仍然可以将套接字api与原始套接字或数据包MMAP一起使用吗?发送和接收数据包?我建议使用netfilter将相关的接收数据包发送到用户空间,从而绕过这些数据包的正常TCP处理@吉米。我可以在netfilter
    C
    程序中获取以太网帧吗?我不确定。您是否真的需要以太网封装,或者IP数据包是否足够好,这是您可以确定的@好的,我现在想起来了。netfilter操作IP后碎片整理,因此它将为您提供完整的IP数据包,而不是片段。如果您想要以太网帧,除了TCP和netfilter之外,实际上还必须实现IP(包括片段重组)。最简单的方法是使用iptables丢弃目标。但当客户端发送一个SYN时,您必须返回一个SYN,ACK。必须有人来实现TCP。