按每8位组算,TCP的标志位位于第13个8位组中,如下,第一行一共32位是0 - 3个8位组,第二行是4-7八位组,第三行是8-11八位组,data offset +reserved的前四个是第12个8位组,reserved中的后2位+6个标志位是第13个八位组.
因此第13个八位组结构为
- - + + + + + +
前面2个是保留的,都为0,后面的6个根据不同情况有不同值,例如syn 包 则为
00 0 0 0 0 1 0
这是二进制转化为十进制就是2
因此 tcpdump -ni eth0 tcp[13]==2 就表示syn包
同理,syn+ack包为
00 0 1 0 0 1 0
化为十进制就是18,因此tcpdump -ni eth0 tcp[13]==18 表示syn+ack包
如果想同时抓syn和syn+ack包,则进行tcp[13]位值与掩码进行与运算:
tcp[13] & 2 == 2
原理:
既然希望同时抓syn和syn+ack,说明syn位是我们要关心的位置,因此仿照网络掩码的与运算,只关心syn位的掩码是00 0 0 0 0 1 0,将
00010010 SYN-ACK 00000010 SYN
AND 00000010 (we want SYN) AND 00000010 (we want SYN)
-------- --------
= 00000010 = 00000010
与运算的结果都是2,因此
tcp[13] & 2的结果应等于2, 即tcp[13] & 2 == 2
---------
如果觉得记忆和计算这些很难,则可以利用
tcp[tcpflags]=tcp-syn 这种格式来写,后面的值可以为tcp-fin, tcp-syn, tcp-rst, tcppush,
tcp-ack, tcp-urg任意一种
文章评论