![发送的数据包与接收的数据包不同](https://linux22.com/image/1355836/%E5%8F%91%E9%80%81%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%E4%B8%8E%E6%8E%A5%E6%94%B6%E7%9A%84%E6%95%B0%E6%8D%AE%E5%8C%85%E4%B8%8D%E5%90%8C.png)
我使用原始套接字创建 TCP 数据包,重点关注序列号和 TCP 标志(SYN、ACK)
我使用一台机器 S 发送一个 tcp ACK 数据包(标志 ACK 设置为 1),另一台机器 R 接收它,这两台机器位于不同的子网中,都在我的学校
同时,我使用tcpdump来捕获数据包。
奇怪的事情发生了!在机器 S 上,捕获的数据包与预期一致,是一个 ACK 数据包。然而在接收机器 R 上,该数据包变成了 SYN 数据包,并且序列号发生了变化,seq no 比预期小 1,ack_seq 变为 0!
这是怎么回事?我猜是因为路由器/防火墙将 ACK 数据包修改为 SYN 数据包,因为它在 ACK 之前从未看到过 SYN SYN/ACK 交换?这可能吗?
捕获的两个数据包为:
https://docs.google.com/file/d/0B09y_TWqTtwlVnpuUlNwUmM1YUE/edit?usp=sharing https://docs.google.com/file/d/0B09y_TWqTtwlTXhjUms4ZnlkMVE/edit?usp=sharing
答案1
我猜想是你的 ACK 数据包上的序列号是错误的。因此,中间的防火墙看到你的 ACK 数据包序列错误,并认为 SYN-ACK 从未发送给你,因此将原始 SYN 数据包重新传输到服务器,让服务器重新发送 SYN-ACK,服务器确实这样做了。
如果您在 Wireshark 中查看您的跟踪,它会得出相同的结论 - 它不会将您的 ACK 视为原始会话的一部分,而是使用相同端口的新会话。