我在Android设备(linux 3.4.39)上使用tcpdump捕获了这些数据包,这些数据包在一个HTTPGET Stream中:
1 385.447794服务器-
客户端是我的设备。
是什么原因导致客户端发送这些重复的TCPACK?
更新:
为什么客户端在收到后续TCP数据包(#3)后发送先前的DUP确认字符(#4)?
谢谢。
是什么原因导致客户端发送这些重复的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#
。因此,它不能是两个不同的线程。即使它们是,一个也必须等待另一个的信息(同步)。