Networking 序列号和确认号不匹配

Networking 序列号和确认号不匹配,networking,tcp,wireshark,Networking,Tcp,Wireshark,我最近一直在学习wireshark。在检查TCP段时,我看到了一个奇怪的情况,至少对我来说是这样。序列号和确认号不匹配。然后我意识到两个ACK之间的差异等于1.5个包的大小。然而,据我所知,ACK只会随着整个数据包的大小而增长。那么这里发生了什么 SEQ ACK 1 1 2897 8689 5793 13033 <-- 8689 14481 11585 14481 SEQ ACK 1 1 2897

我最近一直在学习wireshark。在检查TCP段时,我看到了一个奇怪的情况,至少对我来说是这样。序列号和确认号不匹配。然后我意识到两个ACK之间的差异等于1.5个包的大小。然而,据我所知,ACK只会随着整个数据包的大小而增长。那么这里发生了什么

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

5793 13033好的,这里没有太多可参考的,但是我猜您是在发送大数据包的机器上捕获数据包,即具有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写得很好的博客,标题为。

好吧,这里没有太多可供参考的内容,但我猜您是在发送大数据包的机器上捕获数据包的,即具有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写得很好的博客,标题是。

因为我没有声誉评论Christopher Maynard的答案,所以我在这里发表评论

正如Christopher所正确指出的,MTU(最大传输单元)是标准以太网,网络容量为1500字节。但是,制作1460字节(1500Bytes-20Bytes IP头-20Bytes TCP头,忽略可能的TCP选项)TCP段会对网络堆栈造成高负载,因为每个段都必须单独处理

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


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

因为我没有声誉评论Christopher Maynard的答案,所以我在这里进行评论

正如Christopher所正确指出的,MTU(最大传输单元)是标准以太网,网络容量为1500字节。但是,制作1460字节(1500Bytes-20Bytes IP头-20Bytes TCP头,忽略可能的TCP选项)TCP段会对网络堆栈造成高负载,因为每个段都必须单独处理

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


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

实际上,碎片是指当IPv4数据包大于下一个MTU时,路由器对其产生的影响。TCP所做的是分段,而不是分段,在数据到达IP之前将其分成适合IP负载的段。对一些人来说,这是一个真正的困惑来源。是的,我很清楚不同之处