TCPDUMP中文手册最详细的手册.doc
tcpdump的使用tcpdump采用命令行方式,它的命令格式为:tcpdump -adeflnNOpqStvx -c 数量 -F 文件名 -i 网络接口 -r 文件名 -s snaplen -T 类型 -w 文件名 表达式 描述(DESCRIPTION)Tcpdump打印出在某个网络界面上,匹配布尔表达式expression的报头.对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限.对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限.对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.对于BSD:你必须有/dev/bpf*的读访问权限.1. tcpdump的选项介绍参数介绍-a将网络地址和广播地址转变成名字-d将匹配信息包的代码以人们能够理解的汇编格式给出-dd将匹配信息包的代码以c语言程序段的格式给出-ddd将匹配信息包的代码以十进制的形式给出-e在输出行打印出数据链路层的头部信息-f将外部的Internet地址以数字的形式打印出来-l使标准输出变为缓冲行形式-n不把网络地址转换成名字-t在输出的每一行不打印时间戳-v输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息-vv输出详细的报文信息-c在收到指定的包的数目后,tcpdump就会停止-F从指定的文件中读取表达式,忽略其它的表达式-i指定监听的网络接口-r从指定的文件中读取包(这些包一般通过-w选项产生)-w直接将包写入文件中,并不分析和打印出来-T将监听到的包直接解释为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议;)2. tcpdump的表达式介绍表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast, less, greater ,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&'或运算 是'or' ,'|';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。(1) 想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:#tcpdump host 210.27.48.1(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(。在命令行中使用括号时,一定要#tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 ) (3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:#tcpdump ip host 210.27.48.1 and ! 210.27.48.2(4) 如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:#tcpdump tcp port 23 host 210.27.48.1 3. tcpdump 的输出结果介绍下面我们介绍几种典型的tcpdump命令的输出信息(1) 数据链路层头信息#tcpdump -e host iceice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1AH219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:B:46;上一条命令的输出结果如下所示:21:50:12. eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telnet 0:0(0) ack 22535 win 8760 (DF)分析:21:50:12是显示的时间, 是ID号,eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535表明对序列号是的包进行响应. win 8760表明发送窗口的大小是8760.(2) ARP包的TCPDUMP输出信息使用命令#tcpdump arp 得到的输出结果是:22:32:42. eth0 > arp who-has route tell ice (0:90:27:58:af:1a)22:32:42. eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)分析: 22:32:42是时间戳, 是ID号, eth0 >表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。(3) TCP包的输出信息用TCPDUMP捕获的TCP包的一般输出信息是:src > dst: flags data-seqno ack window urgent optionssrc > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. Options是选项.(4) UDP包的输出信息用TCPDUMP捕获的UDP包的一般输出信息是:route.port1 > ice.port2: udp lenthUDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenthTCPDUMP中文手册最详细的手册名称(NAME)tcpdump-转储网络上的数据流总览(SYNOPSIS)tcpdump-adeflnNOpqStvx-ccount-Ffile-iinterface-rfile-ssnaplen-Ttype-wfileexpression描述(DESCRIPTION)Tcpdump打印出在某个网络界面上,匹配布尔表达式expression的报头.对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限.对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限.对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.对于BSD:你必须有/dev/bpf*的读访问权限.选项(OPTIONS)-a试着把网络和广播地址转换成名称.-c当收到count报文后退出.-d把编译好的报文匹配模板(packet-matchingcode)翻译成可读形式,传往标准输出,然后退出.-dd把报文匹配模板(packet-matchingcode)以C程序片断的形式输出.-ddd把报文匹配模板(packet-matchingcode)以十进制数形式输出(前面加上总数).-e每行都显示链路层报头.-f用数字形式显示'外部的'互联网地址,而不是字符形式(这个选项用来绕开脑壳坏光的SUN黄页服务器的问题-一般说来它翻译外部网络数字地址的时候会长期挂起).-F把file的内容用作过滤表达式.忽略命令行上的表达式.-i监听interface.如果不指定接口,tcpdump在系统的接口清单中,寻找号码最小,已经配置好的接口(loopback除外).选中的时候会中断连接.-l行缓冲标准输出.可用于捕捉数据的同时查看数据.例如,tcpdump-l|teedat''ortcpdump-l>dat&tail-fdat''.-n别把地址转换成名字(就是说,主机地址,端口号等)-N不显示主机名字中的域名部分.例如,如果使用这个选项,tcpdump只显示nic'',而不是nic.ddn.mil''.-O禁止运行报文匹配模板的优化器.只有当你怀疑优化器有bug时才有用.-p禁止把接口置成promiscuous模式.注意,接口有可能因其他原因而处于promiscuous模式;因此,'-p'不能作为etherhostlocal-hw-addr或etherbroadcast'的简写.-q快速输出.显示较少的协议信息,输出行会短一点点.-r从file中读入数据报(文件是用-w选项创建的).如果file是-'',就读标准输入.-s从每个报文中截取snaplen字节的数据,而不是缺省的68(如果是SunOS的NIT,最小值是96).68个字节适用于IP,ICMP,TCP和 UDP,但是有可能截掉名字服务器和NFS报文的协议信息(见下面).输出时如果指定|proto'',tcpdump可以指出那些捕捉量过小的 数据报,这里的proto是截断发生处的协议层名称.注意,采用更大的捕捉范围既增加了处理报文的时间,又相应的减少了报文的缓冲数量,可能导致报文的丢 失.你应该把snaplen设的尽量小,只要能够容纳你需要的协议信息就可以了.-T把通过"expression"挑选出来的报文解释成指定的type.目前已知的类型有:rpc(远程过程调用RemoteProcedureCall),rtp(实时应用协议Real- TimeApplicationsprotocol),rtcp(实时应用控制协议Real- TimeApplicationscontrolprotocol),vat(可视音频工具VisualAudioTool),和wb(分布式白板 distributedWhiteBoard).-S显示绝对的,而不是相对的TCP序列号.-t禁止显示时戳标志.-tt显示未格式化的时戳标志.-v(稍微多一点)繁琐的输出.例如,显示IP数据报中的生存周期和服务类型.-vv更繁琐的输出.例如,显示NFS应答报文的附加域.-w把原始报文存进file,而不是分析和显示.它们可以以后用-r选项显示.如果file是-'',就写往标准输出.-x以16进制数形式显示每一个报文(去掉链路层报头后).可以显示较小的完整报文,否则只显示snaplen个字节.expression用来选择要转储的数据报.如果没有指定expression,就转储网络的全部报文.否则,只转储相对expression为true'的数据报.expression一个或多个原语(primitive)组成.原语通常由一个标识(id,名称或数字),和标识前面的一个或多个修饰子(qualifier)组成.修饰子有三种不同的类型:type类型修饰子指出标识名称或标识数字代表什么类型的东西.可以使用的类型有host,net和port.例如,hostfoo',net128.3',port20'.如果不指定类型修饰子,就使用缺省的host.dir方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识).可以使用的方向有src,dst,srcordst和srcanddst.例如, srcfoo',dstnet128.3',srcordstportftp-data'.如果不指定方向修饰子,就使用缺省的srcordst. 对于null'链路层(就是说象slip之类的点到点协议),用inbound和outbound修饰子指定所需的传输方向.proto协议修饰子要求匹配指定的协议.可以使用的协议有:ether,fddi,ip,arp,rarp,decnet,lat,sca,moprc, mopdl,tcp和udp.例如,ethersrcfoo',arpnet128.3',tcpport21'.如果不指定协议修饰子,就使用所 有符合类型的协议.例如,srcfoo'指(ip或arp或rarp)srcfoo'(注意后者不符合语法),netbar'指(ip或arp或 rarp)netbar',port53'指(tcp或udp)port53'.fddi'实际上是ether'的别名;分析器把它们视为用在指定网络接口上的数据链路层.''FDDI报头包含类似于以太协议的源目地址,而且通常包含类似于以太协议的报文类型,因此你可以过滤 FDDI域,就象分析以太协议一样.FDDI报头也包含其他域,但是你不能在过滤器表达式里显式描述.作为上述的补充,有一些特殊的原语'关键字,它们不同于上面的模式:gateway,broadcast,less,greater和数学表达式.这些在后面有叙述.更复杂的过滤器表达式可以通过and,or和not连接原语来组建.例如,hostfooandnotportftpandnotportftp- data'.为了少敲点键,可以忽略相同的修饰子.例如,tcpdstportftporftp-dataordomain'实际上就是 tcpdstportftportcpdstportftp-dataortcpdstportdomain'.允许的原语有:dsthosthost如果报文中IP的目的地址域是host,则逻辑为真.host既可以是地址,也可以是主机名.srchosthost如果报文中IP的源地址域是host,则逻辑为真.hosthost如果报文中IP的源地址域或者目的地址域是host,则逻辑为真.上面所有的host表达式都可以加上ip,arp,或rarp关键字做前缀,就象:iphosthost它等价于:etherprotoipandhosthost如果host是拥有多个IP地址的主机名,它的每个地址都会被查验.etherdstehost如果报文的以太目的地址是ehost,则逻辑为真.Ehost既可以是名字(/etc/ethers里有),也可以是数字(有关数字格式另见ethers(3N).ethersrcehost如果报文的以太源地址是ehost,则逻辑为真.etherhostehost如果报文的以太源地址或以太目的地址是ehost,则逻辑为真.gatewayhost如果报文把host当做网关,则逻辑为真.也就是说,报文的以太源或目的地址是host,但是IP的源目地址都不是host.host必须是个主机名,而且必须存在/etc/hosts和/etc/ethers中.(一个等价的表达式是etherhostehostandnothosthost对于host/ehost,它既可以是名字,也可以是数字.)dstnetnet如果报文的IP目的地址属于网络号net,则逻辑为真.net既可以是名字(存在/etc/networks中),也可以是网络号.(详见networks(4).srcnetnet如果报文的IP源地址属于网络号net,则逻辑为真.netnet如果报文的IP源地址或目的地址属于网络号net,则逻辑为真.netnetmaskmask如果IP地址匹配指定网络掩码(netmask)的net,则逻辑为真.本原语可以用src或dst修饰.netnet/len如果IP地址匹配指定网络掩码的net,则逻辑为真,掩码的有效位宽为len.本原语可以用src或dst修饰.dstportport如果报文是ip/tcp或ip/udp,并且目的端口是port,则逻辑为真.port是一个数字,也可以是/etc/services中说明过的名字 (参看tcp(4P)和udp(4P).如果使用名字,则检查端口号和协议.如果使用数字,或者有二义的名字,则只检查端口号(例 如,dstport513 将显示tcp/login的数据和udp/who的数据,而portdomain将显示tcp/domain和udp/domain的数据).srcportport如果报文的源端口号是port,则逻辑为真.portport如果报文的源端口或目的端口是port,则逻辑为真.上述的任意一个端口表达式都可以用关键字tcp或udp做前缀,就象:tcpsrcportport它只匹配源端口是port的TCP报文.lesslength如果报文的长度小于等于length,则逻辑为真.它等同于:len<=length.greaterlength如果报文的长度大于等于length,则逻辑为真.它等同于:len>=length.ipprotoprotocol如果报文是IP数据报(参见ip(4P),其内容的协议类型是protocol,则逻辑为真.Protocol可以是数字,也可以是下列名称中的一个: icmp,igrp,udp,nd,或tcp.注意这些标识符tcp,udp,和icmp也同样是关键字,所以必须用反斜杠()转义,在C-shell 中应该是.etherbroadcast如果报文是以太广播报文,则逻辑为真.关键字ether是可选的.ipbroadcast如果报文是IP广播报文,则逻辑为真.Tcpdump检查全0和全1广播约定,并且检查本地的子网掩码.ethermulticast如果报文是以太多目传送报文(multicast),则逻辑为真.关键字ether是可选的.这实际上是ether0&1!=0'的简写.ipmulticast如果报文是IP多目传送报文,则逻辑为真.etherprotoprotocol如果报文协议属于以太类型的protocol,则逻辑为真.Protocol可以是数字,也可以是名字,如ip,arp,或rarp.注意这些标识符也是 关键字,所以必须用反斜杠()转义.如果是FDDI(例如,fddiprotocolarp'),协议标识来自802.2逻辑链路控制(LLC)报 头,它通常位于FDDI报头的顶层.当根据协议标识过滤报文时,Tcpdump假设所有的FDDI报文含有LLC报头,而且LLC报头用的是SNAP格 式.decnetsrchost如果DECNET的源地址是host,则逻辑为真,该主机地址的形式可能是10.123'',或者是DECNET主机名.只有配置成运行DECNET的Ultrix系统支持DECNET主机名.decnetdsthost如果DECNET的目的地址是host,则逻辑为真.decnethosthost如果DECNET的源地址或目的地址是host,则逻辑为真.ip,arp,rarp,decnet是:etherprotop的简写形式,其中p为上述协议的一种.lat,moprc,mopdl是:etherprotop的简写形式,其中p为上述协议的一种.注意tcpdump目前不知道如何分析这些协议.tcp,udp,icmp是:ipprotop的简写形式,其中p为上述协议的一种.exprrelopexpr如果这个关系成立,则逻辑为真,其中relop是>,<,>=,<=,=,!=之一,expr是数学表达式,由常整数(标准C语 法形式),普通的二进制运算符+,-,*,/,&,|,一个长度运算符,和指定的报文数据访问算符组成.要访问报文内的数据,使用下面的语 法:protoexpr:sizeProto 是ether,fddi,ip,arp,rarp,tcp,udp,oricmp之一,同时也指出了下标操作的协议层.expr给出字节单位的偏移量,该 偏移量相对于指定的协议层.Size是可选项,指出感兴趣的字节数;它可以是1,2,4,缺省为1字节.由关键字len给出的长度运算符指明报文的长度.例如,ether0&1!=0'捕捉所有的多目传送报文.表达式ip0&0xf!=5'捕捉所有带可选域的IP报文.表达式 ip6:2&0x1fff=0'只捕捉未分片和片偏移为0的数据报.这种检查隐含在tcp和udp下标操作中.例如,tcp0一定是 TCP报头的第一个字节,而不是其中某个IP片的第一个字节.原语可以用下述方法结合使用:园括弧括起来的原语和操作符(园括弧在Shell中有专用,所以必须转义).取反操作(!'ornot').连结操作(&&'orand').或操作(|'oror').取反操作有最高优先级.或操作和连结操作有相同的优先级,运算时从左到右结合.注意连结操作需要显式的and算符,而不是并列放置.如果给出标识符,但没给关键字,那么暗指最近使用的关键字.例如,nothostvsandace作为nothostvsandhostace的简写形式,不应该和not(hostvsorace)混淆.表达式参数可以作为单个参数传给tcpdump,也可以作为复合参数,后者更方便一些.一般说来,如果表达式包含Shell元字符(metacharacter),传递单个括起来的参数要容易一些.复合参数在被解析前用空格联接一起.示例(EXAMPLES)显示所有进出sundown的报文:tcpdumphostsundown显示helios和主机hot,ace之间的报文传送:tcpdumphostheliosand(hotorace)显示ace和除了helios以外的所有主机的IP报文:tcpdumpiphostaceandnothelios显示本地的主机和Berkeley的主机之间的网络数据:tcpdumpnetucb-ether显示所有通过网关snup的ftp报文(注意这个表达式被单引号括起,防止shell解释园括弧):tcpdump'gatewaysnupand(portftporftp-data)'显示既不是来自本地主机,也不是传往本地主机的网络数据(如果你把网关通往某个其他网络,这个做法将不会把数据发往你的本地网络).tcpdumpipandnotnetlocalnet显示每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中有一个远程主机.tcpdump'tcp13&3!=0andnotsrcanddstnetlocalnet'显示经过网关snup中大于576字节的IP数据报:tcpdump'gatewaysnupandip2:2>576'显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播或多目传送形式传送的:tcpdump'ether0&1=0andip16>=224'显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文):tcpdump'icmp0!=8andicmp0!=0"输出格式(OUTPUTFORMAT)tcpdump的输出格式取决于协议.下面的描述给出大多数格式的简要说明和范例.链路层报头(LinkLevelHeaders)如果给出'-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;有三个字节的数据和六个字节的压缩报头:Octcp*A+6S+49I+63(6)ARP/RARP报文Arp/rarp报文的输出显示请求类型及其参数.输出格式倾向于能够自我解释.这里是一个简单的例子,来自主机rtsg到主机csam的'rlogin'开始部分:arpwho-hascsamtellrtsgarpreplycsamis-atCSAM第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写).如果用tcpdump-n看上去要清楚一些:arpwho-has128.3.254.6tell128.3.254.68arpreply128.3.254.6is-at02:07:01:00:01:c4如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的:RTSGBroadcast:arpwho-hascsamtellrtsgCSAMRTSG:arpreplycsamis-atCSAM这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为16进制数0806(类型ETHER_ARP),报文全长64字节.TCP报文(注意:以下的描述中假设你熟悉RFC-793中说明的TCP协议,如果你不了解这个协议,无论是本文还是tcpdump都对你用处不大)一般说来tcp协议的输出格式是:src>dst:flagsdata-seqnoackwindowurgentoptionsSrc 和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:(0)win4096csam.login>rtsg.1023:S:(0)ackwin4096rtsg.1023>csam.login:.ack1win4096rtsg.1023>csam.login:P1:2(1)ack1win4096csam.login>rtsg.1023:.ack2win4096rtsg.1023>csam.login:P2:21(19)ack1win4096csam.login>rtsg.1023:P1:2(1)ack21win4077csam.login>rtsg.1023:P2:3(1)ack21win4077urg1csam.login>rtsg.1023:P3:4(1)ack21win4077urg1第一行是说从rtsg的tcp端口1023向csam的login端口发送报文.S标志表明设置了SYN标志.报文的流序号是,没有数据. (这个写成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 (withthefirstdatabyteeachdirectionbeing1').-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''.UDP报文UDP格式就象这个rwho报文显示的:actinide.who>broadcast.who:udp84就是说把一个udp数据报从主机actinide的who端口发送到broadcast,Internet广播地址的who端口.报文包含84字节的用户数据.某些UDP服务能够识别出来(从源目端口号上),因而显示出更高层的协议信息.特别是域名服务请求(RFC-1034/1035)和NFS的RPC调用(RFC-1050).UDP域名服务请求(NameServerRequests)(注意:以下的描述中假设你熟悉RFC-1035说明的域名服务协议.如果你不熟悉这个协议,下面的内容就象是天书.)域名服务请求的格式是src>dst:idop?flagsqtypeqclassname(len)h2opolo.1538>helios.domain:3+A?ucbvax.berkeley.edu.(37)主机h2opolo访问helios上的域名服务,询问和ucbvax.berkeley.edu.关联的地址记录(qtype=A).查询号是 3'. +'表明设置了递归请求标志.查询长度是37字节,不包括UDP和IP头.查询操作是普通的Query