如何学会看tcpdump出来的数据?

由 Snoopy 在 03-10-2003 19:05 发表:

如何学会看tcpdump出来的数据?

请问使用tcpdump出来的数据好像就是用sniffer出来的数据一样

请问如何学会看啊???

可以把那些进制拿起来从中得到信息吗????谢谢


And then in the evening light, when the bars of freedom fall

I watch the two of you in the shadows on the wall

How in the darkness steals some of the choices from my hand

Then will I begin to under


由 北南南北 在 03-10-2003 22:15 发表:


[root@linuxsir01 root]# tcpdump

tcpdump: listening on eth1

下面是192.168.0.6这台机器在用浏览网页,或者说与www服务器传送数据包。

06:05:52.132150 192.168.0.6.1131 > 211.147.7.91.http: . ack 59787 win 5768

   1<nop,nop,timestamp 280699531="" 384366=""> (DF)   
   2  
   3  
   4  
   5  
   6  
   7  
   8  
   9看下面的,这是与本机与windows的机器192.168.0.6交换数据。用的是netbios协议    
  10  
  11  
  12  
  1306:06:18.672027 192.168.0.6.netbios-dgm &gt; 192.168.0.255.netbios-dgm: NBT UDP PACKET(138)   
  14  
  15下面pppoe拔号中DNS的交换数据的情况。   
  16  
  17  
  18  
  1922:13:27.593548 PPPoE [ses 0x753e] IP 61: 218.24.141.146.1032 &gt; ns.szptt.net.cn.domain: 31408+ A? www.bsbse.net. (31) (DF)   
  20  
  21还有好多,与自己所开的服务有关系。耐心看一下,我对此也不太明白。   
  22  
  23  
  24  
  25请经通此术的弟兄来聊一聊。多谢。 
  26
  27  
  28
  29
  30* * *
  31
  32  
  33_由 北南南北 在 03-10-2003 22:17 发表:_   
  34  
  35
  36
  37****
  38
  39  
  40  
  41
  42
  43Linux下的sniffer工具--Tcpdump的安装和使用   
  44  
  45本文出自: http://www.china-pub.com 作者: 李国莉 (2001-09-11 15:00:00)   
  46  
  47在如今众多的黑客技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。其实,sniffer工具既可以适合于黑客的使用,也同样有利于网络管理员和网络程序员。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。   
  48  
  49下面就向大家介绍一个在linux下优秀的嗅探器-------tcpdump.(我们下面的操作都在redhat 6.2 linux 2.2.14的环境中经过实际测试.)   
  50  
  51  
  52  
  53一. Tcpdump的安装   
  54  
  55在linux下tcpdump的安装十分简单,一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。   
  56  
  571. rpm包的形式安装   
  58  
  59这种形式的安装是最简单的安装方法,rpm包是将软件编译后打包成二进制的格式,通过rpm命令可以直接安装,不需要修改任何东西。以超级用户登录,使用命令如下:   
  60  
  61#rpm -ivh tcpdump-3_4a5.rpm   
  62  
  63这样tcpdump就顺利地安装到你的linux系统中。怎么样,很简单吧。   
  64  
  652. 源程序的安装   
  66  
  67既然rpm包的安装很简单,为什么还要采用比较复杂的源程序安装呢?其实,linux一个最大的诱人之处就是在她上面有很多软件是提供源程序的,人们可以修改源程序来满足自己的特殊的需要。所以我特别建议朋友们都采取这种源程序的安装方法。   
  68  
  69· 第一步 取得源程序 在源程序的安装方式中,我们首先要取得tcpdump的源程序分发包,这种分发包有两种 形式,一种是tar压缩包(tcpdump-3_4a5.tar.Z),另一种是rpm的分发包(tcpdump-3_4a5.src.rpm)。这两种 形式的内容都是一样的,不同的仅仅是压缩的方式.tar的压缩包可以使用如下命令解开:   
  70  
  71#tar xvfz tcpdump-3_4a5.tar.Z   
  72  
  73rpm的包可以使用如下命令安装:   
  74  
  75#rpm -ivh tcpdump-3_4a5.src.rpm   
  76  
  77这样就把tcpdump的源代码解压到/usr/src/redhat/SOURCES目录下.   
  78  
  79  
  80  
  81· 第二步 做好编译源程序前的准备活动   
  82  
  83在编译源程序之前,最好已经确定库文件libpcap已经安装完毕,这个库文件是tcpdump软件所需的库文件 。同样,你同时还要有一个标准的c语言编译器。在linux下标准的c 语言编译器一般是gcc。 在tcpdump的 源程序目录中。有一个文件是Makefile.in,configure命令就是从Makefile.in文件中自动产生Makefile文 件。在Makefile.in文件中,可以根据系统的配置来修改BINDEST 和 MANDEST 这两个宏定义,缺省值是   
  84  
  85BINDEST = @sbindir@   
  86  
  87MANDEST = @mandir@   
  88  
  89第一个宏值表明安装tcpdump的二进制文件的路径名,第二个表明tcpdump的man 帮助页的路径名,你可以修 改它们来满足系统的需求。   
  90  
  91  
  92  
  93· 第三步 编译源程序   
  94  
  95使用源程序目录中的configure脚本,它从系统中读出各种所需的属性。并且根据Makefile.in文件自动生 成Makefile文件,以便编译使用.make 命令则根据Makefile文件中的规则编译tcpdump的源程序。使用make install命令安装编译好的tcpdump的二进制文件。   
  96  
  97总结一下就是:   
  98  
  99# tar xvfz tcpdump-3_4a5.tar.Z   
 100  
 101# vi Makefile.in   
 102  
 103# . /configure   
 104  
 105# make   
 106  
 107# make install   
 108  
 109  
 110  
 111二. Tcpdump的使用   
 112  
 113tcpdump采用命令行方式,它的命令格式为:   
 114  
 115tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]   
 116  
 117[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]   
 118  
 119[ -T 类型 ] [ -w 文件名 ] [表达式 ]   
 120  
 121  
 122  
 1231\. tcpdump的选项介绍   
 124  
 125-a 将网络地址和广播地址转变成名字;   
 126  
 127-d 将匹配信息包的代码以人们能够理解的汇编格式给出;   
 128  
 129-dd 将匹配信息包的代码以c语言程序段的格式给出;   
 130  
 131-ddd 将匹配信息包的代码以十进制的形式给出;   
 132  
 133-e 在输出行打印出数据链路层的头部信息;   
 134  
 135-f 将外部的Internet地址以数字的形式打印出来;   
 136  
 137-l 使标准输出变为缓冲行形式;   
 138  
 139-n 不把网络地址转换成名字;   
 140  
 141-t 在输出的每一行不打印时间戳;   
 142  
 143-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;   
 144  
 145-vv 输出详细的报文信息;   
 146  
 147-c 在收到指定的包的数目后,tcpdump就会停止;   
 148  
 149-F 从指定的文件中读取表达式,忽略其它的表达式;   
 150  
 151-i 指定监听的网络接口;   
 152  
 153-r 从指定的文件中读取包(这些包一般通过-w选项产生);   
 154  
 155-w 直接将包写入文件中,并不分析和打印出来;   
 156  
 157-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程 调用)和snmp(简单 网络管理协议;)   
 158  
 159  
 160  
 1612\. tcpdump的表达式介绍   
 162  
 163表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。   
 164  
 165在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括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.   
 166  
 167第二种是确定传输方向的关键字,主要包括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关键字。   
 168  
 169第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。   
 170  
 171除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&amp;&amp;';或运算 是'or' ,'||';   
 172  
 173这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。   
 174  
 175(1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:   
 176  
 177#tcpdump host 210.27.48.1   
 178  
 179(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用 括号时,一定要   
 180  
 181#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \\)   
 182  
 183(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:   
 184  
 185#tcpdump ip host 210.27.48.1 and ! 210.27.48.2   
 186  
 187(4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:   
 188  
 189#tcpdump tcp port 23 host 210.27.48.1   
 190  
 191  
 192  
 1933\. tcpdump 的输出结果介绍   
 194  
 195下面我们介绍几种典型的tcpdump命令的输出信息   
 196  
 197(1) 数据链路层头信息   
 198  
 199使用命令#tcpdump --e host ice   
 200  
 201ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A   
 202  
 203H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条命令的输出结果如下所示:   
 204  
 20521:50:12.847509 eth0 &lt; 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 &gt; ice.telne   
 206  
 207t 0:0(0) ack 22535 win 8760 (DF)   
 208  
 209分析:21:50:12是显示的时间, 847509是ID号,eth0 &lt;表示从网络接口eth0 接受该数据包,eth0 &gt;表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 &gt; ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535 表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.   
 210  
 211  
 212  
 213(2) ARP包的TCPDUMP输出信息   
 214  
 215使用命令#tcpdump arp   
 216  
 217得到的输出结果是:   
 218  
 21922:32:42.802509 eth0 &gt; arp who-has route tell ice (0:90:27:58:af:1a)   
 220  
 22122:32:42.802902 eth0 &lt; arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)   
 222  
 223分析: 22:32:42是时间戳, 802509是ID号, eth0 &gt;表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。   
 224  
 225  
 226  
 227(3) TCP包的输出信息   
 228  
 229用TCPDUMP捕获的TCP包的一般输出信息是:   
 230  
 231src &gt; dst: flags data-seqno ack window urgent options   
 232  
 233src &gt; dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针. Options是选项.   
 234  
 235  
 236  
 237(4) UDP包的输出信息   
 238  
 239用TCPDUMP捕获的UDP包的一般输出信息是:   
 240  
 241route.port1 &gt; ice.port2: udp lenth   
 242  
 243UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机ICE的port2端口,类型是UDP, 包的长度是lenth   
 244  
 245  
 246  
 247上面,我就详细介绍了TCPDUMP的安装和使用,希望会对大家有所帮助。如果想要熟练运用TCPDUMP这个LINUX环境下的SNIFFER利器,还需要大家在实践中总结经验,充分发挥它的威力。 
 248
 249__________________   
 250  
 251===========================   
 252  
 253请弟兄们发帖时要写个好标题,多谢!   
 254  
 255===========================   
 256  
 257每天以1000KM/H的速度在跑,感觉还是时间不够:(   
 258  
 259“西学东渐,洋为中用” + 创造 = ?   
 260  
 261linux ppc 
 262
 263  
 264
 265
 266* * *
 267
 268  
 269_由 北南南北 在 03-10-2003 22:19 发表:_   
 270  
 271
 272
 273****
 274
 275  
 276  
 277
 278
 279Linux下网络分析例解   
 280  
 281(转载自中国计算机报 文:杨鹏 2001年10月08日 11:54)   
 282  
 283  
 284  
 285Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。   
 286  
 287  
 288  
 289顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。   
 290  
 291  
 292  
 293和Linux终端状态下的其他软件一样,TcpDump也是依靠参数来工作,本文将结合实例来说明。   
 294  
 295  
 296  
 297数据过滤   
 298  
 299不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:   
 300  
 301  
 302  
 303-b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。   
 304  
 305  
 306  
 307例如:tcpdump -b arp 将只显示网络中的arp即地址转换协议信息。   
 308  
 309  
 310  
 311-i 选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。例如:   
 312  
 313  
 314  
 315tcpdump -i eth0 只显示通过eth0接口上的所有报头。   
 316  
 317  
 318  
 319src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst 、port、host、net、ehost等附加选项。他们用来分辨数据包的来源和去向,src host 192.168.0.1指定源主机IP地址是192.168.0.1,dst net 192.168.0.0/24指定目标是网络192.168.0.0。以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。可能有点复杂,看下面例子就知道了:   
 320  
 321  
 322  
 323tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24   
 324  
 325  
 326  
 327过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。   
 328  
 329  
 330  
 331tcpdump ether src 00:50:04:BA:9B and dst……   
 332  
 333  
 334  
 335过滤源主机物理地址为XXX的报头(为什么ether src后面没有host或者net?物理地址当然不可能有网络喽)。   
 336  
 337  
 338  
 339Tcpdump src host 192.168.0.1 and dst port not telnet   
 340  
 341  
 342  
 343过滤源主机192.168.0.1和目的端口不是telnet的报头。   
 344  
 345  
 346  
 347ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。例如:   
 348  
 349  
 350  
 351tcpdump ip src……   
 352  
 353  
 354  
 355只过滤数据-链路层上的IP报头。   
 356  
 357  
 358  
 359tcpdump udp and src host 192.168.0.1   
 360  
 361  
 362  
 363只过滤源主机192.168.0.1的所有udp报头。   
 364  
 365  
 366  
 367数据显示/输入输出   
 368  
 369TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:   
 370  
 371  
 372  
 373-l 可以将数据重定向。   
 374  
 375  
 376  
 377如tcpdump -l >tcpcap.txt将得到的数据存入tcpcap.txt文件中。   
 378  
 379  
 380  
 381-n 不进行IP地址到主机名的转换。   
 382  
 383  
 384  
 385如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:eth0 < ntc9.1165> router.domain.net.telnet,使用-n后变成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。   
 386  
 387  
 388  
 389-nn 不进行端口名称的转换。   
 390  
 391  
 392  
 393上面这条信息使用-nn后就变成了:eth0 < ntc9.1165 > router.domain.net.23。   
 394  
 395  
 396  
 397-N 不打印出默认的域名。   
 398  
 399  
 400  
 401还是这条信息-N 后就是:eth0 < ntc9.1165 > router.telnet。   
 402  
 403  
 404  
 405-O 不进行匹配代码的优化。   
 406  
 407-t 不打印UNIX时间戳,也就是不显示时间。   
 408  
 409-tt 打印原始的、未格式化过的时间。   
 410  
 411-v 详细的输出,也就比普通的多了个TTL和服务类型。   
 412  
 413  
 414  
 415好了,说了这么多,是不是觉得TcpDump这个工具很好?它还有好多功能限于篇幅不能一一介绍,多读一读“帮助”都会有很大的收获,这也算是进入Linux世界的一条捷径吧 
 416
 417  
 418
 419
 420* * *
 421
 422  
 423_由 北南南北 在 03-10-2003 22:22 发表:_   
 424  
 425
 426
 427****
 428
 429  
 430  
 431
 432
 433中文man手册:tcpdump - 转储网络上的数据流   
 434  
 435本文出自:http://www.cmpp.net 作者: (2001-09-24 10:00:01)   
 436  
 437TCPDUMP   
 438  
 439Section: Maintenance Commands (8)   
 440  
 441Updated: 30 June 1997   
 442  
 443名称 (NAME)   
 444  
 445tcpdump - 转储网络上的数据流   
 446  
 447总览 (SYNOPSIS)   
 448  
 449tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ]   
 450  
 451  
 452  
 453[ -i interface ] [ -r file ] [ -s snaplen ]   
 454  
 455  
 456  
 457[ -T type ] [ -w file ] [ expression ]   
 458  
 459描述 (DESCRIPTION)   
 460  
 461  
 462  
 463Tcpdump 打印出 在某个 网络界面 上, 匹配 布尔表达式 expression 的 报头.   
 464  
 465  
 466  
 467对于 SunOS 的 nit 或 bpf 界面: 要 运行 tcpdump , 你 必须 有 /dev/nit 或 /dev/bpf* 的 读访问 权限.   
 468  
 469  
 470  
 471对于 Solaris 的 dlpi: 你 必须 有 网络仿真设备 (network pseudo device), 如 /dev/le 的 读访问 权限.   
 472  
 473  
 474  
 475对于 HP-UX 的 dlpi: 你 必须 是 root, 或者 把它 安装成 root 的 设置uid 程序. 对于 IRIX 的 snoop: 你 必须 是 root, 或者 把它 安装成 root 的 设置uid 程序. 对于 Linux: 你 必须 是 root, 或者 把它 安装成 root 的 设置uid 程序.   
 476  
 477  
 478  
 479对于 Ultrix 和 Digital UNIX: 一旦 超级用户 使用 pfconfig(8) 开放了 promiscuous 操作模式 (promiscuous-mode), 任何用户 都可以 运行 tcpdump.   
 480  
 481  
 482  
 483对于 BSD: 你 必须 有 /dev/bpf* 的 读访问 权限.   
 484  
 485  
 486  
 487选项 (OPTIONS)   
 488  
 489  
 490  
 491-a 试着 把 网络和广播地址 转换成 名称.   
 492  
 493-c 当 收到 count 报文 后 退出.   
 494  
 495-d 把 编译好的 报文匹配模板 (packet-matching code) 翻译成 可读形式, 传往 标准输出, 然后退出.   
 496  
 497-dd 把 报文匹配模板 (packet-matching code) 以 C 程序片断 的 形式 输出.   
 498  
 499-ddd 把 报文匹配模板 (packet-matching code) 以 十进制数 形式 输出 (前面 加上 总数).   
 500  
 501-e 每行 都 显示 链路层报头.   
 502  
 503-f 用 数字形式 显示 '外部的' 互联网地址, 而不是 字符形式 (这个 选项 用来绕开 脑壳坏光的 SUN 黄页服务器 的 问题 --- 一般说来 它 翻译 外部网络数字地址 的时候 会 长期挂起).   
 504  
 505-F 把 file 的内容 用作 过滤表达式. 忽略 命令行 上 的 表达式.   
 506  
 507-i 监听 interface. 如果 不指定 接口, tcpdump 在 系统 的 接口 清单 中, 寻找 号码最小, 已经 配置好的 接口 (loopback 除外). 选中的时候 会 中断 连接.   
 508  
 509-l 行缓冲 标准输出. 可用于 捕捉 数据 的 同时 查看 数据. 例如,   
 510  
 511``tcpdump -l | tee dat'' or ``tcpdump -l &gt; dat &amp; tail -f dat''.   
 512  
 513-n 别把 地址 转换成 名字 (就是说, 主机地址, 端口号等)   
 514  
 515-N 不显示 主机名字 中的 域名 部分. 例如, 如果 使用 这个 选项, tcpdump 只显示 ``nic'', 而不是 ``nic.ddn.mil''.   
 516  
 517-O 禁止运行 报文匹配模板 的 优化器. 只有 当你 怀疑 优化器 有 bug 时 才有用.   
 518  
 519-p 禁止 把 接口 置成 promiscuous 模式. 注意, 接口 有可能 因 其他原因而 处于 promiscuous 模式; 因此, '-p' 不能 作为 `ether host {local-hw-addr} 或 ether broadcast' 的 简写.   
 520  
 521-q 快速输出. 显示 较少的 协议信息, 输出行 会 短一点点.   
 522  
 523-r 从 file 中 读入 数据报 (文件 是用 -w 选项 创建的). 如果 file 是 ``-'', 就 读 标准输入.   
 524  
 525-s 从每个 报文 中 截取 snaplen 字节的数据, 而不是 缺省的 68 (如果是 SunOS 的 NIT, 最小值是 96). 68 个字节 适用于 IP, ICMP, TCP 和 UDP, 但是 有可能 截掉 名字服务器 和 NFS 报文 的 协议 信息 (见下面). 输出时 如果指定 ``[|proto]'', tcpdump 可以 指出 那些 捕捉量过小的 数据报, 这里的 proto 是 截断发生处 的 协议层 名称. 注意, 采用 更大的 捕捉范围 既增加了 处理 报文 的 时间, 又 相应的 减少了报文的 缓冲 数量, 可能 导致 报文的丢失. 你 应该 把 snaplen 设的尽量小, 只要 能够 容纳 你 需要 的 协议信息 就可以了.   
 526  
 527  
 528  
 529-T 把 通过 "expression" 挑选出来的 报文 解释成 指定的 type. 目前 已知 的 类型 有: rpc (远程过程调用 Remote Procedure Call), rtp (实时应用协议 Real-Time Applications protocol), rtcp (实时应用控制协议 Real-Time Applications control protocol), vat (可视音频工具 Visual Audio Tool), 和 wb (分布式白板 distributed White Board).   
 530  
 531-S 显示 绝对的, 而不是 相对的 TCP 序列号.   
 532  
 533-t 禁止 显示 时戳标志.   
 534  
 535-tt 显示 未格式化的 时戳标志.   
 536  
 537-v (稍微多一点) 繁琐的输出. 例如, 显示 IP 数据报 中的 生存周期 和 服务类型.   
 538  
 539-vv 更繁琐的输出. 例如, 显示 NFS 应答报文 的 附加域.   
 540  
 541-w 把 原始报文 存进 file, 而不是 分析 和 显示. 它们 可以 以后 用 -r 选项 显示. 如果 file 是 ``-'', 就 写往 标准输出.   
 542  
 543-x 以 16 进制数 形式 显示 每一个 报文 (去掉链路层报头后) . 可以 显示 较小的 完整 报文, 否则 只 显示 snaplen 个 字节 .   
 544  
 545expression   
 546  
 547  
 548  
 549用来 选择 要 转储 的 数据报. 如果 没有 指定 expression , 就 转储 网络的 全部 报文. 否则, 只转储 相对 expression 为 `true' 的 数据报.   
 550  
 551  
 552  
 553expression 一个或多个 原语 (primitive) 组成. 原语 通常 由 一个 标识 (id, 名称或数字), 和 标识 前面的 一个或多个 修饰子(qualifier) 组成. 修饰子 有 三种 不同的类型:   
 554  
 555  
 556  
 557type 类型修饰子 指出 标识名称 或 标识数字 代表 什么 类型的东西. 可以使用的 类型 有 host, net 和 port. 例如, `host foo', `net 128.3', `port 20'. 如果 不指定 类型修饰子, 就使用 缺省的 host .   
 558  
 559  
 560  
 561dir 方向修饰子 指出 相对于 标识 的 传输方向 (数据是 传入还是传出 标识). 可以使用的 方向 有 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 修饰子 指定 所需的 传输方向.   
 562  
 563proto 协议修饰子 要求 匹配 指定的协议. 可以使用的 协议 有: 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'.   
 564  
 565  
 566  
 567[`fddi' 实际上 是 `ether' 的 别名; 分析器 把 它们 视为 ``用在 指定 网络接口 上的 数据链路层.'' FDDI 报头 包含 类似于 以太协议的 源目地址, 而且 通常 包含 类似于 以太协议 的 报文类型, 因此 你 可以过滤 FDDI 域, 就象 分析 以太协议 一样. FDDI 报头 也 包含 其他 域, 但是你 不能 在 过滤器 表达式 里 显式描述.]   
 568  
 569  
 570  
 571作为 上述 的 补充, 有一些 特殊的 `原语' 关键字, 它们 不同于 上面的模式: gateway, broadcast, less, greater 和 数学表达式. 这些 在 后面 有 叙述.   
 572  
 573  
 574  
 575更复杂的 过滤器表达式 可以 通过 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'.   
 576  
 577  
 578  
 579允许的 原语 有:   
 580  
 581  
 582  
 583dst host host 如果 报文中 IP 的 目的地址域 是 host, 则 逻辑 为 真. host 既可以 是 地址, 也可以 是 主机名.   
 584  
 585src host host 如果 报文中 IP 的 源地址域 是 host, 则 逻辑 为 真.   
 586  
 587host host 如果 报文中 IP 的 源地址域 或者 目的地址域 是 host, 则 逻辑 为 真. 上面 所有的 host 表达式 都可以 加上 ip, arp, 或 rarp 关键字 做 前缀, 就象:   
 588  
 589  
 590  
 591ip host host   
 592  
 593  
 594  
 595它等价于:   
 596  
 597  
 598  
 599ether proto \ip and host host   
 600  
 601  
 602  
 603如果 host 是 拥有 多个 IP 地址 的 主机名, 它的 每个地址 都会 被查验.   
 604  
 605  
 606  
 607ether dst ehost 如果 报文的 以太目的地址 是 ehost, 则 逻辑 为 真. Ehost 既可以是 名字 (/etc/ethers 里有), 也可以是 数字 (有关 数字格式 另见 ethers(3N) ).   
 608  
 609ether src ehost 如果 报文的 以太源地址 是 ehost, 则 逻辑 为 真.   
 610  
 611ether host ehost 如果 报文的 以太源地址 或 以太目的地址 是 ehost, 则 逻辑 为 真.   
 612  
 613gateway host 如果 报文 把 host 当做 网关, 则 逻辑 为 真. 也就是说, 报文的以太源或目的地址 是 host, 但是 IP 的 源目地址 都不是 host. host 必须 是个 主机名, 而且 必须 存在 /etc/hosts 和 /etc/ethers 中. (一个等价的表达式是   
 614  
 615  
 616  
 617ether host ehost and not host host   
 618  
 619  
 620  
 621对于 host / ehost, 它既可以是 名字, 也可以是 数字.)   
 622  
 623dst net net 如果 报文的 IP 目的地址 属于 网络号 net, 则 逻辑 为 真. net 既可以 是 名字 (存在 /etc/networks 中), 也可以是 网络号. (详见 networks(4)).   
 624  
 625src net net 如果 报文的 IP 源地址 属于 网络号 net, 则 逻辑 为 真.   
 626  
 627net net 如果 报文的 IP 源地址 或 目的地址 属于 网络号 net, 则 逻辑 为 真.   
 628  
 629net net mask mask 如果 IP 地址 匹配 指定 网络掩码(netmask) 的 net, 则 逻辑 为 真. 本原语 可以用 src 或 dst 修饰.   
 630  
 631net net/len 如果 IP 地址 匹配 指定 网络掩码 的 net, 则 逻辑 为 真, 掩码 的 有效位宽 为 len. 本原语 可以用 src 或 dst 修饰.   
 632  
 633dst port port 如果 报文 是 ip/tcp 或 ip/udp, 并且 目的端口 是 port, 则 逻辑 为 真. port 是一个 数字, 也可以是 /etc/services 中 说明过的 名字 (参看 tcp(4P) 和 udp(4P)). 如果 使用 名字, 则 检查 端口号 和 协议. 如果 使用 数字, 或者 有二义的名字, 则 只检查 端口号 (例如, dst port 513 将显示 tcp/login 的数据 和 udp/who 的数据, 而 port domain 将显示 tcp/domain 和 udp/domain 的数据).   
 634  
 635src port port 如果 报文 的 源端口号 是 port, 则 逻辑 为 真.   
 636  
 637port port 如果 报文 的 源端口 或 目的端口 是 port, 则 逻辑 为 真. 上述的 任意一个 端口表达式 都可以 用 关键字 tcp 或 udp 做 前缀, 就象:   
 638  
 639  
 640  
 641tcp src port port   
 642  
 643  
 644  
 645它 只匹配 源端口 是 port 的 TCP 报文.   
 646  
 647less length 如果 报文 的 长度 小于等于 length, 则 逻辑 为 真. 它等同于:   
 648  
 649  
 650  
 651len &lt;= length.   
 652  
 653  
 654  
 655greater length 如果 报文 的 长度 大于等于 length, 则 逻辑 为 真. 它等同于:   
 656  
 657  
 658  
 659len &gt;= length.   
 660  
 661  
 662  
 663ip proto protocol 如果 报文 是 IP 数据报(参见 ip(4P)), 其 内容 的 协议类型 是 protocol, 则 逻辑 为 真. Protocol 可以是 数字, 也可以是 下列 名称 中的 一个: icmp, igrp, udp, nd, 或 tcp. 注意 这些 标识符 tcp, udp, 和 icmp 也同样是 关键字, 所以 必须 用 反斜杠(\\) 转义, 在 C-shell 中 应该是 \\\ .   
 664  
 665ether broadcast 如果 报文 是 以太广播报文, 则 逻辑 为 真. 关键字 ether 是 可选的.   
 666  
 667ip broadcast 如果 报文 是 IP广播报文, 则 逻辑 为 真. Tcpdump 检查 全0 和 全1 广播约定, 并且 检查 本地 的 子网掩码.   
 668  
 669ether multicast 如果 报文 是 以太多目传送报文(multicast), 则 逻辑 为 真. 关键字 ether 是 可选的. 这实际上 是 `ether[0] &amp; 1 != 0' 的简写.   
 670  
 671ip multicast 如果 报文 是 IP多目传送报文, 则 逻辑 为 真.   
 672  
 673ether proto protocol 如果 报文协议 属于 以太类型 的 protocol, 则 逻辑 为 真. Protocol 可以是 数字, 也可以是 名字, 如 ip, arp, 或 rarp. 注意 这些 标识符 也是 关键字, 所以 必须 用 反斜杠(\\) 转义. [如果是 FDDI (例如, `fddi protocol arp'), 协议 标识 来自 802.2 逻辑链路控制(LLC)报头, 它 通常 位于 FDDI 报头 的 顶层. 当 根据 协议标识过滤 报文 时, Tcpdump 假设 所有的 FDDI 报文 含有 LLC 报头, 而且 LLC 报头 用的是 SNAP 格式.]   
 674  
 675  
 676  
 677decnet src host 如果 DECNET 的 源地址 是 host, 则 逻辑 为 真, 该 主机地址 的 形式 可能 是 ``10.123'', 或者是 DECNET 主机名. [只有 配置成 运行 DECNET 的 Ultrix 系统 支持 DECNET 主机名.]   
 678  
 679decnet dst host 如果 DECNET 的 目的地址 是 host, 则 逻辑 为 真.   
 680  
 681decnet host host 如果 DECNET 的 源地址 或 目的地址 是 host, 则 逻辑 为 真.   
 682  
 683ip, arp, rarp, decnet 是:   
 684  
 685  
 686  
 687ether proto p   
 688  
 689  
 690  
 691的 简写 形式, 其中 p 为 上述 协议 的 一种.   
 692  
 693lat, moprc, mopdl 是:   
 694  
 695  
 696  
 697ether proto p   
 698  
 699  
 700  
 701的 简写 形式, 其中 p 为 上述 协议 的 一种. 注意 tcpdump 目前 不知道 如何 分析 这些 协议.   
 702  
 703tcp, udp, icmp 是:   
 704  
 705  
 706  
 707ip proto p   
 708  
 709  
 710  
 711的 简写 形式, 其中 p 为 上述 协议 的 一种.   
 712  
 713expr relop expr 如果 这个 关系 成立, 则 逻辑 为 真, 其中 relop 是 &gt;, &lt;, &gt;=, &lt;=, =, != 之一, expr 是 数学表达式, 由 常整数(标准C语法形式), 普通的 二进制运算符 [+, -, *, /, &amp;, |], 一个 长度运算符, 和 指定的 报文数据访问算符 组成. 要 访问 报文内 的 数据, 使用 下面的 语法:   
 714  
 715  
 716  
 717proto [ expr : size ]   
 718  
 719  
 720  
 721Proto 是 ether, fddi, ip, arp, rarp, tcp, udp, or icmp 之一, 同时 也指出了 下标 操作 的协议层. expr 给出 字节单位 的 偏移量, 该 偏移量 相对于 指定的 协议层. Size 是 可选项, 指出 感兴趣的 字节数; 它可以 是 1, 2, 4, 缺省为 1 字节. 由 关键字 len 给出的 长度运算符 指明 报文 的 长度.   
 722  
 723  
 724  
 725例如, `ether[0] &amp; 1 != 0' 捕捉 所有的 多目传送 报文. 表达式 `ip[0] &amp; 0xf != 5' 捕捉 所有 带 可选域 的 IP 报文. 表达式 `ip[6:2] &amp; 0x1fff = 0' 只捕捉 未分片 和 片偏移为0 的 数据报. 这种 检查 隐含在 tcp 和 udp 下标操作 中. 例如, tcp[0] 一定是 TCP 报头 的 第一个 字节, 而不是 其中 某个 IP片 的 第一个 字节.   
 726  
 727  
 728  
 729原语 可以 用 下述 方法 结合使用:   
 730  
 731  
 732  
 733园括弧 括起来的 原语 和 操作符 (园括弧 在 Shell 中 有专用, 所以必须转义).   
 734  
 735取反操作 (`!' or `not').   
 736  
 737连结操作 (`&amp;&amp;' or `and').   
 738  
 739或操作 (`||' or `or').   
 740  
 741  
 742  
 743取反操作 有 最高优先级. 或操作 和 连结操作 有 相同的 优先级, 运算时 从左到右 结合. 注意 连结操作 需要 显式的 and 算符, 而不是 并列放置.   
 744  
 745  
 746  
 747如果 给出 标识符, 但没给 关键字, 那么 暗指 最近使用 的 关键字. 例如,   
 748  
 749  
 750  
 751not host vs and ace   
 752  
 753  
 754  
 755作为   
 756  
 757  
 758  
 759not host vs and host ace   
 760  
 761  
 762  
 763的 简写形式, 不应该 和   
 764  
 765  
 766  
 767not ( host vs or ace )   
 768  
 769  
 770  
 771混淆.   
 772  
 773  
 774  
 775表达式参数 可以 作为 单个 参数 传给 tcpdump, 也可以 作为 复合参数, 后者 更方便 一些. 一般说来, 如果 表达式 包含 Shell 元字符(metacharacter), 传递 单个 括起来的 参数 要 容易 一些. 复合参数 在 被解析前 用 空格 联接 一起.   
 776  
 777  
 778  
 779示例 (EXAMPLES)   
 780  
 781  
 782  
 783显示 所有 进出 sundown 的 报文:   
 784  
 785  
 786  
 787tcpdump host sundown   
 788  
 789  
 790  
 791显示 helios 和 主机 hot, ace 之间 的 报文 传送:   
 792  
 793  
 794  
 795tcpdump host helios and \\( hot or ace \\)   
 796  
 797  
 798  
 799显示 ace 和 除了 helios 以外的 所有 主机 的 IP报文:   
 800  
 801  
 802  
 803tcpdump ip host ace and not helios   
 804  
 805  
 806  
 807显示 本地的主机 和 Berkeley的主机 之间 的 网络数据:   
 808  
 809  
 810  
 811tcpdump net ucb-ether   
 812  
 813  
 814  
 815显示 所有 通过 网关 snup 的 ftp 报文 (注意 这个 表达式 被 单引号 括起, 防止 shell 解释 园括弧):   
 816  
 817  
 818  
 819tcpdump 'gateway snup and (port ftp or ftp-data)'   
 820  
 821  
 822  
 823显示 既不是 来自 本地主机, 也不是 传往 本地主机 的 网络数据 (如果 你 把 网关 通往 某个 其他网络, 这个 做法 将不会 把 数据 发往 你的本地网络).   
 824  
 825  
 826  
 827tcpdump ip and not net localnet   
 828  
 829  
 830  
 831显示 每个 TCP会话 的 起始 和 结束 报文 (SYN 和 FIN 报文), 而且 会话方 中有一个 远程主机.   
 832  
 833  
 834  
 835tcpdump 'tcp[13] &amp; 3 != 0 and not src and dst net localnet'   
 836  
 837  
 838  
 839显示 经过 网关 snup 中 大于 576 字节的 IP 数据报:   
 840  
 841  
 842  
 843tcpdump 'gateway snup and ip[2:2] &gt; 576'   
 844  
 845  
 846  
 847显示 IP 广播 或 多目传送 的 数据报, 这些 报文 不是 通过 以太网 的 广播 或 多目传送 形式 传送的:   
 848  
 849  
 850  
 851tcpdump 'ether[0] &amp; 1 = 0 and ip[16] &gt;= 224'   
 852  
 853  
 854  
 855显示 所有 不是 回响请求/应答 的 ICMP 报文 (也就是说, 不是 ping 报文):   
 856  
 857  
 858  
 859tcpdump 'icmp[0] != 8 and icmp[0] != 0"   
 860  
 861  
 862  
 863输出格式 (OUTPUT FORMAT)   
 864  
 865  
 866  
 867tcpdump 的 输出格式 取决于 协议. 下面的 描述 给出 大多数 格式 的简要说明 和 范例.   
 868  
 869  
 870  
 871链路层报头 (Link Level Headers)   
 872  
 873  
 874  
 875如果 给出 '-e' 选项 就 显示 链路层报头. 在 以太网上, 显示 报文的 源目地址, 协议 和 报文长度.   
 876  
 877  
 878  
 879在 FDDI 网络上, '-e' 选项 导致 tcpdump 显示出 `帧控制(frame control)' 域, 源目地址 和 报文长度. (`帧控制' 域 负责 解释 其余的 报文. 普通报文 (比如说 载有 IP数据报) 是 `异步' 报文, 优先级 介于 0 到 7; 例如, `async4'. 这些 被认为 载有 802.2 逻辑链路控制(LLC) 报文; 如果 它们 不是 ISO 数据报 或者 所谓的 SNAP 报文, 就显示出 LLC 报头.   
 880  
 881  
 882  
 883(注意: 以下 描述中 假设 你 熟悉 RFC-1144 中说明的 SLIP 压缩算法.)   
 884  
 885  
 886  
 887在 SLIP 链路上, tcpdump 显示出 方向指示 (``I'' 指 inbound, ``O'' 指 outbound), 报文类型 和 压缩信息. 首先显示的 是 报文类型. 有三种 类型 ip, utcp 和 ctcp. 对于 ip 报文 不再 显示 更多的 链路信息. 对于 TCP 报文, 在 类型 后面 显示 连接标识. 如果 报文 是 压缩过的, 就显示出 编码的报头. 特殊 情形 以 *S+n 和 *SA+n 的 形式 显示, 这里的 n 是 顺序号 (或顺序号 及其 确认) 发生 的 改变 总和. 如果 不是 特殊 情形, 就显示 0 或 多少个 改变. 改变 由 U (urgent pointer), W (window), A (ack), S (sequence number) 和 I (packet ID) 指明, 后跟 一个 变化量(+n or -n), 或 另一个 值(=n). 最后显示 报文中 的 数据总和, 以及 压缩报头 的 长度.   
 888  
 889  
 890  
 891例如, 下面一行 显示了 一个 传出的 压缩的 TCP 报文, 有一个 隐含的 连接标识; 确认(ack)的 变化量是 6, 顺序号 是 49, 报文ID 是 6; 有三个字节的数据 和六个字节 的 压缩报头:   
 892  
 893  
 894  
 895O ctcp * A+6 S+49 I+6 3 (6)   
 896  
 897  
 898  
 899ARP/RARP 报文   
 900  
 901  
 902  
 903Arp/rarp 报文 的 输出 显示 请求类型 及其 参数. 输出格式 倾向于 能够 自我解释. 这里 是一个 简单的例子, 来自 主机 rtsg 到 主机 csam 的 'rlogin' 开始 部分:   
 904  
 905  
 906  
 907arp who-has csam tell rtsg   
 908  
 909arp reply csam is-at CSAM   
 910  
 911  
 912  
 913第一行 说明 rtsg 发出 一个 arp 报文 询问 internet 主机 csam 的 以太网地址. Csam 用 它的 以太地址 作应答 (这个例子中, 以太地址 是 大写的, internet 地址为 小写).   
 914  
 915  
 916  
 917如果 用 tcpdump -n 看上去 要 清楚一些:   
 918  
 919  
 920  
 921arp who-has 128.3.254.6 tell 128.3.254.68   
 922  
 923arp reply 128.3.254.6 is-at 02:07:01:00:01:c4   
 924  
 925  
 926  
 927如果 用 tcpdump -e, 可以 看到 实际上 第一个 报文 是 广播, 第二个报文 是 点到点 的:   
 928  
 929  
 930  
 931RTSG Broadcast 0806 64: arp who-has csam tell rtsg   
 932  
 933CSAM RTSG 0806 64: arp reply csam is-at CSAM   
 934  
 935  
 936  
 937这里 第一个 报文 指出 以太网源地址是 RTSG, 目的地址 是 以太网广播地址, 类型域 为 16进制数 0806 (类型 ETHER_ARP), 报文全长 64 字节.   
 938  
 939  
 940  
 941TCP 报文   
 942  
 943  
 944  
 945(注意: 以下的描述中 假设 你 熟悉 RFC-793 中 说明的 TCP 协议, 如果 你不了解 这个 协议, 无论是 本文 还是 tcpdump 都对你 用处 不大)   
 946  
 947  
 948  
 949一般说来 tcp 协议的 输出格式是:   
 950  
 951  
 952  
 953src &gt; dst: flags data-seqno ack window urgent options   
 954  
 955  
 956  
 957Src 和 dst 是 源目IP地址和端口. Flags 是 S (SYN), F (FIN), P (PUSH) 或 R (RST) 或 单独的 `.'(无标志), 或者是 它们的 组合. Data-seqno 说明了 本报文中的数据 在 流序号 中的 位置 (见下例). Ack 是 在这条连接上 信源机 希望 下一个 接收的 字节的 流序号 (sequence number). Window 是 在这条连接上 信源机 接收缓冲区 的 字节大小. Urg 表明 报文内 是 `紧急(urgent)' 数据. Options 是 tcp 可选报头, 用 尖括号 括起 (例如, ).   
 958  
 959  
 960  
 961Src, dst 和 flags 肯定 存在. 其他域 依据 报文的 tcp 报头 内容, 只输出 有必要 的 部分.   
 962  
 963  
 964  
 965下面 是 从 主机 rtsg rlogin 到 主机 csam 的 开始部分.   
 966  
 967  
 968  
 969rtsg.1023 &gt; csam.login: S 768512:768512(0) win 4096   
 970  
 971csam.login &gt; rtsg.1023: S 947648:947648(0) ack 768513 win 4096   
 972  
 973rtsg.1023 &gt; csam.login: . ack 1 win 4096   
 974  
 975rtsg.1023 &gt; csam.login: P 1:2(1) ack 1 win 4096   
 976  
 977csam.login &gt; rtsg.1023: . ack 2 win 4096   
 978  
 979rtsg.1023 &gt; csam.login: P 2:21(19) ack 1 win 4096   
 980  
 981csam.login &gt; rtsg.1023: P 1:2(1) ack 21 win 4077   
 982  
 983csam.login &gt; rtsg.1023: P 2:3(1) ack 21 win 4077 urg 1   
 984  
 985csam.login &gt; rtsg.1023: P 3:4(1) ack 21 win 4077 urg 1   
 986  
 987  
 988  
 989第一行 是说 从 rtsg 的 tcp 端口 1023 向 csam 的 login 端口 发送 报文. S 标志 表明 设置了 SYN 标志. 报文 的 流序号 是 768512, 没有 数据. (这个写成 `first:last(nbytes)', 意思是 `从 流序号 first 到 last, 不包括 last, 有 nbytes 字节的 用户数据'.) 此时 没有 捎带确认(piggy-backed ack), 有效的 接收窗口 是 4096 字节, 有一个 最大段大小(max-segment-size) 的 选项, 请求 设置 mss 为 1024 字节.   
 990  
 991  
 992  
 993Csam 用类似的 形式 应答, 只是 增加了 一个 对 rtsg SYN 的 捎带确认. 然后 Rtsg 确认 csam 的 SYN. `.' 意味着 没有 设置 标志. 这个 报文 不包含 数据, 因此 也就 没有 数据的流序号. 注意这个 确认流序号 是一个 小整数(1). 当 tcpdump 第一次 发现 一个 tcp 会话时, 它 显示 报文 携带的 流序号. 在 随后收到的 报文里, 它 显示 当前报文 和 最初那个 报文 的 流序号 之 差. 这 意味着 从第一个报文 开始, 以后的 流序号 可以 理解成 数据流 中的 相对位移 as relative byte positions in the conversation's data stream (with the first data byte each direction being `1'). `-S' 选项 能够 改变 这个 特性, 直接 显示 原始的 流序号.   
 994  
 995  
 996  
 997在 第六行, rtsg 传给 csam 19 个字节 的 数据 (字节 2 到 20). 报文中 设置了 PUSH 标志. 第七行 csam 表明 它 收到了 rtsg 的 数据, 字节序号是 21, 但不包括 第21个 字节. 显然 大多数 数据 在 socket 的 缓冲区内, 因为 csam 的 接收窗口 收到的 数据小于 19 个 字节. 同时 csam 向 rtsg 发送了 一个字节 的 数据. 第八和第九行 显示 csam 发送了 两个字节 的 紧急数据 到 rtsg.   
 998  
 999  
1000  
1001如果 捕捉区 设置的 过小, 以至于 tcpdump 不能 捕捉到 完整的 TCP 报头, tcpdump 会 尽可能的 翻译 已捕获的 部分, 然后 显示 ``[|tcp]'', 表明 无法 翻译 其余 部分. 如果 报头 包含 一个 伪造的 选项 (one with a length that's either too small or beyond the end of the header), tcpdump 显示 ``[bad opt]'' 并且 不再 翻译 其他 选项部分 (因为 它 不可能 判断出从哪儿 开始). 如果 报头长度 表明 存在 选项, 但是 IP 数据报 长度 不够, 不可能 真的 保存 选项, tcpdump 就显示 ``[bad hdr length]''.   
1002  
1003  
1004  
1005UDP 报文   
1006  
1007  
1008  
1009UDP 格式 就象 这个 rwho 报文 显示的:   
1010  
1011  
1012  
1013actinide.who &gt; broadcast.who: udp 84   
1014  
1015  
1016  
1017就是说 把一个 udp 数据报 从 主机 actinide 的 who 端口 发送到 broadcast, Internet 广播地址 的 who 端口. 报文 包含 84字节 的 用户数据.   
1018  
1019  
1020  
1021某些 UDP 服务 能够 识别出来(从 源目端口号 上), 因而 显示出 更高层的 协议信息. 特别是 域名服务请求(RFC-1034/1035) 和 NFS 的 RPC 调用(RFC-1050).   
1022  
1023  
1024  
1025UDP 域名服务请求 (Name Server Requests)   
1026  
1027  
1028  
1029(注意: 以下的描述中 假设 你 熟悉 RFC-1035 说明的 域名服务协议. 如果你 不熟悉 这个协议, 下面的内容 就象是 天书.)   
1030  
1031  
1032  
1033域名服务请求 的 格式 是   
1034  
1035  
1036  
1037src &gt; dst: id op? flags qtype qclass name (len)   
1038  
1039  
1040  
1041h2opolo.1538 &gt; helios.domain: 3+ A? ucbvax.berkeley.edu. (37)   
1042  
1043  
1044  
1045主机 h2opolo 访问 helios 上的 域名服务, 询问和 ucbvax.berkeley.edu. 关联的 地址记录(qtype=A). 查询号是 `3'. `+' 表明 设置了 递归请求 标志. 查询长度是 37 字节, 不包括 UDP 和 IP 头. 查询操作 是 普通的 Query 操作, 因此 op 域 可以 忽略. 如果 op 设置成 其他什么东西, 它应该 显示在 `3' 和 `+' 之间. 类似的, qclass 是 普通的 C_IN 类型, 也被 忽略了. 其他类型的 qclass 应该 在 `A' 后面 显示.   
1046  
1047  
1048  
1049Tcpdump 会检查 一些 不规则 情况, 相应的 结果 作为 补充域 放在 方括号内: 如果 某个 查询 包含 回答, 名字服务 或 管理机构部分, 就把 ancount, nscount, 或 arcount 显示成 `[na]', `[nn]' 或 `[nau]', 这里的 n 代表 相应的 数量. 如果 在 第二和第三字节 中, 任何一个 回答位(AA, RA 或 rcode) 或 任何一个 `必须为零' 的位 被 置位, 就显示 `[b2&amp;3=x]', 这里的 x 是 报头 第二和第三字节 的 16进制数.   
1050  
1051  
1052  
1053UDP 名字服务回答   
1054  
1055  
1056  
1057名字服务回答的 格式 是   
1058  
1059  
1060  
1061src &gt; dst: id op rcode flags a/n/au type class data (len)   
1062  
1063  
1064  
1065helios.domain &gt; h2opolo.1538: 3 3/3/7 A 128.32.137.3 (273)   
1066  
1067helios.domain &gt; h2opolo.1537: 2 NXDomain* 0/1/0 (97)   
1068  
1069  
1070  
1071第一个例子里, helios 回答了 h2opolo 发出的 标识为3 的 询问, 一共是 3 个 回答记录, 3 个 名字服务记录 和 7 个管理结构记录. 第一个 回答纪录 的 类型是 A (地址), 数据是 internet 地址 128.32.137.3. 回答的 全长 为 273 字节, 不包括 UDP 和 IP 报头. 作为 A 记录的 class(C_IN) 可以 忽略 op (询问) 和 rcode (NoError).   
1072  
1073  
1074  
1075在第二个例子里, helios 对 标识为2 的 询问 作出 域名不存在 (NXDomain) 的 回答, 没有 回答记录, 一个 名字服务记录, 而且 没有 管理结构.   
1076  
1077`*' 表明 设置了 权威回答(authoritative answer). 由于 没有 回答记录, 这里就 不显示 type, class 和 data.   
1078  
1079  
1080  
1081其他 标志 字符 可以 显示为 `-' (没有设置递归有效(RA)) 和 `|' (设置 消息截短(TC)). 如果 `问题' 部分 没有 有效的 内容, 就 显示 `[nq]'.   
1082  
1083  
1084  
1085注意 名字服务的 询问和回答 一般说来 比较大, 68 字节的 snaplen 可能无法 捕捉到 足够的 报文内容. 如果 你 的确 在 研究 名字服务 的 情况, 可以使用 -s 选项 增大 捕捉缓冲区. `-s 128' 应该 效果 不错了.   
1086  
1087  
1088  
1089NFS 请求和响应   
1090  
1091  
1092  
1093Sun NFS (网络文件系统) 的 请求和响应 显示格式 是:   
1094  
1095  
1096  
1097src.xid &gt; dst.nfs: len op args   
1098  
1099src.nfs &gt; dst.xid: reply stat len op results   
1100  
1101  
1102  
1103  
1104  
1105sushi.6709 &gt; wrl.nfs: 112 readlink fh 21,24/10.73165   
1106  
1107wrl.nfs &gt; sushi.6709: reply ok 40 readlink "../var"   
1108  
1109sushi.201b &gt; wrl.nfs:   
1110  
1111144 lookup fh 9,74/4096.6878 "xcolors"   
1112  
1113wrl.nfs &gt; sushi.201b:   
1114  
1115reply ok 128 lookup fh 9,74/4134.3150   
1116  
1117  
1118  
1119  
1120  
1121在第一行, 主机 sushi 向 wrl 发送 号码为 6709 的 交易会话 (注意 源主机 后面的 数字 是 交易号, 不是 端口). 这项请求 长 112 字节, 不包括 UDP 和 IP 报头. 在 文件句柄 (fh) 21,24/10.731657119 上执行 readlink (读取 符号连接) 操作. (如果 运气 不错, 就象 这种情况, 文件句柄 可以 依次翻译成 主次设备号, i 节点号, 和 事件号(generation number). ) Wrl 回答 `ok' 和 连接的 内容.   
1122  
1123  
1124  
1125在第三行, sushi 请求 wrl 在 目录文件 9,74/4096.6878 中 查找 `xcolors'. 注意 数据的 打印格式 取决于 操作类型. 格式 应该是 可以自我说明的.   
1126  
1127  
1128  
1129给出 -v (verbose) 选项 可以 显示 附加信息. 例如:   
1130  
1131  
1132  
1133  
1134  
1135sushi.1372a &gt; wrl.nfs:   
1136  
1137148 read fh 21,11/12.195 8192 bytes @ 24576   
1138  
1139wrl.nfs &gt; sushi.1372a:   
1140  
1141reply ok 1472 read REG 100664 ids 417/0 sz 29388   
1142  
1143  
1144  
1145  
1146  
1147(-v 同时 使它 显示 IP 报头的 TTL, ID, 和 分片域, 在 这个例子里 把它们省略了.) 在第一行, sushi 请求 wrl 从 文件 21,11/12.195 的 偏移位置 24576 开始, 读取 8192 字节. Wrl 回答 `ok'; 第二行 显示的 报文 是 应答的 第一个 分片, 因此 只有 1472 字节 (其余数据 在 后续的 分片中传过来, 但由于 这些分片里 没有 NFS 甚至 UDP 报头, 因此 根据 所使用的 过滤器表达式, 有可能 不显示). -v 选项 还会 显示 一些 文件属性 (它们 作为 文件数据 的 附带部分 传回来): 文件类型 (普通文件 ``REG''), 存取模式 (八进制数), uid 和 gid, 以及 文件大小.   
1148  
1149  
1150  
1151如果再给一个 -v 选项 (-vv), 还能 显示 更多的细节.   
1152  
1153  
1154  
1155注意 NFS 请求 的 数据量 非常大, 除非 增加 snaplen, 否则 很多细节 无法显示. 试一试 `-s 192' 选项.   
1156  
1157  
1158  
1159NFS 应答报文 没有明确 标明 RPC 操作. 因此 tcpdump 保留有 ``近来的'' 请求 记录, 根据 交易号 匹配 应答报文. 如果 应答报文 没有 相应的 请求报文, 它 就 无法分析.   
1160  
1161  
1162  
1163KIP Appletalk (UDP 上的 DDP)   
1164  
1165  
1166  
1167Appletalk DDP 报文 封装在 UDP 数据报 中, 解包后 按 DDP 报文 转储 (也就是说, 忽略 所有的 UDP 报头 信息). 文件 /etc/atalk.names 用来 把 appletalk 网络和节点号 翻译成 名字. 这个文件 的 行格式 是   
1168  
1169  
1170  
1171number name   
1172  
1173  
1174  
11751.254 ether   
1176  
117716.1 icsd-net   
1178  
11791.254.110 ace   
1180  
1181  
1182  
1183前两行 给出了 appletalk 的 网络名称. 第三行 给出 某个主机 的 名字 (主机和网络 依据 第三组 数字 区分 - 网络号 一定 是 两组数字, 主机号 一定 是 三组 数字.) 号码 和 名字 用 空白符(空格或tab) 隔开. /etc/atalk.names 文件 可以 包含 空行 或 注释行(以`#'开始的行).   
1184  
1185  
1186  
1187Appletalk 地址 按 这个格式 显示   
1188  
1189  
1190  
1191net.host.port   
1192  
1193  
1194  
1195144.1.209.2 &gt; icsd-net.112.220   
1196  
1197office.2 &gt; icsd-net.112.220   
1198  
1199jssmag.149.235 &gt; icsd-net.2   
1200  
1201  
1202  
1203(如果 不存在 /etc/atalk.names , 或者 里面 缺少 有效项目, 就以 数字形式 显示 地址.) 第一个例子里, 网络 144.1 的 209 节点的 NBP (DDP 端口 2) 向 网络 icsd 的 112 节点 的 220 端口 发送数据. 第二行 和 上面 一样, 只是 知道了 源节点 的 全称 (`office'). 第三行 是从 网络 jssmag 的 149 节点 的 235 端口 向 icsd-net 的 NBP 端口广播 (注意 广播地址 (255) 隐含在 无主机号的 网络名字 中 - 所以 在 /etc/atalk.names 中 区分 节点名 和 网络名 是个 好主意).   
1204  
1205  
1206  
1207Tcpdump 可以 翻译 NBP (名字联结协议) 和 ATP (Appletalk 交互协议) 的 报文内容. 其他协议 只转储 协议名称 (或号码, 如果 还 没给 这个协议 注册 名称) 和 报文大小.   
1208  
1209  
1210  
1211NBP 报文 的 输出格式 就象 下面的 例子:   
1212  
1213  
1214  
1215icsd-net.112.220 &gt; jssmag.2: nbp-lkup 190: "=:LaserWriter@*"   
1216  
1217jssmag.209.2 &gt; icsd-net.112.220: nbp-reply 190: "RM1140:LaserWriter@*" 250   
1218  
1219techpit.2 &gt; icsd-net.112.220: nbp-reply 190: "techpit:LaserWriter@*" 186   
1220  
1221  
1222  
1223第一行 是 网络 icsd 的 112 主机 在 网络 jssmag 上的 广播, 对 名字 laserwriter 做 名字查询请求. 名字查询请求 的 nbp 标识号 是 190. 第二行 显示的是 对 这个请求 的 回答 (注意 它们 有 同样的 标识号), 主机 jssmag.209 表示 在它的 250 端口 注册了 一个 laserwriter 的 资源, 名字是 "RM1140". 第三行 是 这个请求 的 其他回答, 主机 techpit 的 186 端口 有 laserwriter 注册的 "techpit".   
1224  
1225  
1226  
1227ATP 报文 格式 如 下例 所示:   
1228  
1229  
1230  
1231jssmag.209.165 &gt; helios.132: atp-req 12266&lt;0-7&gt; 0xae030001   
1232  
1233helios.132 &gt; jssmag.209.165: atp-resp 12266:0 (512) 0xae040000   
1234  
1235helios.132 &gt; jssmag.209.165: atp-resp 12266:1 (512) 0xae040000   
1236  
1237helios.132 &gt; jssmag.209.165: atp-resp 12266:2 (512) 0xae040000   
1238  
1239helios.132 &gt; jssmag.209.165: atp-resp 12266:3 (512) 0xae040000   
1240  
1241helios.132 &gt; jssmag.209.165: atp-resp 12266:4 (512) 0xae040000   
1242  
1243helios.132 &gt; jssmag.209.165: atp-resp 12266:5 (512) 0xae040000   
1244  
1245helios.132 &gt; jssmag.209.165: atp-resp 12266:6 (512) 0xae040000   
1246  
1247helios.132 &gt; jssmag.209.165: atp-resp*12266:7 (512) 0xae040000   
1248  
1249jssmag.209.165 &gt; helios.132: atp-req 12266&lt;3,5&gt; 0xae030001   
1250  
1251helios.132 &gt; jssmag.209.165: atp-resp 12266:3 (512) 0xae040000   
1252  
1253helios.132 &gt; jssmag.209.165: atp-resp 12266:5 (512) 0xae040000   
1254  
1255jssmag.209.165 &gt; helios.132: atp-rel 12266&lt;0-7&gt; 0xae030001   
1256  
1257jssmag.209.133 &gt; helios.132: atp-req* 12267&lt;0-7&gt; 0xae030002   
1258  
1259  
1260  
1261Jssmag.209 向 主机 helios 发起 12266 号 交易, 请求 8 个 报文(`&lt;0-7&gt;'). 行尾的 十六进制数 是 请求中 `userdata' 域 的 值.   
1262  
1263  
1264  
1265Helios 用 8 个 512字节 的 报文 应答. 跟在 交易号 后面的 `:digit' 给出了 交易过程中 报文的 序列号, 括弧内的 数字 是 报文的 数据量, 不包括 atp 报头. 报文 7 的 `*' 表明 设置了 EOM 位.   
1266  
1267  
1268  
1269然后 Jssmag.209 请求 重传 第 3 &amp; 5 报文. Helios 做了 重传后 jssmag.209 结束 这次 交易. 最后, jssmag.209 发起 下一次 交易请求. 请求中的 `*' 表明 没有 设置 XO (只有一次) 位.   
1270  
1271  
1272  
1273IP 分片   
1274  
1275  
1276  
1277分片的 Internet 数据报 显示为   
1278  
1279  
1280  
1281(frag id:size@offset+)   
1282  
1283(frag id:size@offset)   
1284  
1285  
1286  
1287(第一种 形式 表明 还有 更多的 分片. 第二种 形式 表明 这是 最后 一片.)   
1288  
1289  
1290  
1291Id 是 分片 标识号. Size 是 分片 大小 (字节), 不包括 IP 报头. Offset 是 该分片 在 原数据报 中 的 偏移 (单位是字节).   
1292  
1293  
1294  
1295每一个 分片 的 信息 都可以 打印出来. 第一个 分片 包含了 高层 协议 报头, 显示 协议信息 后 显示 分片 的 信息. 第一个 分片 以后的 分片 不再 含有高层协议 报头, 所以 在 源目地址 后面 只显示 分片 信息. 例如, 下面是 从 arizona.edu 到 lbl-rtsg.arpa 的 一部分 ftp 传输, 途经的 CSNET 看上去 处理不了 576 字节的 数据报:   
1296  
1297  
1298  
1299arizona.ftp-data &gt; rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)   
1300  
1301arizona &gt; rtsg: (frag 595a:204@328)   
1302  
1303rtsg.1170 &gt; arizona.ftp-data: . ack 1536 win 2560   
1304  
1305  
1306  
1307这里 有几点 需要注意: 首先, 第二行的 地址 不包括 端口号. 这是因为 TCP 协议 信息 全部 装到了 第一个 分片内, 所以 显示 后续分片的 时候 不可能 知道端口 或 流序号. 其次, 第一行的 tcp 流序号部分 看上去有 308 字节的 用户数据, 实际上 是 512 字节 (第一个 分片的 308 和 第二个 分片的 204 字节). 如果你 正在 寻找 流序号中 的 空洞, 或者 试图 匹配 报文 的 确认(ack), 那你上当了.   
1308  
1309  
1310  
1311如果 报文的 IP 标有 不要分片 标志, 显示时 在尾部 加上 (DF).   
1312  
1313  
1314  
1315时戳   
1316  
1317  
1318  
1319缺省情况下, 所有 输出行 的 前面 都有 时戳. 时戳 就是 当前时间, 显示格式为   
1320  
1321  
1322  
1323hh:mm:ss.frac   
1324  
1325  
1326  
1327精度 和 内核时钟 一样. 时戳 反映了 内核 收到 报文 的 时间. 从 以太接口 收到 报文 到 内核 响应 '报文就绪' 中断 有一个 滞后, 该 滞后 不被考虑.   
1328  
1329  
1330  
1331另见 (SEE ALSO)   
1332  
1333traffic(1C), nit(4P), bpf(4), pcap(3)   
1334  
1335  
1336  
1337作者 (AUTHORS)   
1338  
1339Van Jacobson, Craig Leres and Steven McCanne, all of the Lawrence Berkeley National Laboratory, University of California, Berkeley, CA.   
1340  
1341  
1342  
1343当前 版本 可以 从 匿名ftp 获得:   
1344  
1345  
1346  
1347ftp://ftp.ee.lbl.gov/tcpdump.tar.Z   
1348  
1349  
1350  
1351BUGS   
1352  
1353请把 臭虫 报告 传往 [email protected].   
1354  
1355  
1356  
1357NIT 不允许 监视 你自己的 传出数据, BPF 可以. 我们 建议 你 使用 后者.   
1358  
1359  
1360  
1361应该 试着 重组 IP 分片, 至少可以 为 更高层的 协议 计算出 正确的 长度.   
1362  
1363  
1364  
1365名字服务逆向询问 转储的 不正确: 打印出 (空的)问题部分, 而实际上 询问 放在了回答部分. 有人 认为 这种 逆向询问 本身就是 bug, 应该 修改 产生问题 的 程序, 而非 tcpdump.   
1366  
1367  
1368  
1369苹果 Ethertalk DDP 的 报文 应该 象 KIP DDP 的 报文 一样 容易 转储, 事实却 不是 这样. 即使 我们 有意 作点什么 来 促销 Ethertalk (我们没有), LBL 也不允许 Ethertalk 出现在 它的 任何网络上, 所以 我们 没办法 测试 这些代码.   
1370  
1371  
1372  
1373如果 报文的 路径上 出现 夏时制时间 变化, 可能 导致 时戳 混乱. (这个时间变化将忽略)   
1374  
1375  
1376  
1377操作 FDDI 报头的 过滤器表达式 假设 所有的 FDDI 报文 被封装在 以太报文 中. 这对 IP, ARP 和 DECNET Phase IV 无疑是 正确的, 但对 某些 协议 如 ISO CLNS 不正确. 因此, 过滤器 有可能会 糊里糊涂的 的 接收 一些 并不真正 匹配过滤器表达式 的 报文.   
1378  
1379  
1380  
1381[中文版维护人]   
1382  
1383徐明 Email: [email protected] 
1384
1385  
1386
1387
1388* * *
1389
1390  
1391_由 北南南北 在 03-10-2003 22:25 发表:_   
1392  
1393
1394
1395****
1396
1397  
1398  
1399
1400
1401TCPDUMP快速入门手册   
1402  
14032002年08月19日 16:46:35 LinuxAid   
1404  
1405  
1406  
1407TCPDUMP简介   
1408  
1409在如今众多的黑客技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。</nop,nop,timestamp>
Published At
Categories with 服务器类
Tagged with
comments powered by Disqus