ChatTCP是怎么像Wireshark那样识别TCP重传、乱序和心跳保活的

TCP协议并没有提供一个单独的标志位来标识一个数据包是否是重传数据包、乱序数据包,或者是Keep-Alive数据包。但是我们能够看到Wireshark能识别出哪些数据包是重传、乱序或Keep-Alive数据包,通常会给出提示[TCP Retransmission][TCP Out-Of-Order][TCP Dup ACK],也能识别出Keep-Alive数据包和Keep-Alive应答数据包,通常会给出提示 [TCP Keep-Alive]或者[TCP Keep-Alive ACK]

ChatTCP是一款能让查看网络数据包变得像阅读聊天记录一样简单的工具。作为一个能够简化TCP数据包查看和分析的工具,当然也必须能够像Wireshark那样识别出[TCP Retransmission][TCP Out-Of-Order][TCP Dup ACK][TCP Keep-Alive]以及[TCP Keep-Alive ACK]数据包。那么我们是怎么识别的呢?

如何识别一个数据包是重传或乱序数据包?

重传不是根据时间判断,同一时间发的就是重传吗?

当然不是,不能单纯依靠时间判断。因为TCP协议并没有时间!我们看到的时间只是抓包时间。当我们在客户端抓包时,抓包时间只是客户端发送数据包的时间,或是客户端接收到服务端发来的数据包的时间。

为了分析重传和乱序,我们需要关注同一个方向(例如,所有从客户端发往服务端的数据包)的数据流。将这些数据包按照抓包时间排序后进行分析:

  • 重传:如果一个数据包之前已经出现过,那么这个数据包就是重复的数据包,也就是重传数据包。
  • 乱序:如果一个数据包的序列号比它前面的一个数据包还小,那就是乱序。[TCP Out-Of-Order]

乱序很容易理解,判断序列号(seq)是否是有序的就可以,而重传的判断就比较复杂。

要判断一个数据包是否重传其实就是判断这个数据包是否是一个重复 的数据包,那么怎么样才算重复的TCP数据包呢?

当两个数据包具有相同的序列号(seq)、确认号(ack)、以及相同Payload和标志位(flags)时,那么就可以确认这是一个重复的数据包。

序列号和确认号相同,Payload就一定相同(或Payload都是空),所以也可以简化为:当两个数据包具有相同的序列号、确认号、以及相同标志位时,那么就可以确认这是一个重复的数据包。

为什么标志位也要相同才算重复

因为序列号、确认号相同,而标志位不同时,可能一个是纯应答数据包,另一个是挥手+应答数据包:(行为不同)

ini 复制代码
seq=1000, ack=3000, Flags=ACK 
seq=1000, ack=3000, Flags=FIN、ACK

怎么进一步区分是[TCP Retransmission]还是[TCP Dup ACK]呢,这就需要通过标志位判断了,一个重传数据包,如果存在ACK标志位并且不是发送数据(Payload为空)基本可以判定为[TCP Dup ACK]

在ChatTCP中,我们还会进一步判断重传数据包的细分类型:

  • 如果存在SYN标志位,那么这是一个重传的握手数据包。[TCP Retransmission]
  • 如果存在FIN标志位,那么这是一个重传的挥手数据包。[TCP Retransmission]
  • 如果存在ACK标志位,且该数据包应答的是一个握手数据包(对应待应答的数据包存在SYN标志位),那么这是一个重传的应答握手的数据包。[TCP Dup ACK]
  • 如果存在ACK标志位,且Payload为空,那么这是一个重传的应答数据包。[TCP Dup ACK]
  • 如果存在ACK标志位,且Payload不为空,那么这是一个重传的数据数据包。[TCP Retransmission]

如何识别一个数据包是Keep-Alive数据包?

Wireshark判断的条件是: - 只含ACK标识位 - Payload大小为0或1 - seq等于本端下一个待发送序列号减1

那怎么区分[TCP Keep-Alive][TCP Keep-Alive ACK]呢?

如果对应待应答的数据包是一个Keep-Alive数据包,那么这个数据包就是一个Keep-Alive应答数据包([TCP Keep-Alive ACK])。

Keep-Alive应答数据包不会出现重传情况(没有[TCP Keep-Alive Retransmission]),因为Keep-Alive数据包不要求对方一定回复一个应答数据包。

相关推荐
TlSfoward8 小时前
如何用 TLS 与 HTTP 指标降低误伤 TLSFOWARD抓包工具
网络·网络协议·http
念恒123069 小时前
Socket编程UDP(中)
linux·网络协议·udp
汤愈韬10 小时前
关于OSPF中一类、二类、三类LSA的一些思考
网络·网络协议
柒号华仔10 小时前
一文讲透5G RedCap
网络协议·5g·信息与通信
Flandern111110 小时前
HTTPS(TLS 1.3)完整流程
数据库·网络协议·计算机网络·https
网安老伯12 小时前
网络安全基础要点知识介绍(非常详细),零基础入门到精通,看这一篇就够了
运维·前端·网络协议·web安全·网络安全·职场和发展
会编程的土豆12 小时前
HTTP 是什么:你打开 localhost:8080 时发生了什么
网络·网络协议·http
M1582276905521 小时前
跨协议互通利器|SG-PN-EIP (S)-220 Profinet 转 EtherNet/IP 网关,打通欧美 PLC 通讯壁垒
网络·网络协议·tcp/ip
闲猫1 天前
Spring AI对接Deepseek 使用Charles代理api.deepseek.com 拦截报文,查看Tool和Skill的本质
网络·网络协议·http
agathakuan1 天前
Wireshark 解密並導出TLS 1.2 / TLS 1.3 明文的方法(可控制 Client 端)
c语言·wireshark·ssl·openwrt