聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)

聊聊 wireshark 的重传包和重复包(Duplicate Packets or TCP Retransmissions?)

1 背景

最近某客户在推进全栈信创,其中操作系统使用了鲲鹏(arm)+麒麟V10,数据库使用了OceanBase, 大数据平台使用了星环TDH,JDK使用了龙井1.8。

在使用 datax 从 ob 同步数据到 hdfs 的过程中,我们发现 arm 版的 JDK 消耗的堆空间比 x86 的 JDK 大很多(400万数据,前者大概需要8G,而后者只需要2G)。

为分析原因,除了排查 JVM 堆栈信息,为排除网络影响,我们还通过 tcpdump 在 datax 节点进行抓包,并导出到 wireshark 中进行分析。

抓包命令如下:tcpdump -i any -nn -s 100 "port 2883 or port 8020" -w /tmp/ob.pcap;

2 现象-虚惊一场

将 pcap 包导出并使用 wireshark 打开后,在 "packet list"面板和“expert info” 中,都可以发现,wireshark 对大量的 TCP 数据包,都进行了“重传”,“快速重传”,“DUP ACK” 的标识,如下图所示:

  • This frame is a (suspected) fast retransmission
  • This frame is a (suspected) retransmission
  • Duplicate ACK

640.png640.png


因为这是使用了万兆网卡的 LAN 内网环境,wireshark 显示的 RTT 和 RTO 也都在几十微秒左右, 所以网络情况应该是良好的,如此多的重传包,严重不合理呀!

640.png640.png

进一步在 “packet details”中,对比查看重传包/Duplicate ACK 和对应的原始包,才发现,这些包的除了 TCP SEQ/ACK 完全一致,IP Identifiation 也完全一致!虚惊一场,原来这些包是 Duplicate Packets,网络是没有问题的!

640.png640.png

  • 对于 “duplicate ip packet”,Wireshark 就经常错误诊断并标识为 "TCP Retransmission","TCP Fast Retransmission","TCP Spurious Retransmission" ,"TCP Out-of-Order",或 “Duplicate ACK”;
  • 所以说,Wireshark 中的提示信息,也不一定任何时候都是正确的,我们不能无脑相信,而是需要结合 TCP 的工作机制,仔细甄别。

3 技术背景- TCP retransmition,Layer 3 loop, Layer 2 duplicate

以下三种包很容易引起混淆:

  • TCP retransimition (一般是超时等网络问题);
  • Layer 3 loop(三层网络环路,一般是网络拓扑和配置问题);
  • Layer 2 duplicate (二层重复包,可能是网络端口镜像和linux cooked capture 抓包方式问题,当然也有可能是网络设备的软或硬件问题);

640.png

三者各自的特点和区别概括如下:

  • TCP retransimition: TCP SEQ/ACK 一致,IP ID 不一致;(TCP层面遇到问题需要重传,此时TCP将包交给IP层后,IP层会封包并给与新的IP ID);
  • Layer 3 loop:TCP SEQ/ACK 一致,IP ID 一致,但 TTL 不一致(三层网络环路,数据包传输过程中,每经过一跳,其ttl 值就会被路由器减1);
  • Layer 2 duplicate:数据包所有字段完全一致,包括TCP SEQ/ACK,IP ID,以及 TTL;

640.png

4 如何清理去掉二层的重复包

当遇到了二层的重复包且底层原因是 linux cooked caputre等抓包方式引起的问题时,可以使用工具去掉重复包,此后 wireshark 显示的数据包就更清爽了,更方便进一步分析了。

安装 wireshark 时,一般也一并安装了 editcap 工具,可以使用该工具编辑并去掉 duplicate packet。该工具底层会对比指定大小窗口内所有数据包的MD5是否相同,若相同则丢弃重复的包:

  • 示例命令如下:editcap.exe -d infile.pcap outfile.pcap
  • 如果 editcap 默认的dup 窗口参数不合适,-D 和 -w 修改;

640.png

640.png

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
网络协议 网络架构
UDP包的大小与MTU
在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,我这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,你或许也能得到一点帮助:首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,运输层,应用层.
3945 0
|
4月前
|
监控 网络协议 安全
使用 Scapy 库编写 TCP ACK 洪水脚本
使用 Scapy 库编写 TCP ACK 洪水脚本
|
4月前
|
监控 网络协议 网络安全
使用 Scapy 库编写 TCP SYN-ACK 反射脚本
使用 Scapy 库编写 TCP SYN-ACK 反射脚本
|
4月前
|
网络协议 安全 网络安全
使用 Scapy 库编写 TCP SYN 洪水脚本
使用 Scapy 库编写 TCP SYN 洪水脚本
|
移动开发 网络协议 算法
TCP中的粘包、拆包问题产生原因及解决方法
TCP中的粘包、拆包问题产生原因及解决方法
884 0
TCP中的粘包、拆包问题产生原因及解决方法
|
6月前
|
网络协议 网络架构
Wireshark中的ICMP协议包分析
Wireshark可以跟踪网络协议的通讯过程,本节通过ICMP协议,在了解Wireshark使用的基础上,重温ICMP协议的通讯过程。 ICMP(Internet Control Message Protocol)Internet控制报文协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。 ICMP是TCP/IP模型中网络层的重要成员,与IP协议、ARP协议、RARP协议及IGMP协议共同构成TCP/IP模型中的网络层。 在Wireshark界面,我们可以看到
|
网络协议 C语言
Wireshark lua dissector 对TCP消息包合并分析
Wireshark lua dissector 对TCP消息包合并分析
821 0
|
网络协议 数据挖掘
|
JSON 网络协议 数据格式
TCP 粘包/拆包的原因及解决方法?
TCP粘包、拆包属于网络底层问题,在数据链路层、网络层、传输层都有可能出现。日常的网络应用开发大多数在传输层出现,而UDP是由消息保护边界的,不会发生粘包、拆包问题,只发生在TCP协议中。假设客户端向服务端发送了两个连续的数据包Packet1、Packet2;
797 0
TCP 粘包/拆包的原因及解决方法?
|
网络协议 算法
TCP/IP 校验和简析
TCP/IP 校验和简析
652 0