TCP Analysis Flags 之 TCP Previous segment not captured

前言

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

TCP 分析展示

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

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

image.png

TCP Previous segment not captured 定义

实际在 TCP 分析中,关于 TCP Previous segment not captured 的定义非常简单:

Set when the current sequence number is greater than the next expected sequence number.

具体的代码如下,总的来说是检测 TCP 数据流中是否存在丢失的数据包,并在检测到丢失时设置相应的标志,同时暂时禁用 “BytesInFlight” 计算,以防止产生错误的估计。

关键就是当前数据包的序列号 seq 是否大于同方向之前下一个期望的序列号 nextseq

    /* LOST PACKET
     * If this segment is beyond the last seen nextseq we must
     * have missed some previous segment
     *
     * We only check for this if we have actually seen segments prior to this
     * one.
     * RST packets are not checked for this.
     */
    if( tcpd->fwd->tcp_analyze_seq_info->nextseq
    &&  GT_SEQ(seq, tcpd->fwd->tcp_analyze_seq_info->nextseq)
    &&  (flags&(TH_RST))==0 ) {
        if(!tcpd->ta) {
            tcp_analyze_get_acked_struct(pinfo->num, seq, ack, TRUE, tcpd);
        }
        tcpd->ta->flags|=TCP_A_LOST_PACKET;

        /* Disable BiF until an ACK is seen in the other direction */
        tcpd->fwd->valid_bif = 0;
    }

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

Packetdrill 示例

在上述 TCP Previous segment not captured 定义和代码可知,TCP 分析的逻辑很简单,因此通过 packetdrill 比较容易模拟出相关现象。

# cat tcp_previous_segment_not_captured.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 < P. 1:21(20) ack 1 win 15000
+0 < P. 41:61(20) ack 1 win 15000
+0.1 read(4, ..., 12000) = 20 

+0 `sleep 10000000`
# 

通过 tcpdump 捕获数据包后,经 Wireshark 展示如下,可以看到 No.4 和 No.6 中间缺少一个长度为 20 字节的数据分段(Seq 21 NextSeq 41),因此在 No.6 数据包中会判断为 [TCP Previous segment not captured],因为 No.6 Seq 41 > No.4 NextSeq 21。

image.png

实例

关于 TCP Previous segment not captured 的实例,实际日常抓包中经常会看到,是比较常见的一种 TCP 分析信息。当然不同的场景,也会伴生着出现像是 TCP Dup ACK TCP Out-Of-Order 等信息。

  1. 乱序

在 No.120 数据包中会判断为 [TCP Previous segment not captured],因为 No.120 Seq 444 > No.119 NextSeq 237,而认为丢失的数据包分段出现在 No.122 ,也就是发生了乱序情况。1-2-3 分段变成了 1-3-2 ,3 会标记成 [TCP Previous segment not captured],而 2 会标记成 [TCP Out-Of-Order]。

image.png

  1. 丢包

在 No.777 数据包中会判断为 [TCP Previous segment not captured],因为 No.777 Seq 105005 > No.776 NextSeq 104469,认为丢失了一个数据包分段 Seq 104469-105005,而 No.781 是所丢失数据包分段的超时重传,标记成 [TCP Retransmission]。

image.png

总结

一句话定义:Set when the current sequence number is greater than the next expected sequence number.

相关推荐

  1. Pythonfunctools模块lru_cache

    2024-07-11 23:14:01       40 阅读
  2. 蓝桥集训星空

    2024-07-11 23:14:01       39 阅读
  3. Pythonfunctools模块reduce、partial

    2024-07-11 23:14:01       36 阅读
  4. HBaseHBCK2

    2024-07-11 23:14:01       58 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-11 23:14:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-11 23:14:01       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-11 23:14:01       58 阅读
  4. Python语言-面向对象

    2024-07-11 23:14:01       69 阅读

热门阅读

  1. kubernetes授予用户指定命名空间的使用权限

    2024-07-11 23:14:01       25 阅读
  2. 开发中缓存的使用场景、注意事项及优缺点分析

    2024-07-11 23:14:01       22 阅读
  3. C# 如何单纯的优化循环

    2024-07-11 23:14:01       24 阅读
  4. .Net Core 微服务之Consul(一)

    2024-07-11 23:14:01       20 阅读
  5. YOLO 在OPENCV QT上如何使用?

    2024-07-11 23:14:01       24 阅读
  6. 技术成神之路:设计模式(一)单例模式

    2024-07-11 23:14:01       21 阅读
  7. perl语言入门学习

    2024-07-11 23:14:01       23 阅读
  8. Postman中的数据堡垒:API测试数据隔离的精粹

    2024-07-11 23:14:01       21 阅读
  9. JlmPack在医疗行业的使用

    2024-07-11 23:14:01       18 阅读
  10. Git-Updates were rejected 解决

    2024-07-11 23:14:01       22 阅读
  11. 一句话回答的前端面试题

    2024-07-11 23:14:01       21 阅读
  12. 使用Python进行计算机视觉

    2024-07-11 23:14:01       20 阅读