我可以通过发送不可达主机的 ICMP 来停止 TCP 握手吗

我可以通过发送不可达主机的 ICMP 来停止 TCP 握手吗

事情是这样的:

客户端-发送 syn

服务器 - 发送 icmp(无法访问的主机 [我也尝试添加代码 =10])等待 100 毫秒发送 syn-ack

客户端 - 发送 ack 以响应 syn-ack。

当发送了无法访问主机的 ICMP 时,客户端是否应该重置 TCP 握手?有没有办法通过发送某种 ICMP 来让客户端重置连接?

测试是在 2 台直接连接的 Ubunto 机器上进行的。在 wireshark 中,我看到 icmp 在 syn-ack 之前恢复,并且连接未重置。客户端运行 telnet(在端口 80 上)到服务器。在服务器上运行 apache。我使用 python scapy 模拟 synack 之前的 icmp。

谢谢

答案1

是的,客户应该停止尝试连接...但是:

  1. 许多不明智的 ISP 会阻止 ICMP 或 ICMP 消息的子集。
  2. 许多 NAT 无法正确地向内传递 ICMP 消息。
  3. 许多操作系统在其防火墙上阻止 ICMP。
  4. 许多“安全”套件会阻止 ICMP。
  5. 并非所有 IP 堆栈都能正确响应 ICMP。
  6. 并非所有应用程序/API 都能正确响应 ICMP。

综上所述,您所描述的情况不仅比它应该的更常见,而且非常常见。

相关内容