发送的数据包与接收的数据包不同

发送的数据包与接收的数据包不同

我使用原始套接字创建 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 视为原始会话的一部分,而是使用相同端口的新会话。

相关内容