提问者:小点点

是什么原因导致这些重复的TCPACK在linux内核中发送


我在Android设备(linux 3.4.39)上使用tcpdump捕获了这些数据包,这些数据包在一个HTTPGET Stream中:

1 385.447794服务器-

客户端是我的设备。

是什么原因导致客户端发送这些重复的TCPACK?

更新:
为什么客户端在收到后续TCP数据包(#3)后发送先前的DUP确认字符(#4)?

谢谢。


共1个答案

匿名用户

是什么原因导致客户端发送这些重复的TCPACK?

接收者(客户端)发送确认字符#作为它期望接下来从发送者(服务器)发送的SEQ#

在您的示例中,服务器发送了:

1 385.447794 Server -> Client: SEQ 12517, LEN 100

client接收它,然后通过放置确认字符=12617来请求带有SEQ#12517 100=12617的数据包

2 385.498345 Client -> Server: SEQ 3086, LEN 0, ACK 12617

如果SEQ#12617的数据包:

3 385.497836 Server -> Client: SEQ 12617, LEN 1348

丢失并且未被接收器接收,则接收器将发送一个重复的确认字符,其指示给发送方重新发送分组(指示分组已丢失)。

4 385.498644 Client -> Server: [DUP ACK] SEQ 3086, LEN 0, ACK 12617

为什么客户端在收到后续TCP包(#3)后发送先前的DUP确认字符(#4)?

因为带有SEQ#12617的数据包似乎在通道中丢失了,客户端没有接收到这些数据包。因此,重复的确认字符12617指示服务器重新传输它。

我想知道是否Linux内核读取数据包和发送确认字符在不同的线程处理?

它不能是不同的线程,因为线程根据它收到的SEQ#生成ACKS#。因此,它不能是两个不同的线程。即使它们是,一个也必须等待另一个的信息(同步)。