事情是这样的:
客户端-发送 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
是的,客户应该停止尝试连接...但是:
- 许多不明智的 ISP 会阻止 ICMP 或 ICMP 消息的子集。
- 许多 NAT 无法正确地向内传递 ICMP 消息。
- 许多操作系统在其防火墙上阻止 ICMP。
- 许多“安全”套件会阻止 ICMP。
- 并非所有 IP 堆栈都能正确响应 ICMP。
- 并非所有应用程序/API 都能正确响应 ICMP。
综上所述,您所描述的情况不仅比它应该的更常见,而且非常常见。