如何从pcap中确定客户端或服务器端的重传

我想要澄清一些我在这里读到的东西:

如何计算来自二进制TCPDUMP文件的丢包

第一个答案是,序列号将从客户端到服务器是相同的,从服务器到客户端的确认将是相同的,这将告诉你哪一方正在做转发。 但是,当我得到这样的输出:

10:58:15.317823 IP 1.2.3.4.50245 > 5.6.7.8.443: Flags [P.], seq 3040268:3040385, ack 56380, win 32768, length 117 10:58:15.317841 IP 1.2.3.4.50245 > 5.6.7.8.443: Flags [P.], seq 3040385:3040470, ack 56380, win 32768, length 85 10:58:15.550090 IP 1.2.3.4.50245 > 5.6.7.8.443: Flags [P.], seq 3040268:3040470, ack 56380, win 32768, length 202 10:58:15.811131 IP 1.2.3.4.50245 > 5.6.7.8.443: Flags [P.], seq 3040268:3040470, ack 56380, win 32768, length 202 10:58:16.133386 IP 1.2.3.4.50245 > 5.6.7.8.443: Flags [P.], seq 3040268:3040470, ack 56380, win 32768, length 202 

在这个例子中,前两行有不同的序列号和相同的ack,但是它是从客户端到服务器的一个数据包,那么哪边是在这里进行重传呢?

在最后3行中,序列号和ack都是一样的,那么如何知道哪一方正在重发数据包呢? 注意在这个例子中,1.2.3.4是客户机,5.6.7.8是服务器。

这些是从客户端重新传输到服务器。 这是发生了什么事情:

  • 客户端发送2段。 一个117个字节,一个85个字节(包1和2)
  • 客户端等待从未到达的服务器的确认
  • 大约200ms之后,客户端的重传计时器到期,所以它使用重新分组,并且将前两个分段合并成一个202字节的分段(pkt 3)
  • 客户端重置其重传定时器,因为没有收到ACK,所以它重新发送(pkt 4)
  • 客户端增加定时器,再等待,定时器到期,然后重新发送(pkt 5)

我们知道这些是从客户端重新传输的,因为所有的数据包都是从客户端到服务器的。 我们知道它们是重传的,因为序列号是一样的,即它一遍又一遍地发送相同的数据。