Wireshark 過濾器
過濾器:
tcp
tcp.flags.ack == 0 篩選出所有未設置 ACK 的數據包 ?
ip.src_host==192.168.1.100 and tcp.flags.ack==0 可顯示源 IP 為 192.168.1.100 的未確認數據包
?三次握手的第一次握手?:客戶端發送 SYN 標志位,此時 ACK 為 0,用于請求建立連接。 ?
四次揮手的第一次揮手?:客戶端發送 FIN 標志位,此時 ACK 也為 0,表示關閉連接的開始。
Wireshark 快速顯示過濾之 TCP 三次握手
快速 主要是想盡量的快速且方便的進行過濾;
顯示過濾 對,說的是顯示過濾,而非捕獲過濾。
TCP三次握手 僅過濾 TCP 三次握手的相關數據包。
tcp.flags.syn == 1 ,該顯示過濾方式針對 SYN 進行過濾,因此得到的的僅是 TCP 三次握手的前兩個包,并不包括最后一個 ACK 數據包。
tcp.stream == x 的過濾方式也可以看到想要的結果,如果存在三次握手,則會顯示在 TCP 流 xx 的數據包的最上面,但這種方式過濾得到的不僅僅是 TCP 三次握手數據包。
=====================================================
顯示過濾表達式主用: tcp.flags、tcp[13]
實例
使用相對序列號;
== 或 eq、>= 或 ge、<= 或 le、and 或 &&、or 或 || ,看個人喜好或習慣,無差異。
僅 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 的場景下并不準確。
僅 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 的場景下并不準確。
僅 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 == 0 和 tcp.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,但是進一步測試表明,并不完美??赡艿奶厥馇闆r包括:
TCP 三次握手的第三個數據包包含數據
不可能嘛?完全有可能的情況。
不存在 TCP 三次握手的 TCP 流
還會顯示不存在三次握手(未捕獲到)的 TCP 流的每個方向上的第一個數據包,此處需要重點理解 相對序列號 的概念。
針對第一種情況,可能完美的過濾方式并不存在;
針對第二種情況,因此增加排除 tcp.window_size_scalefactor == -1 ,即沒看到三次握手數據包,窗口大小因子為 -1 的場景。
SYN + SYN/ACK
tcp.flags.syn == 1
或者
tcp[13] & 2 特殊寫法
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 三次握手 顯示過濾。

浙公網安備 33010602011771號