zoukankan      html  css  js  c++  java
  • tcpdump抓取TCP标识位

    tcpdump抓取TCP标识位

    按每8位组算,TCP的标志位位于第138位组中,如下,第一行一共32位是0 - 38位组,第二行是4-7八位组,第三行是8-11八位组,data offset +reserved的前四个是第128位组,reserved中的后2+6个标志位是第13个八位组。

    以下TCP报头

    wps_clip_image-1232

    因此第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包。

    如果想同时抓synsyn+ack包,则进行tcp[13]位值与掩码进行与运算:

    tcp[13] & 2 == 2

    此外,还可以利用 tcp[tcpflags]=tcp-syn 这种格式来写,后面的值可以为tcp-fin, tcp-syn, tcp-rst, tcppush, tcp-ack, tcp-urg任意一种。

    示例

    1、打印TCP会话中的的开始和结束数据包,并且数据包的源或目的不是本地网络上的主机。

    tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

    localnet, 实际使用时要真正替换成本地网络的名字

    2、打印所有源或目的端口是80,网络层协议为IPv4,并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包。

    tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

    ip[2:2]表示整个ip数据包的长度; (ip[0]&0xf)<<2)表示ip数据包包头的长度(ip[0]&0xf代表包中的IHL域,而此域的单位为32bit,要换算成字节数需要乘以4,即左移2)(tcp[12]&0xf0)>>4 表示tcp头的长度,此域的单位也是32bit,换算成比特数为 ((tcp[12]&0xf0) >> 4)<<2,即 (tcp[12]&0xf0)>>2)

    原文

    [1]http://hi.baidu.com/nanjidegou/item/7d144cc0f3499252ac00efe7

    [2]http://www.cnblogs.com/ggjucheng/archive/2012/01/14/2322659.html

    [3]http://blog.chinaunix.net/uid-7934175-id-3379372.html

  • 相关阅读:
    C#(99):Queue<T>队列与Stack<T>堆栈
    C#(99):字典Dictionary<Tkey.TValue>与SortedList
    C#(99):列表:List<T>与HashSet和只读集合
    C#(99):C#数组Array
    C#(99):枚举类型与位域枚举Enum
    C#(99):结构类型:Struct
    C#(99):定义类成员(属性、方法、索引、运算符、事件)、接口实现
    C#(99):定义类、System.Object对象、构造函数与析构函数、抽象类与静态类
    SuperSocket.ClientEngine介绍
    C#(99):五、并行编程
  • 原文地址:https://www.cnblogs.com/mydomain/p/2924257.html
Copyright © 2011-2022 走看看