打印信息包头。
tcpdump [ -d ] [ -e ] [ -f ] [ -I ] [ -n ] [ -N ] [ -O ] [ -p ] [ -q ] [ -S ] [ -t ] [ -v ] [ -x ] [ -c Count ] [ -F File ] [ -i Interface ] [ -r File ] [ -s Snaplen ] [ -w File ] [ Expression ]
tcpdump 命令打印从与布尔 Expression 参数相匹配的网络接口捕捉到的信息包头。如果没有给出Expression参数,所有网络上的信息包都将被转储。否则,仅当信息包的 Expression 参数为 True 时才会被转储。仅支持以太网、光纤分布式数据接口(FDDI)、令牌环和回送接口。访问权由 /dev/bpfO、1、2 和 3 之上的许可权控制。
Expression 参数包括一个或多个原语。 原语通常由前面有一个或多个限定符的一个 标识(名称或号码)组成。限定符分三种:
允许的原语如下所示:
简单关系:
expr replop expr
当 relop 为 >(大于), <(小于),>=(不等于), <= (小于或等于),= (等于), != (叹号与等号)之一时为真,而 expr 是由整常数(以标准 C 语法表示), 常用二目运算符 +(加号),-(减号),* (乘号),/ (除号), & (与号), | (或号),长度运算符和特殊包数据附件组成的算术表达式。要存取信息包里的数据,请使用以下语法:
proto [ expr : size ]
Proto 是关键字 ip、arp、rarp、tcp 或 icmp 之一,并表示索引操作的协议层。与所指协议层相关的字节偏移量由 expr 给出。指示符 size 可选,它指示所感兴趣字段里的字节数;它可以是一个、两个或四个,缺省设为一个字节。由关键字 len 表示的长度操作符,给出了信息包的长度。
例如,表达式 ip[0] & 0xf != 5 仅捕捉非片断数据报和片断数据报的 0 片断。该检测暗指 tcp 和 udp 索引操作。例如:tcp[0] 通常意味着 TCP 报头的第一字节,而从不表示中间片断的第一个字节。
更复杂的过滤表达式的建立可以通过使用 and、or 和 not 来组合原语。例如: host foo and not port ftp and not port ftp-data。为了减少输入,可以省略相同的限定符列表。例如: tcp dst port ftp or ftp-data or domain 与 tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain 完全相同。
通过使用括入括号的原语和操作符组(括号是 Shell 专用的,且必须转义)可以组合原语。
“非”具有最高优先顺序。“或”和“与”具有相同的优先顺序,并按由左向右的顺序执行。
如果给出了一个没有关键字的标识符,则采用最近使用的关键字。例如:
not host gil and devo
是
not host gil and host devo
的缩略语,不要与
not \(host gil or devo\) 相混淆。
表达式参数可作为单参数或多参数(两者中较方便的)传递给 tcpdump 命令。通常,如果表达式包含 Shell 元字符,将其作为单个的、加引号的参数来传递会更容易。多参数在分析之前以空格相连。
tcpdump 命令的输出随协议而定。下面是大多数输出格式的简要描述和示例。
TCP 协议行的通用格式为:
src > dst: flags data-seqno ack win urg options
在下列字段列表中,src、dst 和 flags 一直存在。其它字段取决于信息包的 TCP 协议头的内容,并仅在适当的时候输出。
rlogin 命令从主机 gil 到主机 devo 的开始部分为:
gil.1023 > devo.login:S 768512:768512(0) win 4096 <mss 1024> devo.login > gil.1023:S 947648:947648(0) ack 768513 win 4096 <mss 1024> gil.1023 > devo.login: . ack 1 win 4096 gil.1023 > devo.login: P 1:2(1) ack 1 win 4096 devo.login > gil.1023: ack 2 win 4096 gil.1023 > devo.login: P 2:21(19) ack 1 win 4096 devo.login > gil.1023: P 1:2(1) ack 21 win 4077 devo.login > gil.1023: P 2:3(1) ack 21 win 4077 urg 1 devo.login > gil.1023: P 3:4(1) ack 21 win 4077 urg 1
第一行是指主机 gil 上的 TCP 端口 1023 向主机 devo 的登录端口发送一个信息包。这个 S 表明已经设置 SYN 标志。信息包的序列号为 768512,它不含数据。(标记“first:last(nbytes)”意味着“序列号 first 上限可达但不包含 last,即用户数据为 nbytes 字节”。)不含带外部关联的 ack 字段,可用接收字段 win 为 4096 字节,并且最大段大小(mss)选项要求 1024 字节的 mss。
主机 Devo 以一个类似的包答复,但该信息包内含有一个有外部关联 ack 字段,用于主机 gil的 SYN。然后,主机 gil 应答主机 devo 的 SYN。. (句点)表示没有设置标志。该信息包不含数据,所以也就没有数据序列号。
注:ack 字段序列号为一个小整数(1)。
当 tcpdump 第一次遇到 TCP 对话时,它从该信息包中打印序列号。在随后的对话信息包中,打印了当前信息包的序列号与该初始序列号的差异。这意味着第一个之后的序列号可以解释为对话数据流中的相对字节位置(每个方向的第一个数据字节为 1)。-S标记覆盖该特性,并导致输出原序列号。
在第六行,主机 gil 发送给主机 devo 19 字节的数据(在 gil-devo 对话侧的第 2 字节到第 20 字节)。在信息包内设置了 PUSH 标志。在第七行,主机 devo 声称它收到了主机 gil 发送的上限可达到但不包含第 21 字节的数据。因为 devo 的接收窗口收到较小的 19 字节,这一数据的大部分显然位于套接字缓冲区。主机 devo 还发送其信息包内的一个字节的数据给主机 gil。在第八、九行,主机 devo 发送两字节的 urgent PUSH 数据到主机 gil。
该 rwho 命令信息包说明 UDP 格式:
devo.who > bevo.who: udp 84
该命令序列说明主机 devo 的端口 who 发送一个 udp 数据报给主机 bevo 的端口 who。该信息包内含有 84 字节的用户数据。
一些 UDP 服务(从源或目的地端口号)可被识别,并且打印出更高层的协议信息。尤其是域名服务请求(RFC-1034/1035)和到 NFS 的 Sun RPC 呼叫(RFC-1050)。
名称服务器请求格式为:
src > dst: id op? flags qtype qclass name (len)
除了上述字段,UDP 名称服务器请求包含以下内容:
id | 指定查询的标识号。 |
op | 指定操作类型。缺省为查询操作。 |
qclass
name
(len)
下面是名称服务器的请求示例:
tnegev.1538 > tnubia.domain: 3+ A? austin.ibm.com. (37)
主机 tnegev 向 tnubia 上的域服务器询问与名称 austin.ibm.com 关联的地址记录( qtype=A)。查询 id 为 3。+(加号)表示已经设置递归要求标志。查询长度为 37 字节,不包含 UDP 和 IP 协议头。查询为标准操作 Query,所以省略 op 字段。如果 op 为其它值,它会在 3 和 + 之间打印出来。类似地,qclass 为一标准类( C_IN) 也被省略。任何其它 qclass 会直接在 A 之后打印出来。
会检查一些异常,这可能会使方括号内包含额外的字段。如果查询包含应答、名称服务器或权限段,则 ancount、nscount 或 arcount 打印为 na],[nn] 或 [nau],其中 n 为适当的计数。如果设置了任一响应位(AA,RA,或 rcode)或者设置了字节 2 和 3 的任意“必须为零”位,[b2&3=x] 会被打印出来,其中 x 是头字节 2 和 3 的十六进制值。
名称服务器响应格式为:
src > dst: id op rcode flags a/n/au type class data (len)
除以上所述字段外,UDP 名称服务器响应包括以下内容:
rcode
data
下面是名称服务器响应的一个示例:
tnubia.domain > tnegev.1538: 3 3/3/7 A 129.100.3 tnubia.domain > tnegev.1537: 2 NXDomain* 0/1/0 (97)
在第一个示例中,tnubia 以 3 回答记录、3 名称服务器记录和 7 权限记录响应来自 tnegev 的查询 3。第一个回答记录为 A 类(地址),其数据为 internet 地址 129.100.100.3。响应共计 273 字节,不含 UDP 和 IP 头。与 A 记录的类(C_IN)的情形相似,省略了 op(Query)和响应代码(NoError)。
在第二个示例中,tnubia 以一个不存在的域的响应代码(NXDomain)和 0 回答记录,1 名称服务器记录和 0 权限记录响应查询 2。* (星号)表示设置了授权回答位。因为没有回答,所以不打印类型、类或数据。
其它可能显示的标志字符有 -(递归可用,RA,未设置)和 |(截断的消息,TC,已设置)。
注:名称服务器请求和响应可能很大,80 字节的缺省 snaplen 有可能不能捕捉足够的信息包以打印。如果需要调查大量的名称服务器流量,用 -s 标志来增加 snaplen。
Sun NFS(网络文件系统)请求与答复的格式为:
src.xid > dst.nfs: len op args src.nfs > dst.xid: reply stat len
除以上所述字段外,NFS 请求和响应包括以下这些字段:
args | 指定目录文件 $file handle$。 |
reply stat | 表示操作的响应状态。 |
下面是 NFS 请求与响应的一个示例:
L1.e2766 > L2.nfs: 136 readdir fh 6.5197 8192 bytes @ 0 L2.nfs > L1.e2766: reply ok 384 L1.e2767 > L2.nfs: 136 lookup fh 6.5197 `RCS'
在第一行,主机 L1 发送一个 id 为 e2766 的事务到 L2(注意,src 主机后面的数字是事务号,而非源端口)。请求为 136 字节,不含 UDP 和 IP 头。操作为在文件句柄(fh)6.5197 上的 readir(读目录)。开始于偏移量0,8192 字节被读取。L2 以 384 字节数据应答 ok。
在第三行,L1 要求 L2 在目录文件 6.5197 中查询名称“RCS”。注意:打印的数据取决于操作类型。
注:NFS 请求非常大,除非增加 snaplen,否则以上内容不会打印出来。用标记 -s 192 观察 NFS 流量。
地址解析协议/反向地址解析协议(ARP/RARP)输出表示请求的类型和其参数。下面的示例显示了从主机 devo 到主机 bevo 的 rlogin 命令的启动:
arp who-has bevo tell devo arp reply bevo is-at 1d:2d:3d:4d:5d:6d
第一行是 devo 发送了一个 ARP 包,询问因特网主机 bevo 的以太网地址。在第二行,bevo 以它的以太网地址答复。
片断因特网数据报打印如下:
(frag id:size@offset+) (frag id:size@offset)
第一个表单表明有更多的片断。第二个表明这是最后的片断。IP 片断有以下字段:
id | 标识片断。 |
size | 指定片断大小(按字节)包括 IP 头。 |
offset | 指定原数据报中的片断偏移量(按字节)。 |
片断信息按每一片断输出。第一片断包括较高层的协议报头而片断信息在协议信息之后打印。第一个之后的片断不包含更高层的协议头,而片断信息在源和目的地地址之后打印。例如一个 ping echo/reply 序列:
gil > devo: icmp: echo request ( frag 34111: 1480@0+) gil > devo: (frag 34111!28@1480) devo > gil: icmp: echo reply (frag 15314:148@0+)
一个带“请勿拆分” IP 标志的信息包以一个(DF)在结尾标记。
缺省情况下,所有输出行前置一个时间戳。时间戳为表单内的当前时钟时间。
hh:mm:ss.frac
并且与内核的时钟一样精确。时间戳反映了内核第一次发现包的时间。没有尝试去说明以太网接口从线上除去信息包到内核服务新信息包中断之间的时间迟延。
tcpdump host devo
tcpdump ip host gil and \(devo bevo\)
tcpdump ip host bevo and bevo gil
tcpdump net 192.100.192
tcpdump ip and not net localnet
tcpdump \(tcp[13] \& 3 !=0 and not src and dst net localnet\)
tcpdump \(icmp[0] !=8 and icmp[0] !=0\)
tcpdump -I
tcpdump -i tr0
tcpdump -wTraceInfo