当前位置: 首页 > news >正文

TCP Analysis Flags 之 TCP Retransmission

前言

默认情况下,Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态,并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时,会对每个 TCP 数据包进行一次分析,数据包按照它们在数据包列表中出现的顺序进行处理。可以通过 “Analyze TCP sequence numbers” TCP 解析首选项启用或禁用此功能。

TCP 分析展示

在数据包文件中进行 TCP 分析时,关于 “TCP Retransmission” 一般是如下显示的,包括:

  1. Packet List 窗口中的 Info 信息列,以 [TCP Retransmission] 黑底红字进行标注;
  2. Packet Details 窗口中的 TCP 协议树下,在 [SEQ/ACK analysis] -> [TCP Analysis Flags] 中定义该 TCP 数据包的分析说明。

考虑到 TCP 乱序、重传场景的复杂性,专家信息在重传的判断上,前面都会有一个(suspected),表示疑似,说明并不是百分百正确。

TCP Retransmission 定义

文档中关于 TCP Retransmission 的定义看起来简单,但实际考虑到 TCP 乱序、重传场景的复杂性,在 TCP 分析中对于 TCP Retransmission 是与 TCP Spurious RetransmissionTCP Fast RetransmissionTCP Out-Of-Order 等在一起判断标记乱序或重传类型,而在不少场景还会有判断出错的问题,当然 Wireshark 考虑到这种情况,也有手动修正的选项,这正好也侧面证明了上面的说法,关于 TCP 乱序、重传的复杂性。

TCP Retransmission 的定义如下,当以下所有条件都为真时设置:

  • 不是 Keep-Alive 数据包
  • TCP 段大小大于零或设置了 SYN/FIN
  • 同方向之前下一个期望的 Seq Num 大于当前数据包的 Seq Num
Set when all of the following are true:This is not a keepalive packet.
In the forward direction, the segment length is greater than zero or the SYN or FIN flag is set.
The next expected sequence number is greater than the current sequence number.

具体的代码如下,总的来说这段代码是 Wireshark 中 TCP 分析模块的一部分,用于检测和标识 TCP 数据包中的各种重传类型。它的主要功能是根据当前数据包的序列号、长度、标志位以及之前收到的 TCP 数据包的信息,判断当前数据包是否属于重传,如果是则进一步确定它属于哪种重传类型。

根据分析 TCP 数据包的各种特征,对重传数据包进行分类,有助于更好地理解 TCP 连接中的重传行为,对于诊断网络问题很有帮助。这段代码的主要逻辑如下,如果所有下述条件均满足,则认为该数据包是一个重传包。

实际上 TCP Retransmission 是在符合一定条件之后,再依次判断是否属于 TCP Spurious RetransmissionTCP Fast RetransmissionTCP Out-Of-Order 等,如果之前都不匹配,但满足以下条件时,即被认定为 TCP Retransmission,即普通的 TCP 重传。

  • 检查 seq_not_advanced,序列号是否未递增。
    /* RETRANSMISSION/FAST RETRANSMISSION/OUT-OF-ORDER* If the segment contains data (or is a SYN or a FIN) and* if it does not advance the sequence number, it must be one* of these three.* Only test for this if we know what the seq number should be* (tcpd->fwd->nextseq)** Note that a simple KeepAlive is not a retransmission*/if (seglen>0 || flags&(TH_SYN|TH_FIN)) {gboolean seq_not_advanced = tcpd->fwd->tcp_analyze_seq_info->nextseq&& (LT_SEQ(seq, tcpd->fwd->tcp_analyze_seq_info->nextseq));guint64 t;guint64 ooo_thres;...if (seq_not_advanced) {/* Then it has to be a generic retransmission */if(!tcpd->ta) {tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);}tcpd->ta->flags|=TCP_A_RETRANSMISSION;/** worst case scenario: if we don't have better than a recent packet,* use it as the reference for RTO*/nstime_delta(&tcpd->ta->rto_ts, &pinfo->abs_ts, &tcpd->fwd->tcp_analyze_seq_info->nextseqtime);tcpd->ta->rto_frame=tcpd->fwd->tcp_analyze_seq_info->nextseqframe;/** better case scenario: if we have a list of the previous unacked packets,* go back to the eldest one, which in theory is likely to be the one retransmitted here.* It's not always the perfect match, particularly when original captured packet used LSO* We may parse this list and try to find an obvious matching packet present in the* capture. If such packet is actually missing, we'll reach the list first entry.* See : issue #12259* See : issue #17714*/ual = tcpd->fwd->tcp_analyze_seq_info->segments;while(ual) {if(GE_SEQ(ual->seq, seq)) {nstime_delta(&tcpd->ta->rto_ts, &pinfo->abs_ts, &ual->ts );tcpd->ta->rto_frame=ual->frame;}ual=ual->next;}}}finished_checking_retransmission_type:

next expected sequence number,为 nextseq,定义为 highest seen nextseq。

Packetdrill 示例

根据上述 TCP Retransmission 定义和代码说明,通过 packetdrill 模拟普通的超时重传现象即可,即为 TCP Retransmission 数据包。

# cat tcp_retrans_001.pkt 
0   socket(..., SOCK_STREAM, IPPROTO_TCP) = 3
+0  setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0  bind(3, ..., ...) = 0
+0  listen(3, 1) = 0+0 < S 0:0(0) win 16000 <mss 1460>
+0 > S. 0:0(0) ack 1 <...>
+0.01 < . 1:1(0) ack 1 win 16000
+0 accept(3, ..., ...) = 4+0.01 write(4, ..., 1000) = 1000+0 `sleep 100`
# 

经 Wireshark 展示如下,可以看到满足判断条件后,重传的数据包均标记为 [TCP Retransmission] ,因为始终同方向之前下一个期望的 Seq Num 1001 大于当前数据包的 Seq Num 1。

实例

关于 TCP Retransmission 的实例,实际日常抓包中经常会看到,是比较常见的一种 TCP 分析信息,也会伴生着出现像是 TCP Dup ACKTCP Fast RetransmissionTCP Spurious Retransmission 等信息,当然有时也会单独出现。

  1. SYN TCP Retransmission

普通的客户端 SYN 超时重传场景,始终同方向之前下一个期望的 Seq Num 1 ( SYN 占用 1 字节)大于当前数据包的 Seq Num 0,所以满足判断条件后,重传的数据包均标记为 [TCP Retransmission] ,当然 SYN/ACK 超时重传场景同样如此。

  1. TCP Retransmission

普通的数据段重传场景,同方向之前下一个期望的 Seq Num 14958 大于当前数据包的 Seq Num 4878,在判断不是 TCP Spurious RetransmissionTCP Fast RetransmissionTCP Out-Of-Order 等类型后,满足序列号未递增的情况下,判定为 [TCP Retransmission]。

  1. FIN TCP Retransmission

和 SYN 超时重传一样,也是普通的 FIN 超时重传场景,始终同方向之前下一个期望的 Seq Num 2 ( FIN 占用 1 字节)大于当前数据包的 Seq Num 1,所以满足判断条件后,重传的数据包均标记为 [TCP Retransmission]

总结

考虑到数据包会出现乱序、重传等各类不同的场景,产生 TCP Retransmission 的情形自然也是五花八门,具体问题具体分析。

http://www.lryc.cn/news/518509.html

相关文章:

  • #Phi-4:微软 14B 参数开源模型,性能匹敌 OpenAI GPT-4o-mini,现已登陆 Ollama
  • JSON头文件调用
  • Swagger学习⑭——@Contact注解
  • 如何监听Vuex数据的变化?
  • Redis 优化秒杀(异步秒杀)
  • 前端中常用的单位度量(px,rpx,rem,em,vw,vh)+图片自适应
  • STM32之一种双通路CAN总线消息备份冗余处理方法(十三)
  • 从零开始:使用VSCode搭建Python数据科学开发环境
  • C#语言的字符串处理
  • 《安富莱嵌入式周报》第348期:开源低功耗测试仪,开源创意万用表,续航100-300小时,开源PCB电机,自制shell和网络协议栈,开源水培自动化系统
  • npm发布流程说明
  • 缓存-文章目录
  • LeetCode 3297.统计重新排列后包含另一个字符串的子字符串数目 I:滑动窗口
  • 如何在 Ubuntu 24.04 上安装 Memcached 服务器教程
  • 《深度学习模型在鸿蒙分布式框架下的跨设备高效之旅》
  • [python3]Excel解析库-xlutils
  • Springboot Bean创建流程、三种Bean注入方式(构造器注入、字段注入、setter注入)、循坏依赖问题
  • mybatisX插件的使用,以及打包成配置
  • 【初阶数据结构】线性表之单链表
  • CentOS7通过yum安装JDK
  • c# 常见的几种取整场景
  • 数据库回滚:大祸临头时
  • 【GoLang】两个字符串如何比较大小?以及字典顺序的比较规则
  • 5G学习笔记之SNPN系列之UE入网和远程配置
  • C#版OpenCv常用函数大全
  • Spring Boot教程之五十二:CrudRepository 和 JpaRepository 之间的区别
  • 蓝桥杯备考:数据结构之栈 和 stack
  • solidity基础 -- 映射
  • Angular 11课程实践:构建高效单页应用的支持代码
  • 测试用例颗粒度说明