我有一个将 TCP 数据发送到服务器的应用程序。我的服务器故意丢弃应用程序发送的数据包,结果客户端重新传输数据包。我需要阻止客户端重新传输它们。我可以在客户端上进行任何设置来防止重新传输吗?也许有一些 iptables 规则?或者有一些net.ipv4.tcp
变量?
我知道 TCP 本质上必须重新传输数据包,但我实际上需要在我的服务器上测试一个功能,我必须观察服务器在丢弃 TCP 数据包并且不重新传输数据包时的行为。所以我这里不能使用UDP。
客户端能够完成 TCP 握手,并且只有之后发送的数据包才会被丢弃,从而发生重传。这就是我需要防止的重传。
我正在使用 Fedora:
[root@test sipp.svn]# uname -r
2.6.23.1-42.fc8
[root@test sipp.svn]#
答案1
根据您的评论(最好是您问题的一部分):
我知道 TCP 本质上必须重新传输数据包,但我实际上需要在我的服务器上测试一个功能,我必须观察服务器在丢弃 TCP 数据包并且不重新传输数据包时的行为。所以我这里不能使用UDP。
根据我的理解,您实际上不需要关心客户端发送的内容,唯一重要的是重新提交的数据包不会到达服务器。那么为什么不在服务器端像丢弃初始数据包一样丢弃这些数据包呢?我不知道你是如何删除这个的,但是使用 iptables,它可能足以阻止任何没有来自客户端的 SYN/FIN 的 TCP 数据包。
如果您需要让客户端不关心,则需要伪造来自服务器的 ACK。您可以使用 scapy 或类似工具来完成此类操作。
答案2
删除我的评论并发布答案。
TCP 是为可靠性和错误检查传输而设计的。因此,重新发送未发送的数据包是其本质确认- 连接的另一端知道。如果您不想应用此机制,则可能应该使用其他协议,例如 UDP。
但是,如果您无法使用 TCP,您可能需要使用代理应用程序。不要直接在服务器端的应用程序上接收 TCP 数据包,而是让另一个应用程序(例如代理人,这将决定是否将数据包传输到“真实的”应用落后。基本上:
- 客户端发送其 TCP 数据包。
- 服务器端的代理应用程序在端口 A 上接收它们。
- 您的真实服务器应用程序侦听端口 B。
- 代理应用程序决定是否将数据包从 A 传输到 B。
自从有了代理总是确认数据包,它们永远不会重新传输(除非它们实际上失败当然是为了到达那里)。考虑到这一点,您可以使用/设计一个应用适当过滤规则的代理应用程序。这是一个链接我问的一个相关问题在安全堆栈交换上。