SYNOPSIS:
    Tcpdump [ -adeflnNOpqRStuvxX ] [ -c count ]
            [ -C file-size ] [ -F file ]
            [ -i interface ] [ -m module ] [ -r file ]
            [ -s snaplen ] [ -T type ] [ -U user ] [ -w file ]
            [ -E algo:secret ] [ expression ]

DESCRIPTION:
    Tcpdump同windows下的sniffer,嗅探LAN中符合过滤跪着的数据包,网卡置于promiscuous-mode,(不知道能否在 switch LAN中实现嗅探?)如果侦听到的数据报不符合boolean规则,则简单drop,是否会在屏幕上print出来要根据不同的操作系统来决定了.

    Tcpdump并不是任何用户可以执行的,需要拥有相应权限才可以,如:
    SunOS 3.x/4.x及更高版本的nit/bpf界面,要运行Tcpdump,就需要对/dev/nit或/dev/bpf*有读的权限.
    Soloaris的DLPI中,用户对pseudo设备,如/dev/le有读/写的权限则可执行.(在较新的的版本上,并不支持所有用户,即使对 /dev/le有rw的权限,在promiscuous-mode侦听,只有root用户或对其属主设置了root的s位.)
    HP-UX的DLPI 必须为root用户或对root属主设置了s位
    IRIX的SNOOP 必须为root用户或对root属主设置了s位
    Linux 必须为root用户或对root属主设置了s位
    Ultrix及Digital Unix/Tru64 Unix 所有用户都可执行tcpdump,然而,没有人(包括super-user)能够在promiscuous-mode下捕获数据,要pfconfig激活了interface的promiscuous-mode才能实现,同样,只有super-user启用了copy-all-mode操作后才能捕获到 unicast流量.
    BSD 需要拥有/dev/bpf*的r权限.

OPTIONS:
    -a 尝试把网络或广播地址转换为名字
    -c 当捕获完指定的counts后结束tcpdump
    -C 当使用-w把输入定向到一个指定文件时,-C会检查当前记录的写入是否大于file_size,如果是,则创建一新文件,命名规则是在[-w file]指定的文件后累加一数值,一般从2开始
    -d 将匹配信息包的代码以人们能够理解的汇编格式输出
    -dd 将匹配信息包的代码以c语言程序段的格式输出
    -ddd 将匹配信息包的代码以十进制的形式输出
    -e 打印出数据链路层的头部信息
    -E 使用algo:secret对IPsec ESP数据解密,可用的算法有DES-CBC,3DES-CBC,BLOWFISH-CBC,RC3-CBC,CAST128-CBC等,默认为DES- CBC.如果要Tcpdump支持此功能,必须重新编译安装Tcpdump的密码系统模块.
    -f 将外部的Internet地址以数字的形式打印出来,而不是字符形式
    -F 从指定的文件中读取表达式,忽略其他表达式
    -i 指定侦听的interface,如未指定,则侦听所有可用端口(Loopback除外)
    -l 使用标准输出变为缓冲行形式 如:
    tcpdump -l | tee dat 或 tcpdump l > dat &&tail -f dat
    -m 载入文件指定的SMI MIB模块
    -n 不要把主机地址转换为名字,可避免DNS查询
    -nn 不要把协议及端口对应的地址(TCP/UDP)转换为名字
    -N 不要显示FQDN,只打印主机名
    -O 禁止运行报文匹配模块的优化器,只有当你怀疑优化器有bug时才有用
    -p 禁止把借口置成promiscuous-mode(接口可能因其他原因而处于promiscuous-mode;因此,'-p'不能作为 'etherhost{local-hw-addr]'或'etherbroadcast'的简写)
    -q 快速输出,显示较少的协议信息,输出行会短一点点
    -r 从[-w file]输出的文件读取数据,如果文件为'-'时从标准输入读取数据
    -S 打印绝对模式,而不是相对的TCP序列号
    -s 从每个报文中截取snaplen字节的数据,而不是缺省的68(如果是SunOS的NIT,最小是96),68个字节适用于IP,ICMP,TCP和 UDP,但是有可能截掉名字服务器和NFS报文的协议信息.输出时如果指定"[|proto]",tcpdump可以指出那些捕获量过小的数据报,这里的 proto是截断发生出的协议层名字,注意,采用更大的捕获范围既增加了处理报文的时间,又相应的减少了报文的缓冲数量,可能导致报文的丢失,应该把 snaplen设的尽量小点,只要能够容纳你需要的协议信息就可以了
    -T 把通过'expression'挑选出来的报文解释成指定的type,目前已知的类型有:RPC,RTP,RTCP,WB等.
    -t 禁止显示时间戳标志
    -tt 显示未格式化的时间戳标志
    -ttt 在当前记录与上条记录中显示'delta'标志
    -tttt 打印'date'程序显示的默认时间戳标志
    -u 显示无法解码的NFS句柄
    -v 稍微详细的报文输出
    -vv 详细的报文输出
    -vvv 非常详细的报文输出
    -w 把每行显示的数据保存到指定file,可供以后通过 [-r file]分析此文件
    -x 以十六进制显示每一个报文(减去链路层报头后),可以显示较小的完整报文,否则只显示snaplen个字节
    -X 以十六进制及ASCII码显示每一个报文

EXPRESSION:
   
用来选择被dumped的数据报文,如果没有给出'expression',将dumped所有报文,否则只dumped 'expression'为'ture'的报文.
    'expression'通常由一个或多个原语(primitives)组成,原语通常由一个ID(名字或数字)和标识前面的一个或多个限定词(qualifiers),常见有三种限定词:
    type:type修饰词说明id名字或id数字有哪一些,常见的有host,net跟port,例如:
'host foo','net 128.3','port 20',如果没有指定任何type,则指定host为默认值
    dir:dir修饰词指出相对于id的传输方向(数据是进还是出),常用的有src,dst,src or dst,dst or src
    proto:要求匹配指定的协议,如:ether,fddi,tr,ip,ip6,arp,rarp,decnet,tcp,udp.如果未指定特定协议,默认匹配所有协议
   
    还有一些专用的primitives,如:gateway,broadcast,less,greater及数学表达式

   更加复杂,功能更加强大的filter表达式可以组合and,or,not来建立,例如:
    host foo and not port ftp and not port ftp-data
    为了节省输入,相同的primitives可以省略,如:
    tcp dst port ftp or ftp-data or domain 等同
    tcp dst prot ftp or tcp dst ftp-data or tcp dst domain

    允许的primitives组合有
    dst host host:如果报文中IP的目的地址域是host,则逻辑为真,host可以为地址或名字
    src host host:如果报文中IP的源地址域是host,则逻辑为真
    host host:如果报文中IP的源地址,目标地址域是host,则逻辑为真,以上所有的host表达式都可以加上ip,arp,rarp,ip6等关键字,
    如: ip host host 同等于 ether proto \ip and host host
    如果host名字对应多个IP地址,则每个地址都会被匹配一次.
    ether dst ehost:如果报文的以太网目的地址是ehost,则逻辑为真,ehost既可以是名字(/etc/ethers),也可以是数字.
    ether src host:如果报文的以太网源地址是ehost,则逻辑为真
    ether host ehost:如果报文的以太网源地址和目的地址是ehost,则逻辑为真
    gateway host:如果报文把host当作网关,则逻辑为真.也就是说报文的源或目的地址是host,但IP的源或目的地址不是host.host必须是一个主机名,而且必须在/etc/hosts及/etc/ethers中存在.
    dst net net:如果报文中IP的目的地址域属于网络号net,则逻辑为真
    src net net:如果报文中IP的源地址域属于网络号net,则逻辑为真
    net net:如果报文的源和目的地址属于网络号net,则逻辑为真
    net net mask netmask:如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真,可用src及dst修饰
    net net/len:如果IP地址匹配指定网络掩码的net,则逻辑为真.掩码的有效位宽为len,可用src及dst修饰
    dst port port:如果报文是ip/tcp,ip/udp,ip6/tcp或ip6/udp,且目的端口的值是port,则此端口可以是 /etc/services中的名字或数值.如果使用名字,端口号及协议将被检查,如果使用数字,或有二义的名字,只检查端口号(如:dst port 513 将打印tcp/login的数据跟udp/who的数据,而port domain将打印tcp/domain跟udp/domain的数据.
    src port port:如果报文源端口的值是port,则逻辑为真
    port port:如果报文源或目的端口的值为port,则逻辑为真,以上所有的port表达式都可以加上tcp,udp等关键字.
    如:tcp src port port
    仅仅匹配源端口为port的TCP数据包
    less length:如果数据报的长度小于或者等于length,则逻辑为真,等价于len<=length.
    greater length:如果数据报的长度大于或等于length,则逻辑为真,等价于len>=length
    ip proto protocol:如果数据为IP数据报,协议类型是protocoal,则逻辑为真,Protocol可以是一数值,或是icmp,icmp6, igmp,igrp,pim,ah,esp,vrrp,udp,tcp之一. 注意这些表示符tcp,udp,和icmp也同样是关键字,所以必须用'\'转义,在C shell中应该是'\\'.
    ether broadcast:如果报文是以太网广播,则逻辑为真,关键字ether是可选的
    ip broadcast
    如果报文是IP广播报文,则逻辑为真,Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码
    ether multicast:如果报文是以太网多播,则逻辑为真,关键字ether是可选的.这实际上是'ether[0]&1!=0'的简写
    ip multicast:如果报文是IP多播,则逻辑为真