网站的域名和密码是什么意思,广告代理发布平台,网站建设全程揭秘 课件下载,建立网站对吗前言
默认情况下#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时#xff0c;会对每个 TCP 数据包进行一次分析#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…前言
默认情况下Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时会对每个 TCP 数据包进行一次分析数据包按照它们在数据包列表中出现的顺序进行处理。可以通过 “Analyze TCP sequence numbers” TCP 解析首选项启用或禁用此功能。
TCP 分析展示
在数据包文件中进行 TCP 分析时关于 “TCP Out-Of-Order” 一般是如下显示的包括
Packet List 窗口中的 Info 信息列以 [TCP Out-Of-Order] 黑底红字进行标注Packet Details 窗口中的 TCP 协议树下在 [SEQ/ACK analysis] - [TCP Analysis Flags] 中定义该 TCP 数据包的分析说明。 考虑到 TCP 乱序、重传场景的复杂性专家信息在乱序的判断上前面都会有一个(suspected)表示疑似说明并不是百分百正确属于 Warning 级别。 TCP Out-Of-Order 定义
文档中关于 TCP Out-Of-Order 的定义看起来简单但实际考虑到 TCP 乱序、重传场景的复杂性在 TCP 分析中对于 TCP Out-Of-Order 是与 TCP Spurious Retransmission、TCP Fast Retransmission、TCP Retransmission 等在一起判断标记乱序或重传类型而在不少场景还会有判断出错的问题当然 Wireshark 考虑到这种情况也有手动修正的选项这正好也侧面证明了上面的说法关于 TCP 乱序、重传的复杂性。
TCP Out-Of-Order 的定义如下当以下所有条件都为真时设置
不是 Keep-Alive 数据包TCP 段大小大于零或设置了 SYN/FIN同方向之前下一个期望的 Seq Num 大于当前数据包的 Seq Num同方向之前下一个期望的 Seq Num 和当前数据包的 Next Seq Num 不同最后一个报文段到达的时间在乱序 RTT 阈值内。这个阈值可以是两种情况之一1). 如果在SEQ/ACK 分析下存在 “IRTT”tcp.analysis.initial_rtt字段则使用该值作为阈值。2).如果不存在则使用默认值 3 毫秒作为阈值。
替代 Retransmission。
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 is set.
The next expected sequence number is greater than the current sequence number.
The next expected sequence number and the next sequence number differ.
The last segment arrived within the Out-Of-Order RTT threshold. The threshold is either the value shown in the “iRTT” (tcp.analysis.initial_rtt) field under “SEQ/ACK analysis” if it is present, or the default value of 3ms if it is not.Supersedes “Retransmission”.具体的代码如下总的来说这段代码是 Wireshark 中 TCP 分析模块的一部分用于检测和标识 TCP 数据包中的各种重传/乱序类型。它的主要功能是根据当前数据包的序列号、长度、标志位以及之前收到的 TCP 数据包的信息判断当前数据包是否属于重传/乱序如果是则进一步确定它属于哪种重传/乱序类型。
根据分析 TCP 数据包的各种特征对重传/乱序数据包进行分类有助于更好地理解 TCP 连接中的重传/乱序行为对于诊断网络问题很有帮助。这段代码的主要逻辑如下如果所有下述条件均满足则认为该数据包是一个乱序包详见 case FALSE 部分。
首先判断
检查 seq_not_advanced序列号是否未递增检查数据包到达的时间是否在设定的阈值内IRTT 或 3ms检查数据包之前是否未被看到
继续判断
如果同方向之前下一个期望的 Seq Num 不等于当前数据包 Seq Num Len 1SYN|FIN/0则标记为乱序否则如果同方向之前 LastACK 的段长度为 0可能是纯ACK也标记为乱序这处理了一系列乱序包被纯 ACK 分隔的情况。 /* 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 (seglen0 || 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(tcpd-ta (tcpd-ta-flagsTCP_A_KEEP_ALIVE) ) {goto finished_checking_retransmission_type;}/* This segment is *not* considered a retransmission/out-of-order if* the segment length is larger than one (it really adds new data)* the sequence number is one less than the previous nextseq and* (the previous segment is possibly a zero window probe)** We should still try to flag Spurious Retransmissions though.*/if (seglen 1 tcpd-fwd-tcp_analyze_seq_info-nextseq - 1 seq) {seq_not_advanced FALSE;}...nextseq seqseglen;gboolean precedence_count tcp_fastrt_precedence;do {switch(precedence_count) {case TRUE:...case FALSE:/* If the segment came relatively close since the segment with the highest* seen sequence number and it doesnt look like a retransmission* then it is an OUT-OF-ORDER segment.*/t(pinfo-abs_ts.secs-tcpd-fwd-tcp_analyze_seq_info-nextseqtime.secs)*1000000000;tt(pinfo-abs_ts.nsecs)-tcpd-fwd-tcp_analyze_seq_info-nextseqtime.nsecs;if (tcpd-ts_first_rtt.nsecs 0 tcpd-ts_first_rtt.secs 0) {ooo_thres 3000000;} else {ooo_thres tcpd-ts_first_rtt.nsecs tcpd-ts_first_rtt.secs*1000000000;}/* If the segment is already seen and waiting to be acknowledged, ignore the* Fast-Retrans/OOO debate and go ahead, as it only can be an ordinary Retrans.* Fast-Retrans/Retrans are never ambiguous in the context of packets seen but* this code could be moved above.* See Issues 13284, 13843* XXX: if compared packets have different sizes, its not handled yet*/gboolean pk_already_seen FALSE;ual tcpd-fwd-tcp_analyze_seq_info-segments;while(ual) {if(GE_SEQ(seq,ual-seq) LE_SEQ(seqseglen,ual-nextseq)) {pk_already_seen TRUE;break;}ualual-next;}if(seq_not_advanced t ooo_thres !pk_already_seen) {/* ordinary OOO with SEQ numbers and lengths clearly stating the situation */if( tcpd-fwd-tcp_analyze_seq_info-nextseq ! (seq seglen (flags(TH_SYN|TH_FIN) ? 1 : 0))) {if(!tcpd-ta) {tcp_analyze_get_acked_struct(pinfo-num, seq, ack, TRUE, tcpd);}tcpd-ta-flags|TCP_A_OUT_OF_ORDER;goto finished_checking_retransmission_type;}else {/* facing an OOO closing a series of disordered packets,all preceded by a pure ACK. See issue 17214 */if(tcpd-fwd-tcp_analyze_seq_info-lastacklen 0) {if(!tcpd-ta) {tcp_analyze_get_acked_struct(pinfo-num, seq, ack, TRUE, tcpd);}tcpd-ta-flags|TCP_A_OUT_OF_ORDER;goto finished_checking_retransmission_type;}}}precedence_count!precedence_count;break;}} while (precedence_count!tcp_fastrt_precedence) ;...finished_checking_retransmission_type:next expected sequence number为 nextseq定义为 highest seen nextseq。lastack定义为 Last seen ack for the reverse flow。lastacklen定义为 length of the last fwd ACK packet - 0 means pure ACK。 Packetdrill 示例
根据上述 TCP Out-Of-Order 定义和代码说明通过 packetdrill 模拟连续传入数据分段但顺序颠倒了一个满足乱序的判断条件后会标记成 TCP 乱序数据包。
# cat tcp_out_of_order_01.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) 00 S 0:0(0) win 16000 mss 1460
0 S. 0:0(0) ack 1 ...
0.01 . 1:1(0) ack 1 win 160000 accept(3, ..., ...) 4
0 P. 1:21(20) ack 1 win 15000
0.001 P. 41:61(20) ack 1 win 15000
0.001 P. 21:41(20) ack 1 win 15000
# 经 Wireshark 展示如下可以看到满足判断条件后No.8 标识 [TCP Out-Of-Order] 是因为客户端发送的数据分段 No.6 Seq Num 41 和 No.4 Next Seq Num 21 之间缺少了一个长度为 20 字节的数据分段No.6 标识为 [TCP Previous segment not captured] 而 No.7 标识为 [TCP Dup ACK] 紧接着之后的 No.8 Seq Num 21 Len 20 数据包标识为 [TCP Out-Of-Order]。 在这里再验证下数据包到达的时间如果不在设定的阈值内也就是 11ms 大于 IRTT 10ms是否会被标记成乱序数据包。
# cat tcp_out_of_order_02.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) 00 S 0:0(0) win 16000 mss 1460
0 S. 0:0(0) ack 1 ...
0.01 . 1:1(0) ack 1 win 160000 accept(3, ..., ...) 4
0 P. 1:21(20) ack 1 win 15000
0.001 P. 41:61(20) ack 1 win 15000
0.011 P. 21:41(20) ack 1 win 15000
# 答案是不会不满足乱序数据包条件被标记成了重传数据包。 实例
关于 TCP Out-Of-Order 的实例实际日常抓包中经常会看到是比较常见的一种 TCP 分析信息而在各类场景中也会伴生着出现像是 TCP Dup ACK 、TCP Previous segment not captured 等信息。
标准 TCP 乱序
标准的 TCP 乱序场景No.119 和 No.120 中间缺失一个 Seq 237 Len 207 的数据分段No.120 首先会提示 [TCP Previous segment not captured]之后 No.122 Seq 237 Len 207 的数据包到来满足乱序数据包的判断条件标记成 [TCP Out-Of-Order]。 也可以使用 ip.id 加以佐证如下No.122 IP ID 15284实际上是在 No.119 15283 和 No.120 15286 之间说明就是乱序数据包。 ip.id 辅助的方式非标准实现多数场景下可用但不是所有场景都适合。 TCP 乱序纯 ACK
代码中描述的一系列乱序包被纯 ACK 分隔的场景其中 No.13 为纯 ACKNo.15 为乱序的第一个数据包它满足判断乱序代码中继续判断的第一种场景nextseq ! (seq seglen)因此被标记为 [TCP Out-Of-Order]而 No.19 为乱序的第二个数据包它满足判断乱序代码中继续判断的第二种场景lastacklen 0因为 No.13 为纯 ACK所以 No.19 也被标记为 [TCP Out-Of-Order]。 TCP 快速重传还是 TCP 乱序
TCP 快速重传和乱序混淆这似乎在目前的 Wireshark 版本中是经常可以看到的一种场景如下案例 服务器所发的数据包 No.20 前丢了一个 TCP 分段 Seq 9577 所以 No.20 标记为 TCP Previous segment not captured 客户端回应第一个 No.21 DUP ACK 确认还要 Seq 9577 分段原 ACK 在 No.19服务器下一个数据包 No.22 仍不是 TCP 分段 Seq 9577因此客户端回应第二个 No.23 DUP ACK 确认继续要 Seq 9577 分段此时服务器像是因为 DUP ACK 的原因触发了快速重传发送了 No.24 Seq 9577 数据包。
Wireshark 在此判断 No.24 为快速重传感觉确实合情合理因为包括 DUP ACK 2 等条件综合判断为真时就会认为是快速重传。但是细细一琢磨会发现里面有些问题IRTTIRTT 为 0.103362s 说明客户端和服务器端 RTT 约为 103ms如果捕获点在客户端No.24 和 No.23 之间的时间差值仅为 71ns。试问从客户端发出 No.23 到服务器收到 No.23 之后触发快速重传再到客户端所捕获这个 71ns 的时间完全不符合现实。 此时通过 IP.ID 加以佐证No.24 的 IP ID 为 49749 在 No.20 和 No.22 之前因此 No.24 实际上是乱序而不是快速重传。 总结
考虑到数据包会出现乱序、重传等各类不同的场景产生 TCP Out-Of-Order 的情形自然也是五花八门具体问题具体分析。 文章转载自: http://www.morning.pbmkh.cn.gov.cn.pbmkh.cn http://www.morning.jrgxx.cn.gov.cn.jrgxx.cn http://www.morning.zyslyq.cn.gov.cn.zyslyq.cn http://www.morning.zlces.com.gov.cn.zlces.com http://www.morning.gidmag.com.gov.cn.gidmag.com http://www.morning.tlrxt.cn.gov.cn.tlrxt.cn http://www.morning.ttryd.cn.gov.cn.ttryd.cn http://www.morning.pmxw.cn.gov.cn.pmxw.cn http://www.morning.cklld.cn.gov.cn.cklld.cn http://www.morning.gnhsg.cn.gov.cn.gnhsg.cn http://www.morning.rtzd.cn.gov.cn.rtzd.cn http://www.morning.llxns.cn.gov.cn.llxns.cn http://www.morning.fksrg.cn.gov.cn.fksrg.cn http://www.morning.rcntx.cn.gov.cn.rcntx.cn http://www.morning.bpmfn.cn.gov.cn.bpmfn.cn http://www.morning.nckzt.cn.gov.cn.nckzt.cn http://www.morning.cybch.cn.gov.cn.cybch.cn http://www.morning.sfmqm.cn.gov.cn.sfmqm.cn http://www.morning.zxcny.cn.gov.cn.zxcny.cn http://www.morning.fwkjp.cn.gov.cn.fwkjp.cn http://www.morning.xbwqg.cn.gov.cn.xbwqg.cn http://www.morning.rhdln.cn.gov.cn.rhdln.cn http://www.morning.xnnpy.cn.gov.cn.xnnpy.cn http://www.morning.gwxwl.cn.gov.cn.gwxwl.cn http://www.morning.skksz.cn.gov.cn.skksz.cn http://www.morning.mmkrd.cn.gov.cn.mmkrd.cn http://www.morning.fmry.cn.gov.cn.fmry.cn http://www.morning.wpmlp.cn.gov.cn.wpmlp.cn http://www.morning.pgjyc.cn.gov.cn.pgjyc.cn http://www.morning.rszbj.cn.gov.cn.rszbj.cn http://www.morning.smkxm.cn.gov.cn.smkxm.cn http://www.morning.dqwykj.com.gov.cn.dqwykj.com http://www.morning.lswgs.cn.gov.cn.lswgs.cn http://www.morning.tdfyj.cn.gov.cn.tdfyj.cn http://www.morning.sbczr.cn.gov.cn.sbczr.cn http://www.morning.bfybb.cn.gov.cn.bfybb.cn http://www.morning.mszwg.cn.gov.cn.mszwg.cn http://www.morning.wfwqr.cn.gov.cn.wfwqr.cn http://www.morning.juju8.cn.gov.cn.juju8.cn http://www.morning.kbqbx.cn.gov.cn.kbqbx.cn http://www.morning.kzcfr.cn.gov.cn.kzcfr.cn http://www.morning.rlqwz.cn.gov.cn.rlqwz.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.tnhqr.cn.gov.cn.tnhqr.cn http://www.morning.fgtls.cn.gov.cn.fgtls.cn http://www.morning.mrkbz.cn.gov.cn.mrkbz.cn http://www.morning.nnwnl.cn.gov.cn.nnwnl.cn http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn http://www.morning.hlrtzcj.cn.gov.cn.hlrtzcj.cn http://www.morning.pcgrq.cn.gov.cn.pcgrq.cn http://www.morning.lbpqk.cn.gov.cn.lbpqk.cn http://www.morning.wbqt.cn.gov.cn.wbqt.cn http://www.morning.hgfxg.cn.gov.cn.hgfxg.cn http://www.morning.lkkgq.cn.gov.cn.lkkgq.cn http://www.morning.cwkcq.cn.gov.cn.cwkcq.cn http://www.morning.ylpwc.cn.gov.cn.ylpwc.cn http://www.morning.tqrjj.cn.gov.cn.tqrjj.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.mpyry.cn.gov.cn.mpyry.cn http://www.morning.tymnr.cn.gov.cn.tymnr.cn http://www.morning.blqsr.cn.gov.cn.blqsr.cn http://www.morning.jntdf.cn.gov.cn.jntdf.cn http://www.morning.ykgkh.cn.gov.cn.ykgkh.cn http://www.morning.fhqsm.cn.gov.cn.fhqsm.cn http://www.morning.tsdjj.cn.gov.cn.tsdjj.cn http://www.morning.qgfhr.cn.gov.cn.qgfhr.cn http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn http://www.morning.yrnyz.cn.gov.cn.yrnyz.cn http://www.morning.fhhry.cn.gov.cn.fhhry.cn http://www.morning.ghxkm.cn.gov.cn.ghxkm.cn http://www.morning.lprfk.cn.gov.cn.lprfk.cn http://www.morning.mhfbf.cn.gov.cn.mhfbf.cn http://www.morning.gqjzp.cn.gov.cn.gqjzp.cn http://www.morning.hdnd.cn.gov.cn.hdnd.cn http://www.morning.mqnbm.cn.gov.cn.mqnbm.cn http://www.morning.cfnht.cn.gov.cn.cfnht.cn http://www.morning.mkccd.cn.gov.cn.mkccd.cn http://www.morning.rmpkn.cn.gov.cn.rmpkn.cn http://www.morning.xlbtz.cn.gov.cn.xlbtz.cn http://www.morning.wfpmt.cn.gov.cn.wfpmt.cn