语法
tcpdump [-AbdDefhHIJKlLnNOpqRStuUvxX ]
[ -B buffer_size ]
[ -c count ]
[ -C file_size ]
[ -G rotate_seconds ]
[ -F file ]
[ -i interface ]
[ -j tstamp_type ]
[ -m module ]
[ -M secret ]
[ -P in | out | inout ]
[ -r file ]
[ -V file ]
[ -s snaplen ]
[ -T type ]
[ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,… ]
[ -y datalinktype ]
[ -z postrotate-command ]
[ -Z user ]
[ expression ]
描述
tcpdump打印出网络接口上面匹配布尔表达式expression的包的内容的描述信息。提供 -w参数,
tcpdump会保存包数据到一个文件中,以做以后的分析之用;如果使用了-r参数,tcpdump不会从
网络接口读取数据包,而是从一个文件中读取,该文件是使用-w参数生成的数据包文件;使用-V
参数,tcpdump会读取一系列数据包文件。在所有的情况下,只有使表达式expression为true的
数据包才会被tcpdump处理。
   如果没有使用了-c参数,tcpdump会持续捕获数据包直到被杀死或者被使用ctrl-c中断;如果使
   
   用了-c参数,那么tcpdump会在捕获了count个数据包后或者被中断或者被杀死后退出。
   当tcpdump完成了数据包的捕获之后,他会报告以下信息:
   
   捕获的数据包的:这是tcpdump已经接收并且处理的数据包的数量
   
   被过滤器接收的数据包的数量:该数据的意义依赖于你运行tcpdump的操作系统以及操作系统
   
   被配置的方式。如果过滤器是在命令行上指定的话,它代表总的数据包的数量而不论数据包
   
   是否匹配过滤表达式,即使数据包匹配了过滤表达式,也不管tcpdump是否已经读取并且
   
   处理了这些数据包;在另外一些操作系统上,它只代表匹配了过滤表达式的数据包的数量,
   
   而不管tcpdump是否处理了它们;在其它的一些操作系统上,它只代表匹配过滤表达式的并
   
   且并tcpdump处理了的数据包的数量
   
   被内核丢弃的数据包的数量:这是被丢弃的数据包的数量,主要是由于缓冲区空间太小,
   从网络接口监听数据包可能需要你具有root权限;从一个保存的数据包文件中读取数据包不需要
   
   root权限
   选项
   
   -A    以ASCII码打印出每一个数据包(去除链路层首部)。对于捕获web页面来说很方便。
   
   -b    以ASDOT符号打印BGP包中的自制系统号码
   
   -B    设置操作系统捕获缓冲区大小为 buffer_size KB
   
   -c     捕获count个数据包后退出
   
   -C
   
   -d
   
   -dd
   
   -ddd
   
   -D    打印出tcpdump可以监听的网络接口的列表。对于每一个接口,打印一个号码和接口名,接口名
   
   和号码可以当做-i选项的参数用于指定捕获哪一个网络接口的数据包。
   
   -e    在输出的每一行上打印出数据链路层的首部。
   
   -E
   
   -f
   
   -F    使用file文件中的内容作为过滤表达式。命令行上的过滤表达式被忽略
   
   -G
   
   -h    打印出tcpdump和libpcap的版本号以及一条有用的信息,然后退出
   
   -H    尝试探测802.11协议数据包头
   
   -i    监听端口interface。如果未指定,则监听系统接口列表中接口号码最小的接口
   
   -I    将网络接口置于监控模式
   
   -j    设置捕获时候的时间戳类型为tstamp type
   
   -J    列出接口支持的时间戳类型
   
   -K    不要尝试去验证IP,TCP,UDP的校验和
   
   -l    将输出缓冲
   
   -L    列出接口支持的数据链路类型
   
   -m
   
   -M
   
   -n    不要把地址转换成名字
   
   -N    不要打印全限定域名主机名
   
   -O    不要运行包匹配代码优化器。当你怀疑优化器有bug时很有用
   
   -p    不要将接口置于混杂模式
   
   -P    选择要捕获的数据包的接受/发送方向。有效值为 in,out,inout
   
   -R
   
   -r    从file文件读取数据包(该数据包是以-w参数生成的)
   
   -S    打印绝对(不是相对)tcp报文段序号
   
   -s
   
   -T    将捕获的数据包强制解释为指定的类型
   
   -t    不要在输出行上打印时间戳
   
   -tt    在每一行上打印未格式化的时间戳
   
   -ttt    打印当前行和上一行之间的时间增量
   
   -tttt    在输出行上以默认格式打印时间戳
   
   -ttttt    打印当前行和第一行之间的时间增量
   
   -u
   
   -U
   
   -v        产生稍为详细的输出
   
   -vv        产生更加详细的输出
   
   -vvv    产生更更加详细的输出
   
   -V    从file文件读出一个文件名的列表
   
   -w    将数据包写入文件file
   
   -W    和-C配合使用
   
   -x    当解析和输出的时候,除了打印每一个包的包头,也以十六进制打印每一个包的数据(去掉
   
   数据链路层的首部)。
   
   -xx        当解析和输出的时候,除了打印每一个包的首部,也打印每一个包的数据,包括数据链路
   
   层的首部,以十六进制打印。
   
   -X    以十六进制和ASCII打印每个包的首部和数据,去除数据链路层的首部
   
   -XX        同上,不过也打印数据链路层的首部
   
   -y
   
   -z
   
   -Z    切换用户
   
   expression
   
   选择转储哪一个包。如果没有使用expression,网络上所有的包都被转储。否则,只有使
   
   expression为true的包才会被转储。过滤表达式的语法在下面介绍。
   过滤表达式
   
   过滤表达式包含一个或者多个primotives(原语)。primitive通常包含一个id(名字或者数字),
   
   id的前面是一个或者多个限定词。有三种类型的限定词:
   
   type    type限定词说明了id指的是哪一种数据。可能的types有 host,net,port,和
   
   portrange。例如,host foo,net 128.3,port 20,portrange 6000-8000.如果没有
   
   type限定词,那么假定限定词是host。
   
   dir        dir限定词指定了数据包相对于id的传输方向。可能的方向有src,dst,src or dst,
   
   src and dst,ra,ta,addr1,addr2,addr3,addr4.例如:src foo,dst net 128.3
   
   如果没有dir限定词,假定dir限定词是src or dst。限定词ra,ta,addr1,addr2,
   
   addr3,addr4只对IEEE 802.11无线网有效。
   
   proto    proto限定词限定匹配到某一个特别的协议。可能的协议有:ether,fddi,tr,wlan,
   
   ip,ip6,arp,rarp,decnet,tcp,udp。例如:ether src foo,arp net 128.3
   
   如果没有指定proto限定词,假定所有的协议都可以。
   除了以上的以外,还有一些特殊的primitive关键字,这些关键字不符合以上模型:gateway,
   
   broadcast,less,greater和算术表达式。
   
   更复杂的过滤表达式可以使用关键字and,or和not去组合primitive。例如:
   
   host foo and not port ftp-data。
   
   允许的primitive有:
   
   dst host (host)
   
   如果数据包的目的ip是(host),(host)可以是一个地址或者名字。该表达式为true
   
   src host  (host)
   
   同上,不过是源ip地址
   
   host (host)
   
   如果数据包的源ip或者目的ip是host那么该表达式为true。
   
   以上三个host表达式都可以在前面加上以下关键字:ip,arp,rarp,或者ip6
   
   ether dst (ehost)
   
   如果数据帧的以太网卡目的地址为ehost,则该表达式为真,ehost或者是一个/etc/ethers
   
   里面的名字或者是一个数字网卡地址。
   
   ether src (ehost)
   
   ether host (ehost)
   
   如果捕获的数据帧的目的或源网卡地址是ehost,则该表达式为true。
   
   gateway (host)
   
   dst net (net)
   
   如果数据包的ip地址的网络号是net,则表达式为true。
   
   src net (net)
   
   net (net)
   
   net (net) mask (netmask)
   
   net (net/len)
   
   dst port (port)
   
   如果数据包的目的端口号是port,为true。
   
   src port (port)
   
   port (port)
   
   dst portrange (port1-port2)
   
   src portrange (port1-port2)
   
   portrange (port1-port2)
   
   如果数据包的目的端口或者源端口的范围在port1到port2之间,那么该表达式为true
   
   以上所有与port有关的表达式都可以在前面加上tcp或者udp。那样的话就只匹配tcp报文段
   
   或者udp数据报。
   
   less (length)
   
   len <= (length)
   
   如果数据帧的长度小于等于length,该表达式为真。
   
   greater (length)
   
   len >= (length)
   
   ip proto (protocol)
   
   如果数据帧是一个ip数据包,ip的协议字段的协议是protocol,该表达式为真。可能的
   
   protocol是icmp,igmp,icmp6,igrp,pim,ah,esp,vrrp,udp,或者tcp。注意
   
   协议tcp,udp,和icmp同样是关键字,因此必须在他们的前面加上反斜杠。在cshell中
   
   应该加上两个反斜杠。
   
   …
   
   …
   
   …
   
   primitive可能使用一些运算符组合在一起:
   
   括弧
   
   取反(!或者not)
   
   相与(&&或者and)
   
   相或(||或者or)
   
   取反优先级最高。与运算和或运算具有相同的优先级和自左至右的结合性。
  
 
