2008年05月13日 星期二 01:08
更新 learning-tcpdump.html 这个更新是对 http://www.zeuux.org/science/learning-tcpdump.cn.html 格式化了一下,并添加了最近的一些更新。 文件见附件。 -------------- next part -------------- An HTML attachment was scrubbed... URL: http://www.zeuux.org/pipermail/zeuux-www/attachments/20080513/dc38891d/attachment-0001.html
2008年05月13日 星期二 01:39
Well done, Xia Wu, please help Jianjun update them to the CVS. Jiannun, your document is collected in the ZEUUX book already, it will be published. Jianjun Kong 写道: > 更新 learning-tcpdump.html > 这个更新是对 http://www.zeuux.org/science/learning-tcpdump.cn.html 格式化了一下,并添加了最近的一些更新。 > 文件见附件。 > > > ------------------------------------------------------------------------ > > > 学习tcpdump > > > 作者:孔建军 <kongjianjun at gmail.com> > > > 1 tcpdump介绍 > > tcpdump 是一款开源的网络数据截取分析工具,具有强大的功能和灵活的截取策 > 略,用在网络的分析、维护、统计、检测等方面,例如定位网络瓶颈、统计网络 > 流量使用情况等。它支持针对网络层、协议、主机、网络或端口的过滤,正则表 > 达式的灵活应用能帮你准确获取有用信息。 > tcpdump 具备开源软件的优势,接口公开,具有较强的可扩展性。运行此命令必 > 须有root权限,它通过将网络接口设置为混杂模式,绕过标准TCP/IP堆栈,进行 > 工作。出于安全等问题考虑,FreeBSD里通过内核取消对伪设备bpfilter的支 > 持,来屏蔽tcpdump之类的网络分析工具,也可使用网桥、交换机等将不信任网 > 络隔开,但不能解决内网通信安全问题。在linux下可采用软件包或编译源代码 > 的方式安装。 > tcpdump官方网站:http://www.tcpdump.org/ > > > 2 运行效果 > > kongove at ubuntu:~$ sudo tcpdump -i eth0 host ubuntu.local > tcpdump: verbose output suppressed, use -v or -vv for full protocol decode > listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes > 09:39:10.448284 IP ubuntu.local.2425 > 255.255.255.255.2425: UDP, length 35 > 09:39:15.565249 IP ubuntu.local.2425 > 255.255.255.255.2425: UDP, length 29 > > > > 3 基本使用 > > tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] > [ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] > [ -T type ] [ -w file ] [ -W filecount ][ -E spi at ipaddr algo:secret,... ] > [ -y datalinktype ] [ -Z user ] [ expression ] > > > 通过对 tcpdump 选项、参数、表达式的组合应用,从大流量的网络数据当中, > 过滤出真正有用的信息,从而缩小分析范围。 > > > 3.1 tcpdump选项 > > 选项 含义 > -A 以ASCII格式打印出所有分组,并将链路层的头最小化。 > -d 将匹配信息包的代码以人们能够理解的汇编格式给出; > -D 打印出系统中所有可以用tcpdump截包的网络接口; > -ddd 将匹配信息包的代码以十进制的形式输出; > -e 在输出行打印出数据链路层的头部信息; > -f 将外部的Internet地址以数字的形式打印出来; > -l 使标准输出变为缓冲行形式; > -L 列出网络接口的已知数据链路; > -n 不把网络地址转换成主机名; > -N 不输出主机名中的域名部分,例如“kongove.ubuntu.cn”只输出 > “kongove”; > -O 不运行分组分组匹配(packet-matching)代码优化程序; > -p 不将网络接口设置成混杂模式; > -q 快速输出,只输出较少的协议信息; > -S 将tcp的序列号以绝对值形式输出,而不是相对值; > -t 在输出的每一行不打印时间戳; > -u 输出未解码的NFS句柄; > -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; > -vv 输出详细的报文信息; > -c count 指定监听数据包数量,当收到指定的包的数目后,tcpdump就会 > 停止; > -C file_size 限定数据包写入文件大小; > -F file 从指定的文件中读取表达式,忽略其它的表达式; > -i interface 指定监听网络接口; > -m module 打开指定的SMI MIB组件; > -M secret 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的 > 验证码用于验证TCP-MD5选选项摘要(详见 RFC 2385); > -r file 从指定的文件中读取包(这些包一般通过-w选项产生); > -s snaplen 从每个分组中读取最开始的snaplen个字节,而不是默认的68 > 个字节; > -T type 将截取的数据包直接解释为指定类型的报文,常见类型有rpc(远 > 程过程调用)和snmp(简单网络管理协议),还包括 aodv、cnfp、rpc、 > rtp、rtcp、snmp、tftp、vat、wb等; > -w file 指定将监听到的数据包写入文件,不分析和打印数据包; > -W filecount 限定能写入文件的数据包数量; > -E spi at ipaddr algo:secret,... 用spi at ipaddr algo:secret解密那些以 > addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组; > expression 综合表达式。 > > > 3.2 tcpdump表达式 > > tcpdump利用正则表达式作为过滤报文的条件,如果数据包满足表达式的条件, > 则会被捕获。如果没有给出任何条件,则网络上所有的数据包将会被截获。表达 > 式中常用关键字如下: > > * 1) 指定参数类型的关键字,主要包括host,net,port等,如果没有指定 > 类型,缺省的类型是host; > 例如:#tcpdump host 222.24.20.86 截获ip为222.24.20.86的主机收发 > 的所有数据包 > * 2) 指定数据报文传输方向的关键字,主要包括src , dst ,dst or src, > dst and src,缺省为src or dst; > 例如:#tcpdump src net 222.24.20.1 截取源网络地址为 222.24.20.1 > 的所有数据包 > * 3) 指定协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类 > 型,默认监听所有协议的数据包; > 例如:#tucpdump arp 截获所有arp协议的数据包 > * 4) 其他重要的关键字还有,gateway,broadcast,less,greater,三种 > 逻辑运算(取非运算是 'not ','! '; 与运算是 'and ','&& ';或运算 > 是'or ','|| ')等。这些关键字的巧妙组合,能灵活构造过滤条件,从 > 而满足用户需要。 > 例如:#tcpdump host ubuntu and src port \(80 or 8080\) 截取主机 > ubuntu上源端口为80或8080的所有数据包。 > > expression一个或多个原语 (primitive)组成。原语通常由一个标识(id,名称或 > 数字),和标识前面的一个或多个修饰子(qualifier)组成。 修饰子有三种不同的 > 类型: > > * type > > 类型修饰子指出标识名称或标识数字代表什么类型的东西. 可以使用的类 > 型有host, net 和 port。例如, `host foo', `net 128.3', `port 20'. > 如果不指定类型修饰子, 就使用缺省的 host。 > > * dir > > 方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识)。 可 > 以使用的方向有 src, dst, src or dst 和 src and dst。例如, `src > foo', `dst net 128.3', `src or dst port ftp-data'。如果不指定方 > 向修饰子, 就使用缺省的src or dst。 对于`null'链路层 (就是说象 > slip之类的点到点协议), 用inbound和outbound修饰子指定所需的传输方 > 向。 > > * proto > > 协议修饰子要求匹配指定的协议。可以使用的协议有: ether, fddi, ip, > arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp。例如, > `ether src foo', `arp net 128.3', `tcp port 21'。 如果不指定协议 > 修饰子, 就使用所有符合类型的协议. 例如, `src foo' 指 `(ip 或 arp > 或 rarp) src foo' (注意后者不符合语法), `net bar'指`(ip 或 arp > 或 rarp) net bar', `port 53'指 `(tcp 或 udp) port 53'。 (`fddi' > 实际上是 `ether'的别名; 分析器把它们视为 ``用在指定网络接口上的 > 数据链路层.'' FDDI报头包含类似于以太协议的源目地址, 而且通常包含 > 类似于以太协议的报文类型, 因此你可以过滤FDDI域, 就象分析以太协议 > 一样. FDDI报头也包含其他域, 但是你不能在过滤器表达式里显式描述。) > > 作为上述的补充, 有一些特殊的`原语'关键字, 它们不同于上面的模式: > gateway, broadcast, less, greater和数学表达式. 这些在后面有叙述。 更复 > 杂的过滤器表达式 可以通过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'。 > > 允许的 原语 有: > > * dst host host > > 如果报文中IP的目的地址域是host, 则逻辑为真. host既可以是地址, 也 > 可以是主机名. > > * src host host > > 如果报文中IP的源地址域是host, 则逻辑为真. > > * host host > > 如果报文中IP的源地址域或者目的地址域是host, 则逻辑为真. 上面所有 > 的host表达式都可以加上ip, arp, 或rarp关键字做前缀, 就象:ip host > host 它等价于: ether proto \ip and host host。 > > 如果host是拥有多个IP地址的主机名, 它的每个地址都会被查验。 > > * ether dst ehost > > 如果报文的以太目的地址是ehost, 则逻辑为真。Ehost既可以是名字 > (/etc/ethers里有),也可以是数字(有关数字格式另见 ethers(3N) )。 > > * ether src ehost > > 如果报文的以太源地址是ehost, 则逻辑为真。 > > * ether host ehost > > 如果报文的以太源地址或以太目的地址是ehost, 则逻辑为真。 > > * gateway host > > 如果报文把host当做网关, 则逻辑为真。也就是说,报文的以太源或目的 > 地址是host, 但是IP的源目地址都不是host。 host必须是个主机名, 而 > 且必须 存在/etc/hosts和/etc/ethers中. (一个等价的表达式是ether > host ehost and not host host,对于 host/ehost, 它既可以是名字, > 也可以是数字。) > > * dst net net > > 如果报文的IP目的地址属于网络号net,则逻辑为真.net既可以是名字(存 > 在/etc/networks中),也可以是网络号.(详见 networks(4))。 > > * src net net > > 如果报文的IP源地址属于网络号net,则逻辑为真。 > > * net net > > 如果报文的IP源地址或目的地址属于网络号net,则逻辑为真. > > * net net mask mask > > 如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用 > src或dst修饰. > > * net net/len > > 如果IP地址匹配指定网络掩码的net,则逻辑为真,掩码的有效位宽为len. > 本原语可以用src或dst修饰。 > > * dst port port > > 如果报文是ip/tcp或ip/udp,并且目的端口是port,则逻辑为真.port是一 > 个数字,也可以是/etc/services中说明过的名字 (参看tcp(4P)和udp > (4P)).如果使用名字,则检查端口号和协议.如果使用数字,或者有二义的 > 名字,则只检查端口号(例如, dstport513将显示tcp/login的数据和 > udp/who的数据,而portdomain将显示tcp/domain和udp/domain 的数据)。 > > * src 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数据报(参见ip(4P)),其内容的协议类型是protocol,则逻辑 > 为真.Protocol可以是数字,也可以是下列名称中的一个: > icmp,igrp,udp,nd,或tcp.注意这些标识符tcp,udp,和icmp也同样是关键 > 字,所以必须用反斜杠(\)转义,在C-shell 中应该是\\. > > * ether broadcast > > 如果报文是以太广播报文,则逻辑为真.关键字ether是可选的. > > * ip broadcast > > 如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且 > 检查本地的子网掩码. > > * ether multicast > > 如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可 > 选的.这实际上是`ether[0]&1!=0'的简写. > > * ip multicast > > 如果报文是IP多目传送报文,则逻辑为真. > > * ether proto protocol > > 如果报文协议属于以太类型的protocol,则逻辑为真.Protocol可以是数 > 字,也可以是名字,如ip,arp,或rarp.注意这些标识符也是关键字,所以必 > 须用反斜杠(\)转义.[如果是FDDI(例如,`fddiprotocolarp'),协议标识来 > 自802.2逻辑链路控制(LLC)报头,它通常位于FDDI报头的顶层.当根据协议 > 标识过滤报文时,Tcpdump假设所有的FDDI报文含有LLC报头,而且LLC报头 > 用的是SNAP格式.] > > * decnet src host > > 如果DECNET的源地址是host,则逻辑为真,该主机地址的形式可能是 > ``10.123'',或者是DECNET主机名.[只有配置成运行 DECNET的Ultrix系统 > 支持DECNET主机名.] > > * decnet dst host > > 如果DECNET的目的地址是host,则逻辑为真. > > * decnet host host > > 如果DECNET的源地址或目的地址是host,则逻辑为真.ip, arp, rarp, > decnet是: ether proto p的简写形式,其中p为上述协议的一种.lat, > moprc, mopdl 是: ether proto p的简写形式,其中p为上述协议的一种. > 注意tcpdump目前不知道如何分析这些协议.tcp, udp, icmp 是: ip > proto p的简写形式,其中p为上述协议的一种. > > * expr relop expr > > 如果这个关系成立,则逻辑为真,其中relop是<,>,<=,>=,=,!=之一,expr是 > 数学表达式,由常整数(标准C语法形式),普通的二进制运算符[+,-,*,/,&, > |],一个长度运算符,和指定的报文数据访问算符组成.要访问报文内的数 > 据,使用下面的语法: proto [ expr : size ] Proto是ether,fddi,ip, > arp,rarp,tcp,udp,oricmp之一,同时也指出了下标操作的协议层.expr给 > 出字节单位的偏移量,该偏移量相对于指定的协议层.Size是可选项,指出 > 感兴趣的字节数;它可以是1,2,4,缺省为1字节.由关键字len给出的长度运 > 算符指明报文的长度. 例如,`ether[0]&1!=0'捕捉所有的多目传送报文. > 表达式`ip[0]&0xf!=5'捕捉所有带可选域的IP报文.表达式 > `ip[6:2]&0x1fff=0'只捕捉未分片和片偏移为0的数据报.这种检查隐含在 > tcp和udp下标操作中.例如,tcp[0]一定是 TCP报头的第一个字节,而不是 > 其中某个IP片的第一个字节. > > 原语可以用下述方法结合使用: > > 园括弧括起来的原语和操作符(园括弧在Shell中有专用,所以必须转义). > > 取反操作 (`!' or `not'). > > 连结操作 (`&&' or `and'). > > 或操作 (`||' or `or'). > > 取反操作有最高优先级.或操作和连结操作有相同的优先级,运算时从左到右结 > 合.注意连结操作需要显式的and算符,而不是并列放置. > > 如果给出标识符,但没给关键字,那么暗指最近使用的关键字.例如, > > not host vs and ace作为not host vs and host ace的简写形式, 不应该和not > ( host vs or ace )混淆。 > > 表达式参数可以作为单个参数传给tcpdump,也可以作为复合参数,后者更方便一 > 些.一般说来,如果表达式包含Shell元字符 (metacharacter),传递单个括起来的 > 参数要容易一些.复合参数在被解析前用空格联接一起. > > > 3.3 tcpdump输出信息 > > tcpdump四种典型的输出信息: > > * 1) 数据链路层头信息 > > 使用命令:#tcpdump -e > 输出结果:16:40:49.188384 00:e0:4d:1d:1a:df (oui Unknown) > > Broadcast, ethertype IPv4 (0x0800), length 154: > 192.168.222.8.4204 > 192.168.222.255.39213: UDP, length 112 > 分析:“16:40:49”为时间戳,“188384”为ID号,“00:e0:4d:1d:1a:df > (oui Unknown) >”表示从一个不能识别MAC厂商代码信息的网络接口发送 > 该数据包,“Broadcast”表示数据包类型,“ethertype IPv4”表示网络类 > 型,“length 154”表示数据包长度,“192.168.222.8.4204 > > 192.168.222.255.39213”表示该数据包是由192.168.222.8的4204端口发 > 往192.168.222.255的 39213端口, “UDP”表示协议类型。 > > * 2) ARP包的输出信息 > > 使用命令:#tcpdump arp > 输出结果:09:04:33.791143 arp who-has 192.168.0.137 tell > 192.168.0.113 > 分析:“22:32:42”为时间戳,“802509”为ID号,arp表示数据包类型, > “who-has 192.168.0.137 tell 192.168.0.113”表示192.168.0.133请求 > 192.168.0.137的MAC地址。 > > * 3) TCP包的输出信息 > > 使用命令:#tcpdump tcp > 输出信息:09:14:16.187322 IP ubuntu.local.37588 > > dreamhost.com.www: . ack 20079 win 427> 1082641 796909605> > 分析:“ubuntu.local.37588 > dreamhost.com.www”表示从该数据包由 > ubuntu.local的37588端口发往dreamhost.com的www服务端口, “ack > 20079”为下次期望序列号,“ win 427”表示接收缓存窗口大小, > nop,timestamp 1082641 796909605>为其他选项。 > > * 4) UDP包的输出信息 > > 使用命令:#tcpdump udp > 输出信息:09:29:35.388006 IP 192.168.0.100.11000 > > 225.102.116.110.11000: UDP, length 24 > 分析:从主机192.168.0.100的1100端口发出一个udp数据包到主机 > 225.102.110的11000端口,数据包包的长度是 lenth。 > > > 4 功能扩展 > > tcpdump工具对截获的数据包并未进行彻底解码,大部分直接以十六进制形式打 > 印,可以先使用-w选项把截获的数据包存入文件,再重定向到 tcpshow等工具进 > 行解码,从而大大扩展其功能。tcpshow能根据不同协议类型对数据包以不同方 > 式解码,并以不同方式显示。 > > kongove at ubuntu:~$ sudo tcpdump -c 2 -w tcpdump.out > kongove at ubuntu:~$ file tcpdump.out > tcpdump.out: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 96) > kongove at ubuntu:~$ sudo tcpshow < tcpdump.out > --------------------------------------------------------------------------- > Packet 1 > TIME:1:01:01.25003 (0.080641) > LINK:00:A0:C9:AB:3C:DF -> FF:FF:FF:FF:FF:FF type=ARP > ARP:htype=Ethernet ptype=IP hlen=6 plen=4 op=request > sender-MAC-addr=10:10:49:4B:1C:DF sender-IP-address=192.168.0.10 > target-MAC-addr=00:00:00:00:00:00 target-IP-address=192.168.0.232 > --------------------------------------------------------------------------- > Packet 2 > TIME:1:01:01.25023 (0.810510) > LINK:00:40:5B:08:56:46 -> 11:10:C3:03:01:00 type=0026 > <*** No decode support for encapsulated protocol ***> > > > > 5 范例 > > > 5.1 显示所有进出sundown的报文: > > tcpdump host sundown > > > 5.2 显示helios和主机hot,ace之间的报文传送: > > tcpdump host helios and \( hot or ace \) > > > 5.3 显示ace和除了helios以外的所有主机的IP报文 > > tcpdump ip host ace and not helios > > > 5.4 显示本地的主机和Berkeley的主机之间的网络数据 > > tcpdump net ucb-ether > > > 5.5 显示所有通过网关snup的ftp报文(注意这个表达式被单引号括起, > 防止shell解释园括弧) > > tcpdump 'gateway snup and (port ftp or ftp-data)' > > > 5.6 显示既不是来自本地主机,也不是传往本地主机的网络数据(如果你 > 把网关通往某个其他网络,这个做法将不会把数据发往你的本地网络). > > tcpdump ip and not net localnet > > > 5.7 显示每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中 > 有一个远程主机. > > tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet' > > > 5.8 显示经过网关snup中大于576字节的IP数据报 > > tcpdump 'gateway snup and ip[2:2] > 576' > > > 5.9 显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播 > 或多目传送形式传送的 > > tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224' > > > 5.10 显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文) > > tcpdump 'icmp[0] != 8 and icmp[0] != 0' > > tcpdump的输出格式取决于协议.下面的描述给出大多数格式的简要说明和范例. > > > 5.11 链路层报头 (Link Level Headers) > > 如果给出'-e'选项就显示链路层报头.在以太网上,显示报文的源目地址,协议和 > 报文长度. > > 在FDDI 网络上,'-e'选项导致tcpdump显示出`帧控制(framecontrol)'域,源目地 > 址和报文长度.(`帧控制'域负责解释其余的报文.普通报文(比如说载有IP数据 > 报)是`异步'报文,优先级介于0到7;例如,`async4'.这些被认为载有802.2逻辑链 > 路控制(LLC)报文;如果它们不是ISO数据报或者所谓的SNAP报文,就显示出LLC报头. > > (注意:以下描述中假设你熟悉RFC-1144中说明的SLIP压缩算法.) > > 在SLIP链路上,tcpdump显示出方向指示(``I''指inbound,``O''指outbound),报 > 文类型和压缩信息.首先显示的是报文类型.有三种类型ip,utcp和ctcp.对于ip报 > 文不再显示更多的链路信息.对于TCP报文,在类型后面显示连接标识.如果报文是 > 压缩过的, 就显示出编码的报头.特殊情形以*S+n和*SA+n的形式显示,这里的n是 > 顺序号(或顺序号及其确认)发生的改变总和.如果不是特殊情形,就显示0或多少 > 个改变.改变由U(urgentpointer),W(window),A(ack),S(sequencenumber)和I > (packetID)指明,后跟一个变化量(+nor-n),或另一个值(=n).最后显示报文中的 > 数据总和,以及压缩报头的长度. > > 例如,下面一行显示了一个传出的压缩的TCP报文,有一个隐含的连接标识;确认 > (ack)的变化量是6,顺序号是49,报文ID是6;有三个字节的数据和六个字节的压缩 > 报头: > > O ctcp * A+6 S+49 I+6 3 (6) > > > 5.12 ARP/RARP 报文 > > Arp/rarp报文的输出显示请求类型及其参数.输出格式倾向于能够自我解释.这里 > 是一个简单的例子,来自主机rtsg到主机csam的 'rlogin'开始部分: > > arp who-has csam tell rtsg > > arp reply csam is-at CSAM > > 第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它 > 的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写). > > 如果 用 tcpdump -n 看上去 要 清楚一些: > > arp who-has 128.3.254.6 tell 128.3.254.68 > > arp reply 128.3.254.6 is-at 02:07:01:00:01:c4 > > 如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的: > > RTSG Broadcast 0806 64: arp who-has csam tell rtsg > > CSAM RTSG 0806 64: arp reply csam is-at CSAM > > 这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为 > 16进制数0806(类型ETHER_ARP),报文全长64 字节. > > > 5.13 TCP 报文 > > (注意:以下的描述中假设你熟悉RFC-793中说明的TCP协议,如果你不了解这个协 > 议,无论是本文还是tcpdump都对你用处不大) > > 一般说来tcp协议的输出格式是: > > src > dst: flags data-seqno ack window urgent options > > Src和dst是源目IP地址和端口.Flags是S(SYN),F(FIN),P(PUSH)或R(RST)或单独 > 的`.'(无标志),或者是它们的组合.Data-seqno说明了本报文中的数据在流序号 > 中的位置(见下例).Ack是在这条连接上信源机希望下一个接收的字节的流序号 > (sequencenumber).Window是在这条连接上信源机接收缓冲区的字节大小.Urg表 > 明报文内是`紧急(urgent)'数据. Options是tcp可选报头,用尖括号括起(例如,). > > Src, dst 和 flags肯定存在. 其他域依据报文的tcp报头内容, 只输出有必要的 > 部分. > > 下面是从主机rtsgrlogin到主机csam的开始部分. > > rtsg.1023 > csam.login: S 768512:768512(0) win 4096 > > csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 > > rtsg.1023 > csam.login: . ack 1 win 4096 > > rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096 > > csam.login > rtsg.1023: . ack 2 win 4096 > > rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096 > > csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077 > > csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1 > > csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1 > > 第一行是说从rtsg的tcp端口1023向csam的login端口发送报文.S标志表明设置了 > SYN标志.报文的流序号是768512,没有数据.(这个写成`first:last(nbytes)',意 > 思是`从流序号first到last,不包括last,有nbytes字节的用户数据'.) 此时没有 > 捎带确认(piggy-backedack),有效的接收窗口是4096字节,有一个最大段大小 > (max-segment-size)的选项,请求设置mss为1024字节. > > Csam用类似的形式应答,只是增加了一个对rtsgSYN的捎带确认.然后Rtsg确认 > csam的SYN.`.'意味着没有设置标志.这个报文不包含数据,因此也就没有数据的 > 流序号.注意这个确认流序号是一个小整数(1).当tcpdump第一次发现一个tcp会 > 话时,它显示报文携带的流序号.在随后收到的报文里,它显示当前报文和最初那 > 个报文的流序号之差.这意味着从第一个报文开始,以后的流序号可以理解成数据 > 流中的相对位移 > asrelativebytepositionsintheconversation'sdatastream(withthefirstdatabyteeachdirectionbeing`1'). > `-S'选项能够改变这个特性,直接显示原始的流序号. > > 在第六行,rtsg传给csam19个字节的数据(字节2到20).报文中设置了PUSH标志.第 > 七行csam表明它收到了rtsg的数据,字节序号是21,但不包括第21个字节.显然大 > 多数数据在socket的缓冲区内,因为csam的接收窗口收到的数据小于19个字节.同 > 时csam向rtsg发送了一个字节的数据.第八和第九行显示csam发送了两个字节的 > 紧急数据到rtsg. > > 如果捕捉区设置的过小,以至于tcpdump不能捕捉到完整的TCP报头,tcpdump会尽 > 可能的翻译已捕获的部分,然后显示`` [|tcp] '',表明无法翻译其余部分.如果 > 报头包含一个伪造的选项 > (onewithalengththat'seithertoosmallorbeyondtheendoftheheader),tcpdump > 显示 ``[badopt]''并且不再翻译其他选项部分(因为它不可能判断出从哪儿开 > 始).如果报头长度表明存在选项,但是IP数据报长度不够,不可能真的保存选项, > tcpdump就显示``[badhdrlength]''. > > > 5.14 UDP 报文 > > UDP格式就象这个rwho报文显示的: > > actinide.who > broadcast.who: udp 84 > > 就是说把一个udp数据报从主机actinide的who端口发送到broadcast,Internet广 > 播地址的who端口.报文包含84 字节的用户数据. > > 某些 UDP 服务 能够 识别出来(从 源目端口号 上), 因而 显示出 更高层的 协 > 议信息. 特别是域名服务请求(RFC-1034/1035) 和 NFS 的 RPC 调用(RFC-1050). > > > 5.15 UDP域名服务请求(NameServerRequests) > > (注意:以下的描述中假设你熟悉RFC-1035说明的域名服务协议.如果你不熟悉这 > 个协议,下面的内容就象是天书.) > > 域名服务请求的格式是 > > src > dst: id op? flags qtype qclass name (len) > > h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37) > > 主机h2opolo访问helios上的域名服务,询问和ucbvax.berkeley.edu.关联的地址 > 记录(qtype=A).查询号是 `3'.`+'表明设置了递归请求标志.查询长度是37字节, > 不包括UDP和IP头.查询操作是普通的Query操作,因此op域可以忽略.如果op设置 > 成其他什么东西,它应该显示在`3'和`+'之间.类似的,qclass是普通的C_IN类型, > 也被忽略了.其他类型的qclass应该在`A'后面显示. > > Tcpdump会检查一些不规则情况,相应的结果作为补充域放在方括号内:如果某个 > 查询包含回答,名字服务或管理机构部分,就把 ancount, nscount,或arcount显 > 示成`[na]',`[nn]'或`[nau]',这里的n代表相应的数量.如果在第二和第三字节 > 中,任何一个回答位 (AA,RA或rcode)或任何一个`必须为零'的位被置位,就显示` > [b2&3=x]',这里的x是报头第二和第三字节的16进制数. > > > 5.16 UDP名字服务回答 > > 名字服务回答的格式是 > > src > dst: id op rcode flags a/n/au type class data (len) > > helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273) > > helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97) > > 第一个例子里,helios回答了h2opolo发出的标识为3的询问,一共是3个回答记录, > 3个名字服务记录和7个管理结构记录.第一个回答纪录的类型是A(地址),数据是 > internet地址128.32.137.3.回答的全长为273字节,不包括UDP和IP报头.作为A记 > 录的class (C_IN)可以忽略op(询问)和rcode(NoError). > > 在第二个例子里,helios对标识为2的询问作出域名不存在(NXDomain)的回答,没 > 有回答记录,一个名字服务记录,而且没有管理结构. > > `*'表明设置了权威回答(authoritativeanswer).由于没有回答记录,这里就不显 > 示type,class和data. > > 其他标志字符可以显示为`-'(没有设置递归有效(RA))和`|'(设置消息截短 > (TC)).如果`问题'部分没有有效的内容,就显示` [nq]'. > > 注意名字服务的询问和回答一般说来比较大,68字节的snaplen可能无法捕捉到足 > 够的报文内容.如果你的确在研究名字服务的情况,可以使用 -s选项增大捕捉缓 > 冲区.`-s128'应该效果不错了. > > > 5.17 NFS请求和响应 > > SunNFS(网络文件系统)的请求和响应显示格式是: > > src.xid > dst.nfs: len op args > > src.nfs > dst.xid: reply stat len op results > > sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165 > > wrl.nfs > sushi.6709: reply ok 40 readlink "../var" > > sushi.201b > wrl.nfs: > > 144 lookup fh 9,74/4096.6878 "xcolors" > > wrl.nfs > sushi.201b: > > reply ok 128 lookup fh 9,74/4134.3150 > > 在第一行,主机sushi向wrl发送号码为6709的交易会话(注意源主机后面的数字是 > 交易号,不是端口).这项请求长112字节,不包括 UDP 和IP报头.在文件句柄(fh) > 21,24/10.731657119上执行readlink(读取符号连接)操作.(如果运气不错,就象 > 这种情况,文件句柄可以依次翻译成主次设备号,i节点号,和事件号 > (generationnumber).)Wrl回答`ok'和连接的内容. > > 在第三行,sushi请求wrl在目录文件9,74/4096.6878中查找`xcolors'.注意数据 > 的打印格式取决于操作类型.格式应该是可以自我说明的. > > 给出-v(verbose)选项可以显示附加信息.例如: > > sushi.1372a > wrl.nfs: > > 148 read fh 21,11/12.195 8192 bytes @ 24576 > > wrl.nfs > sushi.1372a: > > reply ok 1472 read REG 100664 ids 417/0 sz 29388 > > (-v同时使它显示IP报头的TTL,ID,和分片域,在这个例子里把它们省略了.)在第 > 一行,sushi请求wrl从文件 21,11/12.195的偏移位置24576开始,读取8192字节. > Wrl回答`ok';第二行显示的报文是应答的第一个分片,因此只有1472字节 (其余 > 数据在后续的分片中传过来,但由于这些分片里没有NFS甚至UDP报头,因此根据所 > 使用的过滤器表达式,有可能不显示).-v选项还会显示一些文件属性(它们作为文 > 件数据的附带部分传回来):文件类型(普通文件``REG''),存取模式(八进制数), > uid和gid,以及文件大小. > > 如果再给一个-v选项(-vv),还能显示更多的细节. > > 注意NFS请求的数据量非常大,除非增加snaplen,否则很多细节无法显示.试一试` > -s192'选项. > > NFS应答报文没有明确标明RPC操作.因此tcpdump保留有``近来的''请求记录,根 > 据交易号匹配应答报文.如果应答报文没有相应的请求报文,它就无法分析. > > > 5.18 KIPAppletalk(UDP上的DDP) > > AppletalkDDP报文封装在UDP数据报中,解包后按DDP报文转储(也就是说,忽略所 > 有的UDP报头信息).文件 /etc/atalk.names用来把appletalk网络和节点号翻译 > 成名字.这个文件的行格式是 > > number name > > 1.254 ether > > 16.1 icsd-net > > 1.254.110 ace > > 前两行给出了appletalk的网络名称.第三行给出某个主机的名字(主机和网络依 > 据第三组数字区分-网络号一定是两组数字,主机号一定是三组数字.)号码和名字 > 用空白符(空格或tab)隔开./etc/atalk.names文件可以包含空行或注释行(以`#' > 开始的行). > > Appletalk地址按这个格式显示 > > net.host.port > > 144.1.209.2 > icsd-net.112.220 > > office.2 > icsd-net.112.220 > > jssmag.149.235 > icsd-net.2 > > (如果不存在/etc/atalk.names,或者里面缺少有效项目,就以数字形式显示地 > 址.)第一个例子里,网络144.1的209节点的 NBP(DDP端口2)向网络icsd的112节点 > 的220端口发送数据.第二行和上面一样,只是知道了源节点的全称(`office').第 > 三行是从网络jssmag的149节点的235端口向icsd-net的NBP端口广播(注意广播地 > 址(255)隐含在无主机号的网络名字中-所以在 /etc/atalk.names中区分节点名 > 和网络名是个好主意). > > Tcpdump可以翻译NBP(名字联结协议)和ATP(Appletalk交互协议)的报文内容.其 > 他协议只转储协议名称(或号码,如果还没给这个协议注册名称)和报文大小. > > NBP报文的输出格式就象下面的例子: > > icsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*" > > jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" > 250 > > techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186 > > 第一行是网络icsd的112主机在网络jssmag上的广播,对名字laserwriter做名字 > 查询请求.名字查询请求的nbp标识号是 190.第二行显示的是对这个请求的回答 > (注意它们有同样的标识号),主机jssmag.209表示在它的250端口注册了一个 > laserwriter的资源,名字是"RM1140".第三行是这个请求的其他回答,主机 > techpit的186端口有laserwriter注册的"techpit". > > ATP报文格式如下例所示: > > jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001 > > helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000 > > jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001 > > helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 > > jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001 > > jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002 > > Jssmag.209向主机helios发起12266号交易,请求8个报文(`<0-7>').行尾的十六 > 进制数是请求中 `userdata'域的值. > > Helios用8个512字节的报文应答.跟在交易号后面的`:digit'给筹 > > 实例: > > #tcpdump -i eth0 -X src host 10.1.2.1 > > > 6 总结 > > > 7 参考资料 > > * man手册 <http://www.tcpdump.org/tcpdump_man.html> > * tcpdump 官方网站帮助文档 <http://www.tcpdump.org/> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://www.zeuux.org/pipermail/zeuux-www/attachments/20080512/1d7d20d8/attachment.html>
2008年05月13日 星期二 01:39
Well done, Xia Wu, please help Jianjun update them to the CVS. Jiannun, your document is collected in the ZEUUX book already, it will be published. You are doing a great work. Jianjun Kong 写道: > 更新 learning-tcpdump.html > 这个更新是对 http://www.zeuux.org/science/learning-tcpdump.cn.html 格式化了一下,并添加了最近的一些更新。 > 文件见附件。 > > > ------------------------------------------------------------------------ > > > 学习tcpdump > > > 作者:孔建军 <kongjianjun at gmail.com> > > > 1 tcpdump介绍 > > tcpdump 是一款开源的网络数据截取分析工具,具有强大的功能和灵活的截取策 > 略,用在网络的分析、维护、统计、检测等方面,例如定位网络瓶颈、统计网络 > 流量使用情况等。它支持针对网络层、协议、主机、网络或端口的过滤,正则表 > 达式的灵活应用能帮你准确获取有用信息。 > tcpdump 具备开源软件的优势,接口公开,具有较强的可扩展性。运行此命令必 > 须有root权限,它通过将网络接口设置为混杂模式,绕过标准TCP/IP堆栈,进行 > 工作。出于安全等问题考虑,FreeBSD里通过内核取消对伪设备bpfilter的支 > 持,来屏蔽tcpdump之类的网络分析工具,也可使用网桥、交换机等将不信任网 > 络隔开,但不能解决内网通信安全问题。在linux下可采用软件包或编译源代码 > 的方式安装。 > tcpdump官方网站:http://www.tcpdump.org/ > > > 2 运行效果 > > kongove at ubuntu:~$ sudo tcpdump -i eth0 host ubuntu.local > tcpdump: verbose output suppressed, use -v or -vv for full protocol decode > listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes > 09:39:10.448284 IP ubuntu.local.2425 > 255.255.255.255.2425: UDP, length 35 > 09:39:15.565249 IP ubuntu.local.2425 > 255.255.255.255.2425: UDP, length 29 > > > > 3 基本使用 > > tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] > [ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] > [ -T type ] [ -w file ] [ -W filecount ][ -E spi at ipaddr algo:secret,... ] > [ -y datalinktype ] [ -Z user ] [ expression ] > > > 通过对 tcpdump 选项、参数、表达式的组合应用,从大流量的网络数据当中, > 过滤出真正有用的信息,从而缩小分析范围。 > > > 3.1 tcpdump选项 > > 选项 含义 > -A 以ASCII格式打印出所有分组,并将链路层的头最小化。 > -d 将匹配信息包的代码以人们能够理解的汇编格式给出; > -D 打印出系统中所有可以用tcpdump截包的网络接口; > -ddd 将匹配信息包的代码以十进制的形式输出; > -e 在输出行打印出数据链路层的头部信息; > -f 将外部的Internet地址以数字的形式打印出来; > -l 使标准输出变为缓冲行形式; > -L 列出网络接口的已知数据链路; > -n 不把网络地址转换成主机名; > -N 不输出主机名中的域名部分,例如“kongove.ubuntu.cn”只输出 > “kongove”; > -O 不运行分组分组匹配(packet-matching)代码优化程序; > -p 不将网络接口设置成混杂模式; > -q 快速输出,只输出较少的协议信息; > -S 将tcp的序列号以绝对值形式输出,而不是相对值; > -t 在输出的每一行不打印时间戳; > -u 输出未解码的NFS句柄; > -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; > -vv 输出详细的报文信息; > -c count 指定监听数据包数量,当收到指定的包的数目后,tcpdump就会 > 停止; > -C file_size 限定数据包写入文件大小; > -F file 从指定的文件中读取表达式,忽略其它的表达式; > -i interface 指定监听网络接口; > -m module 打开指定的SMI MIB组件; > -M secret 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的 > 验证码用于验证TCP-MD5选选项摘要(详见 RFC 2385); > -r file 从指定的文件中读取包(这些包一般通过-w选项产生); > -s snaplen 从每个分组中读取最开始的snaplen个字节,而不是默认的68 > 个字节; > -T type 将截取的数据包直接解释为指定类型的报文,常见类型有rpc(远 > 程过程调用)和snmp(简单网络管理协议),还包括 aodv、cnfp、rpc、 > rtp、rtcp、snmp、tftp、vat、wb等; > -w file 指定将监听到的数据包写入文件,不分析和打印数据包; > -W filecount 限定能写入文件的数据包数量; > -E spi at ipaddr algo:secret,... 用spi at ipaddr algo:secret解密那些以 > addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组; > expression 综合表达式。 > > > 3.2 tcpdump表达式 > > tcpdump利用正则表达式作为过滤报文的条件,如果数据包满足表达式的条件, > 则会被捕获。如果没有给出任何条件,则网络上所有的数据包将会被截获。表达 > 式中常用关键字如下: > > * 1) 指定参数类型的关键字,主要包括host,net,port等,如果没有指定 > 类型,缺省的类型是host; > 例如:#tcpdump host 222.24.20.86 截获ip为222.24.20.86的主机收发 > 的所有数据包 > * 2) 指定数据报文传输方向的关键字,主要包括src , dst ,dst or src, > dst and src,缺省为src or dst; > 例如:#tcpdump src net 222.24.20.1 截取源网络地址为 222.24.20.1 > 的所有数据包 > * 3) 指定协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类 > 型,默认监听所有协议的数据包; > 例如:#tucpdump arp 截获所有arp协议的数据包 > * 4) 其他重要的关键字还有,gateway,broadcast,less,greater,三种 > 逻辑运算(取非运算是 'not ','! '; 与运算是 'and ','&& ';或运算 > 是'or ','|| ')等。这些关键字的巧妙组合,能灵活构造过滤条件,从 > 而满足用户需要。 > 例如:#tcpdump host ubuntu and src port \(80 or 8080\) 截取主机 > ubuntu上源端口为80或8080的所有数据包。 > > expression一个或多个原语 (primitive)组成。原语通常由一个标识(id,名称或 > 数字),和标识前面的一个或多个修饰子(qualifier)组成。 修饰子有三种不同的 > 类型: > > * type > > 类型修饰子指出标识名称或标识数字代表什么类型的东西. 可以使用的类 > 型有host, net 和 port。例如, `host foo', `net 128.3', `port 20'. > 如果不指定类型修饰子, 就使用缺省的 host。 > > * dir > > 方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识)。 可 > 以使用的方向有 src, dst, src or dst 和 src and dst。例如, `src > foo', `dst net 128.3', `src or dst port ftp-data'。如果不指定方 > 向修饰子, 就使用缺省的src or dst。 对于`null'链路层 (就是说象 > slip之类的点到点协议), 用inbound和outbound修饰子指定所需的传输方 > 向。 > > * proto > > 协议修饰子要求匹配指定的协议。可以使用的协议有: ether, fddi, ip, > arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp。例如, > `ether src foo', `arp net 128.3', `tcp port 21'。 如果不指定协议 > 修饰子, 就使用所有符合类型的协议. 例如, `src foo' 指 `(ip 或 arp > 或 rarp) src foo' (注意后者不符合语法), `net bar'指`(ip 或 arp > 或 rarp) net bar', `port 53'指 `(tcp 或 udp) port 53'。 (`fddi' > 实际上是 `ether'的别名; 分析器把它们视为 ``用在指定网络接口上的 > 数据链路层.'' FDDI报头包含类似于以太协议的源目地址, 而且通常包含 > 类似于以太协议的报文类型, 因此你可以过滤FDDI域, 就象分析以太协议 > 一样. FDDI报头也包含其他域, 但是你不能在过滤器表达式里显式描述。) > > 作为上述的补充, 有一些特殊的`原语'关键字, 它们不同于上面的模式: > gateway, broadcast, less, greater和数学表达式. 这些在后面有叙述。 更复 > 杂的过滤器表达式 可以通过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'。 > > 允许的 原语 有: > > * dst host host > > 如果报文中IP的目的地址域是host, 则逻辑为真. host既可以是地址, 也 > 可以是主机名. > > * src host host > > 如果报文中IP的源地址域是host, 则逻辑为真. > > * host host > > 如果报文中IP的源地址域或者目的地址域是host, 则逻辑为真. 上面所有 > 的host表达式都可以加上ip, arp, 或rarp关键字做前缀, 就象:ip host > host 它等价于: ether proto \ip and host host。 > > 如果host是拥有多个IP地址的主机名, 它的每个地址都会被查验。 > > * ether dst ehost > > 如果报文的以太目的地址是ehost, 则逻辑为真。Ehost既可以是名字 > (/etc/ethers里有),也可以是数字(有关数字格式另见 ethers(3N) )。 > > * ether src ehost > > 如果报文的以太源地址是ehost, 则逻辑为真。 > > * ether host ehost > > 如果报文的以太源地址或以太目的地址是ehost, 则逻辑为真。 > > * gateway host > > 如果报文把host当做网关, 则逻辑为真。也就是说,报文的以太源或目的 > 地址是host, 但是IP的源目地址都不是host。 host必须是个主机名, 而 > 且必须 存在/etc/hosts和/etc/ethers中. (一个等价的表达式是ether > host ehost and not host host,对于 host/ehost, 它既可以是名字, > 也可以是数字。) > > * dst net net > > 如果报文的IP目的地址属于网络号net,则逻辑为真.net既可以是名字(存 > 在/etc/networks中),也可以是网络号.(详见 networks(4))。 > > * src net net > > 如果报文的IP源地址属于网络号net,则逻辑为真。 > > * net net > > 如果报文的IP源地址或目的地址属于网络号net,则逻辑为真. > > * net net mask mask > > 如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用 > src或dst修饰. > > * net net/len > > 如果IP地址匹配指定网络掩码的net,则逻辑为真,掩码的有效位宽为len. > 本原语可以用src或dst修饰。 > > * dst port port > > 如果报文是ip/tcp或ip/udp,并且目的端口是port,则逻辑为真.port是一 > 个数字,也可以是/etc/services中说明过的名字 (参看tcp(4P)和udp > (4P)).如果使用名字,则检查端口号和协议.如果使用数字,或者有二义的 > 名字,则只检查端口号(例如, dstport513将显示tcp/login的数据和 > udp/who的数据,而portdomain将显示tcp/domain和udp/domain 的数据)。 > > * src 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数据报(参见ip(4P)),其内容的协议类型是protocol,则逻辑 > 为真.Protocol可以是数字,也可以是下列名称中的一个: > icmp,igrp,udp,nd,或tcp.注意这些标识符tcp,udp,和icmp也同样是关键 > 字,所以必须用反斜杠(\)转义,在C-shell 中应该是\\. > > * ether broadcast > > 如果报文是以太广播报文,则逻辑为真.关键字ether是可选的. > > * ip broadcast > > 如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且 > 检查本地的子网掩码. > > * ether multicast > > 如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可 > 选的.这实际上是`ether[0]&1!=0'的简写. > > * ip multicast > > 如果报文是IP多目传送报文,则逻辑为真. > > * ether proto protocol > > 如果报文协议属于以太类型的protocol,则逻辑为真.Protocol可以是数 > 字,也可以是名字,如ip,arp,或rarp.注意这些标识符也是关键字,所以必 > 须用反斜杠(\)转义.[如果是FDDI(例如,`fddiprotocolarp'),协议标识来 > 自802.2逻辑链路控制(LLC)报头,它通常位于FDDI报头的顶层.当根据协议 > 标识过滤报文时,Tcpdump假设所有的FDDI报文含有LLC报头,而且LLC报头 > 用的是SNAP格式.] > > * decnet src host > > 如果DECNET的源地址是host,则逻辑为真,该主机地址的形式可能是 > ``10.123'',或者是DECNET主机名.[只有配置成运行 DECNET的Ultrix系统 > 支持DECNET主机名.] > > * decnet dst host > > 如果DECNET的目的地址是host,则逻辑为真. > > * decnet host host > > 如果DECNET的源地址或目的地址是host,则逻辑为真.ip, arp, rarp, > decnet是: ether proto p的简写形式,其中p为上述协议的一种.lat, > moprc, mopdl 是: ether proto p的简写形式,其中p为上述协议的一种. > 注意tcpdump目前不知道如何分析这些协议.tcp, udp, icmp 是: ip > proto p的简写形式,其中p为上述协议的一种. > > * expr relop expr > > 如果这个关系成立,则逻辑为真,其中relop是<,>,<=,>=,=,!=之一,expr是 > 数学表达式,由常整数(标准C语法形式),普通的二进制运算符[+,-,*,/,&, > |],一个长度运算符,和指定的报文数据访问算符组成.要访问报文内的数 > 据,使用下面的语法: proto [ expr : size ] Proto是ether,fddi,ip, > arp,rarp,tcp,udp,oricmp之一,同时也指出了下标操作的协议层.expr给 > 出字节单位的偏移量,该偏移量相对于指定的协议层.Size是可选项,指出 > 感兴趣的字节数;它可以是1,2,4,缺省为1字节.由关键字len给出的长度运 > 算符指明报文的长度. 例如,`ether[0]&1!=0'捕捉所有的多目传送报文. > 表达式`ip[0]&0xf!=5'捕捉所有带可选域的IP报文.表达式 > `ip[6:2]&0x1fff=0'只捕捉未分片和片偏移为0的数据报.这种检查隐含在 > tcp和udp下标操作中.例如,tcp[0]一定是 TCP报头的第一个字节,而不是 > 其中某个IP片的第一个字节. > > 原语可以用下述方法结合使用: > > 园括弧括起来的原语和操作符(园括弧在Shell中有专用,所以必须转义). > > 取反操作 (`!' or `not'). > > 连结操作 (`&&' or `and'). > > 或操作 (`||' or `or'). > > 取反操作有最高优先级.或操作和连结操作有相同的优先级,运算时从左到右结 > 合.注意连结操作需要显式的and算符,而不是并列放置. > > 如果给出标识符,但没给关键字,那么暗指最近使用的关键字.例如, > > not host vs and ace作为not host vs and host ace的简写形式, 不应该和not > ( host vs or ace )混淆。 > > 表达式参数可以作为单个参数传给tcpdump,也可以作为复合参数,后者更方便一 > 些.一般说来,如果表达式包含Shell元字符 (metacharacter),传递单个括起来的 > 参数要容易一些.复合参数在被解析前用空格联接一起. > > > 3.3 tcpdump输出信息 > > tcpdump四种典型的输出信息: > > * 1) 数据链路层头信息 > > 使用命令:#tcpdump -e > 输出结果:16:40:49.188384 00:e0:4d:1d:1a:df (oui Unknown) > > Broadcast, ethertype IPv4 (0x0800), length 154: > 192.168.222.8.4204 > 192.168.222.255.39213: UDP, length 112 > 分析:“16:40:49”为时间戳,“188384”为ID号,“00:e0:4d:1d:1a:df > (oui Unknown) >”表示从一个不能识别MAC厂商代码信息的网络接口发送 > 该数据包,“Broadcast”表示数据包类型,“ethertype IPv4”表示网络类 > 型,“length 154”表示数据包长度,“192.168.222.8.4204 > > 192.168.222.255.39213”表示该数据包是由192.168.222.8的4204端口发 > 往192.168.222.255的 39213端口, “UDP”表示协议类型。 > > * 2) ARP包的输出信息 > > 使用命令:#tcpdump arp > 输出结果:09:04:33.791143 arp who-has 192.168.0.137 tell > 192.168.0.113 > 分析:“22:32:42”为时间戳,“802509”为ID号,arp表示数据包类型, > “who-has 192.168.0.137 tell 192.168.0.113”表示192.168.0.133请求 > 192.168.0.137的MAC地址。 > > * 3) TCP包的输出信息 > > 使用命令:#tcpdump tcp > 输出信息:09:14:16.187322 IP ubuntu.local.37588 > > dreamhost.com.www: . ack 20079 win 427> 1082641 796909605> > 分析:“ubuntu.local.37588 > dreamhost.com.www”表示从该数据包由 > ubuntu.local的37588端口发往dreamhost.com的www服务端口, “ack > 20079”为下次期望序列号,“ win 427”表示接收缓存窗口大小, > nop,timestamp 1082641 796909605>为其他选项。 > > * 4) UDP包的输出信息 > > 使用命令:#tcpdump udp > 输出信息:09:29:35.388006 IP 192.168.0.100.11000 > > 225.102.116.110.11000: UDP, length 24 > 分析:从主机192.168.0.100的1100端口发出一个udp数据包到主机 > 225.102.110的11000端口,数据包包的长度是 lenth。 > > > 4 功能扩展 > > tcpdump工具对截获的数据包并未进行彻底解码,大部分直接以十六进制形式打 > 印,可以先使用-w选项把截获的数据包存入文件,再重定向到 tcpshow等工具进 > 行解码,从而大大扩展其功能。tcpshow能根据不同协议类型对数据包以不同方 > 式解码,并以不同方式显示。 > > kongove at ubuntu:~$ sudo tcpdump -c 2 -w tcpdump.out > kongove at ubuntu:~$ file tcpdump.out > tcpdump.out: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 96) > kongove at ubuntu:~$ sudo tcpshow < tcpdump.out > --------------------------------------------------------------------------- > Packet 1 > TIME:1:01:01.25003 (0.080641) > LINK:00:A0:C9:AB:3C:DF -> FF:FF:FF:FF:FF:FF type=ARP > ARP:htype=Ethernet ptype=IP hlen=6 plen=4 op=request > sender-MAC-addr=10:10:49:4B:1C:DF sender-IP-address=192.168.0.10 > target-MAC-addr=00:00:00:00:00:00 target-IP-address=192.168.0.232 > --------------------------------------------------------------------------- > Packet 2 > TIME:1:01:01.25023 (0.810510) > LINK:00:40:5B:08:56:46 -> 11:10:C3:03:01:00 type=0026 > <*** No decode support for encapsulated protocol ***> > > > > 5 范例 > > > 5.1 显示所有进出sundown的报文: > > tcpdump host sundown > > > 5.2 显示helios和主机hot,ace之间的报文传送: > > tcpdump host helios and \( hot or ace \) > > > 5.3 显示ace和除了helios以外的所有主机的IP报文 > > tcpdump ip host ace and not helios > > > 5.4 显示本地的主机和Berkeley的主机之间的网络数据 > > tcpdump net ucb-ether > > > 5.5 显示所有通过网关snup的ftp报文(注意这个表达式被单引号括起, > 防止shell解释园括弧) > > tcpdump 'gateway snup and (port ftp or ftp-data)' > > > 5.6 显示既不是来自本地主机,也不是传往本地主机的网络数据(如果你 > 把网关通往某个其他网络,这个做法将不会把数据发往你的本地网络). > > tcpdump ip and not net localnet > > > 5.7 显示每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中 > 有一个远程主机. > > tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet' > > > 5.8 显示经过网关snup中大于576字节的IP数据报 > > tcpdump 'gateway snup and ip[2:2] > 576' > > > 5.9 显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播 > 或多目传送形式传送的 > > tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224' > > > 5.10 显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文) > > tcpdump 'icmp[0] != 8 and icmp[0] != 0' > > tcpdump的输出格式取决于协议.下面的描述给出大多数格式的简要说明和范例. > > > 5.11 链路层报头 (Link Level Headers) > > 如果给出'-e'选项就显示链路层报头.在以太网上,显示报文的源目地址,协议和 > 报文长度. > > 在FDDI 网络上,'-e'选项导致tcpdump显示出`帧控制(framecontrol)'域,源目地 > 址和报文长度.(`帧控制'域负责解释其余的报文.普通报文(比如说载有IP数据 > 报)是`异步'报文,优先级介于0到7;例如,`async4'.这些被认为载有802.2逻辑链 > 路控制(LLC)报文;如果它们不是ISO数据报或者所谓的SNAP报文,就显示出LLC报头. > > (注意:以下描述中假设你熟悉RFC-1144中说明的SLIP压缩算法.) > > 在SLIP链路上,tcpdump显示出方向指示(``I''指inbound,``O''指outbound),报 > 文类型和压缩信息.首先显示的是报文类型.有三种类型ip,utcp和ctcp.对于ip报 > 文不再显示更多的链路信息.对于TCP报文,在类型后面显示连接标识.如果报文是 > 压缩过的, 就显示出编码的报头.特殊情形以*S+n和*SA+n的形式显示,这里的n是 > 顺序号(或顺序号及其确认)发生的改变总和.如果不是特殊情形,就显示0或多少 > 个改变.改变由U(urgentpointer),W(window),A(ack),S(sequencenumber)和I > (packetID)指明,后跟一个变化量(+nor-n),或另一个值(=n).最后显示报文中的 > 数据总和,以及压缩报头的长度. > > 例如,下面一行显示了一个传出的压缩的TCP报文,有一个隐含的连接标识;确认 > (ack)的变化量是6,顺序号是49,报文ID是6;有三个字节的数据和六个字节的压缩 > 报头: > > O ctcp * A+6 S+49 I+6 3 (6) > > > 5.12 ARP/RARP 报文 > > Arp/rarp报文的输出显示请求类型及其参数.输出格式倾向于能够自我解释.这里 > 是一个简单的例子,来自主机rtsg到主机csam的 'rlogin'开始部分: > > arp who-has csam tell rtsg > > arp reply csam is-at CSAM > > 第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它 > 的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写). > > 如果 用 tcpdump -n 看上去 要 清楚一些: > > arp who-has 128.3.254.6 tell 128.3.254.68 > > arp reply 128.3.254.6 is-at 02:07:01:00:01:c4 > > 如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的: > > RTSG Broadcast 0806 64: arp who-has csam tell rtsg > > CSAM RTSG 0806 64: arp reply csam is-at CSAM > > 这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为 > 16进制数0806(类型ETHER_ARP),报文全长64 字节. > > > 5.13 TCP 报文 > > (注意:以下的描述中假设你熟悉RFC-793中说明的TCP协议,如果你不了解这个协 > 议,无论是本文还是tcpdump都对你用处不大) > > 一般说来tcp协议的输出格式是: > > src > dst: flags data-seqno ack window urgent options > > Src和dst是源目IP地址和端口.Flags是S(SYN),F(FIN),P(PUSH)或R(RST)或单独 > 的`.'(无标志),或者是它们的组合.Data-seqno说明了本报文中的数据在流序号 > 中的位置(见下例).Ack是在这条连接上信源机希望下一个接收的字节的流序号 > (sequencenumber).Window是在这条连接上信源机接收缓冲区的字节大小.Urg表 > 明报文内是`紧急(urgent)'数据. Options是tcp可选报头,用尖括号括起(例如,). > > Src, dst 和 flags肯定存在. 其他域依据报文的tcp报头内容, 只输出有必要的 > 部分. > > 下面是从主机rtsgrlogin到主机csam的开始部分. > > rtsg.1023 > csam.login: S 768512:768512(0) win 4096 > > csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 > > rtsg.1023 > csam.login: . ack 1 win 4096 > > rtsg.1023 > csam.login: P 1:2(1) ack 1 win 4096 > > csam.login > rtsg.1023: . ack 2 win 4096 > > rtsg.1023 > csam.login: P 2:21(19) ack 1 win 4096 > > csam.login > rtsg.1023: P 1:2(1) ack 21 win 4077 > > csam.login > rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1 > > csam.login > rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1 > > 第一行是说从rtsg的tcp端口1023向csam的login端口发送报文.S标志表明设置了 > SYN标志.报文的流序号是768512,没有数据.(这个写成`first:last(nbytes)',意 > 思是`从流序号first到last,不包括last,有nbytes字节的用户数据'.) 此时没有 > 捎带确认(piggy-backedack),有效的接收窗口是4096字节,有一个最大段大小 > (max-segment-size)的选项,请求设置mss为1024字节. > > Csam用类似的形式应答,只是增加了一个对rtsgSYN的捎带确认.然后Rtsg确认 > csam的SYN.`.'意味着没有设置标志.这个报文不包含数据,因此也就没有数据的 > 流序号.注意这个确认流序号是一个小整数(1).当tcpdump第一次发现一个tcp会 > 话时,它显示报文携带的流序号.在随后收到的报文里,它显示当前报文和最初那 > 个报文的流序号之差.这意味着从第一个报文开始,以后的流序号可以理解成数据 > 流中的相对位移 > asrelativebytepositionsintheconversation'sdatastream(withthefirstdatabyteeachdirectionbeing`1'). > `-S'选项能够改变这个特性,直接显示原始的流序号. > > 在第六行,rtsg传给csam19个字节的数据(字节2到20).报文中设置了PUSH标志.第 > 七行csam表明它收到了rtsg的数据,字节序号是21,但不包括第21个字节.显然大 > 多数数据在socket的缓冲区内,因为csam的接收窗口收到的数据小于19个字节.同 > 时csam向rtsg发送了一个字节的数据.第八和第九行显示csam发送了两个字节的 > 紧急数据到rtsg. > > 如果捕捉区设置的过小,以至于tcpdump不能捕捉到完整的TCP报头,tcpdump会尽 > 可能的翻译已捕获的部分,然后显示`` [|tcp] '',表明无法翻译其余部分.如果 > 报头包含一个伪造的选项 > (onewithalengththat'seithertoosmallorbeyondtheendoftheheader),tcpdump > 显示 ``[badopt]''并且不再翻译其他选项部分(因为它不可能判断出从哪儿开 > 始).如果报头长度表明存在选项,但是IP数据报长度不够,不可能真的保存选项, > tcpdump就显示``[badhdrlength]''. > > > 5.14 UDP 报文 > > UDP格式就象这个rwho报文显示的: > > actinide.who > broadcast.who: udp 84 > > 就是说把一个udp数据报从主机actinide的who端口发送到broadcast,Internet广 > 播地址的who端口.报文包含84 字节的用户数据. > > 某些 UDP 服务 能够 识别出来(从 源目端口号 上), 因而 显示出 更高层的 协 > 议信息. 特别是域名服务请求(RFC-1034/1035) 和 NFS 的 RPC 调用(RFC-1050). > > > 5.15 UDP域名服务请求(NameServerRequests) > > (注意:以下的描述中假设你熟悉RFC-1035说明的域名服务协议.如果你不熟悉这 > 个协议,下面的内容就象是天书.) > > 域名服务请求的格式是 > > src > dst: id op? flags qtype qclass name (len) > > h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37) > > 主机h2opolo访问helios上的域名服务,询问和ucbvax.berkeley.edu.关联的地址 > 记录(qtype=A).查询号是 `3'.`+'表明设置了递归请求标志.查询长度是37字节, > 不包括UDP和IP头.查询操作是普通的Query操作,因此op域可以忽略.如果op设置 > 成其他什么东西,它应该显示在`3'和`+'之间.类似的,qclass是普通的C_IN类型, > 也被忽略了.其他类型的qclass应该在`A'后面显示. > > Tcpdump会检查一些不规则情况,相应的结果作为补充域放在方括号内:如果某个 > 查询包含回答,名字服务或管理机构部分,就把 ancount, nscount,或arcount显 > 示成`[na]',`[nn]'或`[nau]',这里的n代表相应的数量.如果在第二和第三字节 > 中,任何一个回答位 (AA,RA或rcode)或任何一个`必须为零'的位被置位,就显示` > [b2&3=x]',这里的x是报头第二和第三字节的16进制数. > > > 5.16 UDP名字服务回答 > > 名字服务回答的格式是 > > src > dst: id op rcode flags a/n/au type class data (len) > > helios.domain > h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273) > > helios.domain > h2opolo.1537: 2 NXDomain* 0/1/0 (97) > > 第一个例子里,helios回答了h2opolo发出的标识为3的询问,一共是3个回答记录, > 3个名字服务记录和7个管理结构记录.第一个回答纪录的类型是A(地址),数据是 > internet地址128.32.137.3.回答的全长为273字节,不包括UDP和IP报头.作为A记 > 录的class (C_IN)可以忽略op(询问)和rcode(NoError). > > 在第二个例子里,helios对标识为2的询问作出域名不存在(NXDomain)的回答,没 > 有回答记录,一个名字服务记录,而且没有管理结构. > > `*'表明设置了权威回答(authoritativeanswer).由于没有回答记录,这里就不显 > 示type,class和data. > > 其他标志字符可以显示为`-'(没有设置递归有效(RA))和`|'(设置消息截短 > (TC)).如果`问题'部分没有有效的内容,就显示` [nq]'. > > 注意名字服务的询问和回答一般说来比较大,68字节的snaplen可能无法捕捉到足 > 够的报文内容.如果你的确在研究名字服务的情况,可以使用 -s选项增大捕捉缓 > 冲区.`-s128'应该效果不错了. > > > 5.17 NFS请求和响应 > > SunNFS(网络文件系统)的请求和响应显示格式是: > > src.xid > dst.nfs: len op args > > src.nfs > dst.xid: reply stat len op results > > sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165 > > wrl.nfs > sushi.6709: reply ok 40 readlink "../var" > > sushi.201b > wrl.nfs: > > 144 lookup fh 9,74/4096.6878 "xcolors" > > wrl.nfs > sushi.201b: > > reply ok 128 lookup fh 9,74/4134.3150 > > 在第一行,主机sushi向wrl发送号码为6709的交易会话(注意源主机后面的数字是 > 交易号,不是端口).这项请求长112字节,不包括 UDP 和IP报头.在文件句柄(fh) > 21,24/10.731657119上执行readlink(读取符号连接)操作.(如果运气不错,就象 > 这种情况,文件句柄可以依次翻译成主次设备号,i节点号,和事件号 > (generationnumber).)Wrl回答`ok'和连接的内容. > > 在第三行,sushi请求wrl在目录文件9,74/4096.6878中查找`xcolors'.注意数据 > 的打印格式取决于操作类型.格式应该是可以自我说明的. > > 给出-v(verbose)选项可以显示附加信息.例如: > > sushi.1372a > wrl.nfs: > > 148 read fh 21,11/12.195 8192 bytes @ 24576 > > wrl.nfs > sushi.1372a: > > reply ok 1472 read REG 100664 ids 417/0 sz 29388 > > (-v同时使它显示IP报头的TTL,ID,和分片域,在这个例子里把它们省略了.)在第 > 一行,sushi请求wrl从文件 21,11/12.195的偏移位置24576开始,读取8192字节. > Wrl回答`ok';第二行显示的报文是应答的第一个分片,因此只有1472字节 (其余 > 数据在后续的分片中传过来,但由于这些分片里没有NFS甚至UDP报头,因此根据所 > 使用的过滤器表达式,有可能不显示).-v选项还会显示一些文件属性(它们作为文 > 件数据的附带部分传回来):文件类型(普通文件``REG''),存取模式(八进制数), > uid和gid,以及文件大小. > > 如果再给一个-v选项(-vv),还能显示更多的细节. > > 注意NFS请求的数据量非常大,除非增加snaplen,否则很多细节无法显示.试一试` > -s192'选项. > > NFS应答报文没有明确标明RPC操作.因此tcpdump保留有``近来的''请求记录,根 > 据交易号匹配应答报文.如果应答报文没有相应的请求报文,它就无法分析. > > > 5.18 KIPAppletalk(UDP上的DDP) > > AppletalkDDP报文封装在UDP数据报中,解包后按DDP报文转储(也就是说,忽略所 > 有的UDP报头信息).文件 /etc/atalk.names用来把appletalk网络和节点号翻译 > 成名字.这个文件的行格式是 > > number name > > 1.254 ether > > 16.1 icsd-net > > 1.254.110 ace > > 前两行给出了appletalk的网络名称.第三行给出某个主机的名字(主机和网络依 > 据第三组数字区分-网络号一定是两组数字,主机号一定是三组数字.)号码和名字 > 用空白符(空格或tab)隔开./etc/atalk.names文件可以包含空行或注释行(以`#' > 开始的行). > > Appletalk地址按这个格式显示 > > net.host.port > > 144.1.209.2 > icsd-net.112.220 > > office.2 > icsd-net.112.220 > > jssmag.149.235 > icsd-net.2 > > (如果不存在/etc/atalk.names,或者里面缺少有效项目,就以数字形式显示地 > 址.)第一个例子里,网络144.1的209节点的 NBP(DDP端口2)向网络icsd的112节点 > 的220端口发送数据.第二行和上面一样,只是知道了源节点的全称(`office').第 > 三行是从网络jssmag的149节点的235端口向icsd-net的NBP端口广播(注意广播地 > 址(255)隐含在无主机号的网络名字中-所以在 /etc/atalk.names中区分节点名 > 和网络名是个好主意). > > Tcpdump可以翻译NBP(名字联结协议)和ATP(Appletalk交互协议)的报文内容.其 > 他协议只转储协议名称(或号码,如果还没给这个协议注册名称)和报文大小. > > NBP报文的输出格式就象下面的例子: > > icsd-net.112.220 > jssmag.2: nbp-lkup 190: "=:LaserWriter@*" > > jssmag.209.2 > icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" > 250 > > techpit.2 > icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186 > > 第一行是网络icsd的112主机在网络jssmag上的广播,对名字laserwriter做名字 > 查询请求.名字查询请求的nbp标识号是 190.第二行显示的是对这个请求的回答 > (注意它们有同样的标识号),主机jssmag.209表示在它的250端口注册了一个 > laserwriter的资源,名字是"RM1140".第三行是这个请求的其他回答,主机 > techpit的186端口有laserwriter注册的"techpit". > > ATP报文格式如下例所示: > > jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001 > > helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000 > > jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001 > > helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 > > helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 > > jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001 > > jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002 > > Jssmag.209向主机helios发起12266号交易,请求8个报文(`<0-7>').行尾的十六 > 进制数是请求中 `userdata'域的值. > > Helios用8个512字节的报文应答.跟在交易号后面的`:digit'给筹 > > 实例: > > #tcpdump -i eth0 -X src host 10.1.2.1 > > > 6 总结 > > > 7 参考资料 > > * man手册 <http://www.tcpdump.org/tcpdump_man.html> > * tcpdump 官方网站帮助文档 <http://www.tcpdump.org/> > > -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://www.zeuux.org/pipermail/zeuux-www/attachments/20080512/8efb9868/attachment.html>
Zeuux © 2024
京ICP备05028076号