序号和确认号不匹配

时间:2018-03-28 20:24:22

标签: networking tcp wireshark

我最近一直在学习wirehark。在检查TCP段时,我看到了一种奇怪的情况,至少对我而言。存在不匹配的SEQ,ACK编号。然后我意识到两个ACK之间的差异与1个半封装大小相同。但是,据我所知,ACK只会随着整个数据包的大小而增长。那么这里发生了什么?

SEQ        ACK
1          1
2897       8689
5793       13033 <--
8689       14481
11585
14481

Image of the trace

2 个答案:

答案 0 :(得分:1)

嗯,这里没什么可说的,但我猜你是在捕获发送大数据包的机器上的数据包,即具有2896字节TCP有效负载的数据包。因此,您在 之前看到数据包 ,它们是IP分段的,并且实际上是通过线路传输的。

但是你不能只将2896字节的数据发送到线路上;以太网链路通常会产生1500字节的MTU(最大传输单元),当您考虑IP和TCP报头开销时,通常最终会得到1460字节的可用负载或MSS(最大段大小)。在您的情况下,您似乎只获得了1448字节的可用MSS,这很可能是由于添加了一个或多个IP和/或TCP标头选项。

在任何情况下,2896字节的有效负载将通过2个IP片段进行分段,每个IP片段包含1448字节的TCP有效负载。我很确定你看到的是接收到1个完整段加上来自下一个段的1个IP片段后来自接收器的ACK。

之前的ACK号码是8689,8689 + 2896 = 11585.现在加上1/2的数据段(2896/2 = 1448),你得到11585 + 1448 = 13033.这就是你看到的ACK号码。现在添加另一个1/2,你得到13033 + 1448 = 14481,这是下一个数据包的ACK号。

我希望这有道理吗?

为了深入了解本地数据包捕获的缺点,我将引导您访问由Jasper Bongertz撰写的精心编写的博客,标题为"The drawbacks of local packet captures"

答案 1 :(得分:0)

由于我没有评论克里斯托弗梅纳德答案的声誉,我在这里发表评论。

正如Christopher所说,MTU(最大传输单元)是标准的以太网网络是1500Bytes。但是,制作1460Bytes(1500Bytes - 20Bytes IP Header - 20Bytes TCP Header,忽略可能的TCP选项)TCP段会对网络堆栈施加高负载,因为必须单独处理每个段。

例如,如果我想传输1Mb(等于1024 * 1024Bytes = 1048576Bytes)的数据,则会产生1Mb / 1460Bytes = 719个段。与1Mb / 65525Bytes(理论上最大TCP段大小)= 16段相比。由于内核中的开销大多与段/数据包大小无关,因此小段需要更多处理。

为了抵消这一事实,开发了TCP分段卸载(TSO)。 TSO允许内核创建具有最大大小的TCP段,并且NIC(网络接口卡)使用硬件加速将这些段拆分为1460字节的单独TCP段。因此,不需要IP分段。