跳转至主要内容

有人发给我以下抓包记录,并询问这是否代表重传,因为“数据包编号”出现了重复

T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0486 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 PA
R 0000 TCP host2.sub2.dom2.com  host.subdomain.domain.co      4000 49957 A
R 0000 TCP host2.sub2.dom2.com  host.subdomain.domain.co      4000 49957 A
R 0000 TCP host2.sub2.dom2.com  host.subdomain.domain.co      4000 49957 A
R 0000 TCP host2.sub2.dom2.com  host.subdomain.domain.co      4000 49957 A
R 0044 TCP host2.sub2.dom2.com  host.subdomain.domain.co      4000 49957 PA
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A
T 0536 TCP host.subdomain.domain.com host2.sub2.dom2.com      49957 4000 A

她提到“数据包编号”时,我有点困惑;她指的是最后两列数字。我解释说,这些是源端口号和目标端口号,而不是数据包编号。遗憾的是,我无法回答她的问题,因为她从 TCP 数据包头中捕获的信息不足,无法判断这些是否为重传数据包。

要判断某个 TCP 数据包是否为重传,必须捕获该数据包的序列号。在每次 TCP 连接建立之初,两个主机都会选择随机的序列号,然后在发送每个字节的 TCP 数据时递增该序列号。接收方主机会在确认字段中回传其预期收到的下一个序列号。

以下示例展示了我建议的 packet_monitor 最小控制参数集;假设您不仅关注数据包的发送或接收信息。interface 参数用于指定要监视的 IP 接口。如果您未提供接口名称,packet_monitor 将监视所有接口。packet_monitor 可能会占用大量流内存,使用 interface 参数有助于减少这一内存消耗。 -verbose 参数将实际打印序列号和确认号,同样地,若不使用该参数,将无法识别重传数据包。它还会打印其他有助于分析跟踪信息的数据,例如生存时间 (TTL) 和窗口大小 (window) 值。-filter -host 和 -port 参数有助于识别特定连接,并减少您需要查看的数据包数量。

packet_monitor-interface#sdlmux.m16.11-2-verbose -filter -host172.16.1.34 -p
+ort23
dir                                                 icmp type           tcp
dir   len proto source             destination         src port dst port type
发送 IP  版本/头长 45, ToS 0, 长度   29, ID 8569, 标志/帧号    0, TTL 3c, 端口 6
校验和 9eaf, 源 ac100174, 目标 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 数据包
序列号448953077,确认号 1766884569,窗口大小 65535,1 字节数据,标志位 Push Ack.
X/Off 05,标志 18,校验和 9c85,Urg-> 0000
已接收 IP   版本/头长 45,ToS 0,长度 29,ID 45db,标志/帧号 0,TTL 3c,端口 6
校验和 de3d,源地址 ac100122,目标地址 ac100174
来自 172.16.1.34 的 TCP 连接,目标 phx_vos-m16.51094;
序列号 1766884569,确认号448953078,窗口 8192,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 c984,Urg-> 0000
发送方 IP   版本/头长 45, 服务类型 0, 长度 29, 标识 8576, 标志/帧号 0, TTL 3c, 端口 6
校验和 9ea2, 源地址 ac100174, 目标地址 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 连接
序列号448953078,确认号 1766884570,窗口 65535,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 d883,Urg-> 0000
已接收 IP   版本/头长 45,ToS 0,长度 29,ID 45dc,标志/帧号 0,TTL 3c,端口 6
校验和 de3c,源地址 ac100122,目标地址 ac100174
来自 172.16.1.34 的 TCP 连接至 phx_vos-m16.51094
序列号 1766884570,确认448953079,窗口 8192,1 字节数据,标志为 Push Ack。
X/Off 05,标志 18,校验和 c982,Urg-> 0000
发送方 IP   版本/头长 45,ToS 0,长度 28,ID 8580,标志/帧号 0,TTL 3c,端口 6
校验和 9e99,源地址 ac100174,目标地址 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 连接
序列号 448953079,确认号 1766884571,窗口 65535,0 字节数据,标志位 Ack.
X/Off 05,标志 10,校验和 098b,Urg-> 0000
已接收 IP   版本/头长 45,ToS 0,长度 28,ID 45dd,标志/帧号 0,TTL 3c,端口 6
校验和 de3c,源地址 ac100122,目标地址 ac100174
来自 172.16.1.34 的 TCP 连接,目标 phx_vos-m16.51094
序列号 1766884571,确认号448953079,窗口大小 8192,0 字节数据,标志位 Ack。
X/Off 05,标志 10,校验和 e98a,Urg-> 0000

上述序列号每次增加1,因为每个数据包仅包含1字节的数据;如果数据包包含10字节、23字节或1023字节,则序列号将分别增加10、23或1023。

那么,重传是什么样子的呢?在重传中,序列号小于或等于前一个序列号,且至少包含 1 字节数据;不含数据的数据包不计入其中。在下面的示例中,序列号 448953089 被重复多次。除了第一次之外,其余每次都是重传。

packet_monitor -interface #sdlmux.m16.11-2 -verbose -filter -host 172.16.1.34 -p
+ort 23
dir                                                 icmp type           tcp
dir   len proto source             destination         src port dst port type
已接收 IP   版本/头长 45,ToS 0,长度 28,ID 4d43,标志/帧号 0,TTL 3c,端口 6
校验和 d6d6,源地址 ac100122,目标地址 ac100174
来自 172.16.1.34.telnet 发往 phx_vos-m16.51094 的 TCP 连接
序列号 1766885133,确认号448953089,窗口大小 8192,数据字节 0,标志位 Ack。
X/Off 05,标志 10,校验和 e74e,Urg-> 0000
发送方 IP   版本/头长 45,ToS 0,长度 29,ID 9191,标志/帧号 0,TTL 3c,端口 6
校验和 9287,源地址 ac100174,目标地址 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 连接
序列号448953089,确认号 1766885133,窗口 65535,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 9745,Urg-> 0000
发送方 IP   版本/头长 45, 传输状态 0, 长度 29, 标识 919a, 标志/帧号 0, 生存时间 3c, 端口 6
校验和 927e, 源地址 ac100174, 目标地址 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 连接
序列号448953089,确认号 1766885133,窗口 65535,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 9745,Urg-> 0000
发送方 IP   版本/头长 45, 传输状态 0, 长度 29, 标识 91a0, 标志/帧号 0, 生存时间 3c, 端口 6
校验和 9278, 源地址 ac100174, 目标地址 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 连接
序列号448953089,确认号 1766885133,窗口 65535,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 9745,Urg-> 0000
……
发送方 IP   版本/头长 45, 传输状态 0, 长度 29, 标识 91f9, 标志/帧号 0, 生存时间 3c, 端口 6
校验和 921f, 源地址 ac100174, 目标地址 ac100122
来自 phx_vos-m16.51094 发往 172.16.1.34.telnet 的 TCP 连接
序列号448953089,确认号 1766885133,窗口 65535,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 9745,Urg-> 0000
已接收 IP   版本/头长 45,ToS 0,长度 29,ID 4f04,标志/帧号 0,TTL 3c,端口 6
校验和 d514,源地址 ac100122,目标地址 ac100174
来自 172.16.1.34.telnet 发往 phx_vos-m16.51094 的 TCP 数据包;
序列号 1766885133,确认号448953090,窗口大小 8192,数据 1 字节,标志位 Push Ack。
X/Off 05,标志 18,校验和 7744,Urg-> 0000

除了界面参数和详细输出参数外,我还建议添加 time_stamp 和 numeric 参数。time_stamp 参数会在显示的每个数据包上添加时间戳,这使得将日志文件中的消息与跟踪结果进行关联变得更加容易,并允许您估算事件(如重传序列)的实际持续时间。numeric 参数通过避免查找主机名或端口名来降低开销。

packet_monitor -interface #sdlmux.m16.11-2 -verbose-time_stamp -numeric-filter
+ -host 172.16.1.34 -port 23
dir                                                 icmp type
+        tcp
hh:mm:ss.ttt 类型   长度 协议 源地址             目标地址         源端口 目标端口
+t 端口 类型
14:30:17.604 发送 IP   版本/头长 45, ToS 0, 长度   29, ID 9b7b, 标志/帧号    0, TTL 3
+c, 端口 6
校验和 889d,源 ac100174,目标 ac100122
TCP 来自 172.16.1.116.51094 发往 172.16.1.34.telnet
序列号 448953090,确认号 1766885134,窗口 65535,1 字节数据,标志位 Push Ack.
X/Off 05,标志位 18,校验和 9b43,Urg-> 0000
14:30:17.606 接收 IP   版本/头长 45,ToS 0,长度 29,ID 5442,标志/帧号 0,TTL 3
+c,端口 6
校验和 cfd6,源地址 ac100122,目标地址 ac100174
来自 172.16.1.34.telnet 发往 172.16.1.116.51094 的 TCP 数据包
序列号 1766885134,确认号 448953091,窗口 32768,1 字节数据,标志位 Push Ack。
X/Off 05,标志 18,校验和 1b42,Urg-> 0000

如果确定问题出在 TCP 或 IP 层,通常这些信息就已足够。但是,如果问题可能出在应用层,则还需要实际的数据。您可以使用 -hex_dump 参数来显示数据。默认情况下,只会显示前 128 字节的数据。为了保险起见,我总是将长度设置为 1500,这样就能显示数据包中的全部数据。

packet_monitor -interface #sdlmux.m16.11-2 -verbose -time_stamp -numeric -hex_du
+mp -length1500 -filter -host 172.16.1.34 -port 23
dir                                                 icmp type
+        tcp
hh:mm:ss.ttt 方向   长度 协议 源地址             目标地址         源端口 目标端口
+t 端口 类型
10:25:19.387 接收 IP   版本/头长 45, ToS 0, 长度   3字节, ID f8f, 标志/帧号    0, TTL 3
+c, 端口 6
校验和 1478,源 ac100122,目标 ac100174
TCP 来自 172.16.1.34.49562 发往 172.16.1.116.telnet
序列号 110526313,确认号 1206659552,窗口 32768,19 字节数据,标志位 Push Ack
+.
X/Off 05,标志位 18,校验和 d3ee,Urg-> 0000
偏移量 0 . . . 4 . . .   8 . . . C . . . 0...4... 8...C...
0    54 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 20 74 * 这只是一个 t
10    65 73 74                                         * est
10:25:19.389 发送 IP   版本/头长 45, ToS 0, 长度   3字节, ID f969, 标志/帧号    0, TTL 3
+c, 端口 6
校验和 2a9d, 源 ac100174, 目标 ac100122
来自 172.16.1.116.telnet 发往 172.16.1.34.49562 的 TCP 数据包
序列号 1206659552,确认号 110526332,窗口 8192,19 字节数据,标志位 Push Ack
+.
X/Off 05,标志 18,校验和 33dc,Urg-> 0000
偏移量 0 . . . 4 . . .   8 . . . C . . . 0...4... 8...C...
0    54 68 69 73 20 69 73 20 6f 6e 6c 79 20 61 20 74 * 这仅是一个测试
10    65 73 74                                         *
10:25:22.263 发送 IP   版本/头长 45, ToS 0, 长度   28, ID f994, 标志/帧号    0, TTL 3
+c, 端口 6
校验和 2a85, 源 ac100174, 目标 ac100122
来自 172.16.1.116.telnet 发往 172.16.1.34.49562 的 TCP 数据包
序列号 1206659571,确认号 110526332,窗口大小 8192,0 字节数据,标志位 Ack。
X/Off 05,标志 10,校验和 7b7a,Urg-> 0000
无 TCP 数据。

在向他人发送包含数据的 packet_monitor 跟踪记录之前,请务必对数据(包括文本和十六进制值)进行数据清理,以删除专有信息。在某些情况下,您可能还需要对 IP 地址进行清理。IP 地址出现在两个位置:在协议头解码行中,它们以标准的点分十进制表示法显示;而在解码行正上方的行中,它们则以十六进制值显示。

10:25:22.263 发送 IP   版本/头长 45, ToS 0, 长度   28, ID f994, 标志/帧号    0, TTL 3
+c, 端口 6
校验和 2a85, 源ac100174, 目标ac100122
来自172.16.1.116.telnet 发往172.16.1.34.49562 的 TCP 数据包
序列号 1206659571,确认号 110526332,窗口大小 8192,0 字节数据,标志位 Ack。
X/Off 05,标志 10,校验和 7b7a,Urg-> 0000
无 TCP 数据。