Wireshark 提示和技巧 | 快速显示过滤之 TCP 三次握手

标题

首先简单说说标题的含义。
快速 主要是想尽量的快速且方便的进行过滤;
显示过滤 对,说的是显示过滤,而非捕获过滤。
TCP三次握手 仅过滤 TCP 三次握手的相关数据包。


相信最常用的是过滤方法就是 tcp.flags.syn == 1 ,该显示过滤方式针对 SYN 进行过滤,因此得到的的仅是 TCP 三次握手的前两个包,并不包括最后一个 ACK 数据包。

或者使用 tcp.stream == xx 的过滤方式也可以看到想要的结果,如果存在三次握手,则会显示在 TCP 流 xx 的数据包的最上面,但这种方式过滤得到的不仅仅是 TCP 三次握手数据包。

而本文仅针对只过滤出 TCP 三次握手数据包的方式。


基础

TCP 首部报文格式图,镇楼,经典~
TCP3-01
本文不赘述 TCP 首部各字段以及 TCP 三次握手的概念,主要重点关注 TCP Flags ,其他字段再相应展开。

显示过滤表达式主用: tcp.flags、tcp[13]


实例

  • 使用相对序列号;
  • == 或 eq、>= 或 ge、<= 或 le、and 或 &&、or 或 || ,看个人喜好或习惯,无差异。
  1. 仅 SYN

tcp.flags.syn == 1 && tcp.flags.ack == 0 TCP Flags SYN 位置 1,ACK 位置 0。
或者
tcp[13] == 2 仅 SYN 位置 1 即可,值为 2。
或者
tcp.flags == 0x002 非标准过滤(黄色提示),但仍可运行。

推荐第一种写法;
第二种和第三种写法,大多数情况适用,但是在存在 ECN、CWR 的场景下并不准确。


  1. 仅 SYN/ACK

tcp.flags.syn == 1 && tcp.flags.ack == 1 TCP Flags SYN 位置 1,ACK 位置 1。
或者
tcp[13] == 12 SYN 位置 1,ACK 位置 1 ,值为 12。
或者
tcp.flags == 0x012 非标准过滤(黄色提示),但仍可运行,不推荐。

推荐第一种写法;
第二种和第三种写法,大多数情况适用,但是在存在 ECN、CWR 的场景下并不准确。


  1. 仅 ACK

tcp.seq == 1 && tcp.ack == 1 && tcp.len == 0 && tcp.analysis.initial_rtt
或者
tcp.seq == 1 && tcp.ack == 1 && tcp.len == 0 && !(tcp.window_size_scalefactor == -1)

或者一些大同小异的写法
tcp.seq == 1 && tcp.ack == 1 && tcp.nxtseq == 1 && tcp.analysis.initial_rtt
tcp.seq == 1 && tcp.ack == 1 && tcp.nxtseq == 1 && !(tcp.window_size_scalefactor == -1)
tcp.seq == 1 && tcp.ack == 1 && tcp.nxtseq == 1 && (tcp.window_size_scalefactor >= 0 or tcp.window_size_scalefactor == -2)

tcp.len == 0tcp.nxtseq == 1 可互换使用;
tcp.analysis.initial_rtt!(tcp.window_size_scalefactor == -1)(tcp.window_size_scalefactor >= 0 or tcp.window_size_scalefactor == -2) 可互换使用。


在大多数情况下,tcp.seq == 1 && tcp.ack == 1 && tcp.len == 0 即可正常过滤出 TCP 三次握手的第三个 ACK,但是进一步测试表明,并不完美。可能的特殊情况包括:

  • TCP 三次握手的第三个数据包包含数据

不可能嘛?完全有可能的情况。

  • 不存在 TCP 三次握手的 TCP 流

还会显示不存在三次握手(未捕获到)的 TCP 流的每个方向上的第一个数据包,此处需要重点理解 相对序列号 的概念。

针对第一种情况,可能完美的过滤方式并不存在;
针对第二种情况,因此增加排除 tcp.window_size_scalefactor == -1 ,即没看到三次握手数据包,窗口大小因子为 -1 的场景。


  1. SYN + SYN/ACK

tcp.flags.syn == 1
或者
tcp[13] & 2 特殊写法


  1. SYN + SYN/ACK + ACK — 完整的 TCP 三次握手

(tcp.flags.syn == 1) or (tcp.seq == 1 && tcp.ack == 1 && tcp.len == 0 && tcp.analysis.initial_rtt)

该方法也可能会包括 TCP 三次握手的一些重传包;
同样,后半段也可使用 3 中介绍的一些不同写法。


数据包的世界没有不可能,上述方法并不一定完美适合所有情况。手头上虽然没有实际的数据包文件,但是能想到的一些特殊场景,可能会影响第三个 ACK 的抓取,结果就是过滤后的数据包只多不少,包括:

  • TCP 三次握手成功后,立马 FIN 或 RST 的场景;(可再加上 !tcp.flags.fin == 1 或者 !tcp.flags.reset == 1 进行过滤)
  • TCP 三次握手成功后,Len 1 数据包过后进入 Keepalive 的场景;(或者直接进入的场景,脑补中)
  • … 待补充

总结

之后可通过 Analyze -> Display Filters 增加过滤表达式书签或者增加 Display Filter Button 等方式,即可快速应用该 TCP 三次握手 显示过滤。



感谢阅读,更多技术文章可关注个人公众号:Echo Reply ,谢谢。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值