用于监测最近一段时间内发出的全局广播
adb shell dumpsys activity | grep BroadcastRecord |grep -v android.
grep -v android.意思是不显示包含android.字符的广播
dumpsys显示的广播在10秒左右就会被清除,所以在广播发送以后短时间内才有效
用于监测最近一段时间内发出的全局广播
adb shell dumpsys activity | grep BroadcastRecord |grep -v android.
grep -v android.意思是不显示包含android.字符的广播
dumpsys显示的广播在10秒左右就会被清除,所以在广播发送以后短时间内才有效
Windows和Ubuntu18双系统,最近从Windows系统切回ubuntu后windows的E盘可读不可写
从网上查可通过ntfsfix命令来解决,如下:
1 2 3 4 5 6 7 |
liuderu@liuderu-Inspiron-5577:~$ sudo ntfsfix /dev/sdb3 Mounting volume... OK Processing of $MFT and $MFTMirr completed successfully. Checking the alternate boot sector... OK NTFS volume version is 3.1. NTFS partition /dev/sdb3 was processed successfully. liuderu@liuderu-Inspiron-5577:~$ |
如果上述命令失败,可以先尝试umount一下,如下:
umount /dev/sdb3
个人比较喜欢c语言,所以后面的编程都会使用c语言。
使用c语言的话可以使用用wiringPi类库。
1、查看是否安装wiringPi类库,输入下面的命令,如果返回版本信息则表示已安装wiringPi库
1 |
$ gpio -v |
2、如果没有安装,输入下面的命令安装
1 |
sudo apt-get install wiringpi |
3、wiringPi源码
github上有一个wiringPi的代码库,但那个并不是wiringPi的源码,其源码在下面这个地址中
将Led灯的两个针脚分别连到GND和GPIO0两个接口上,网上有的教程还说要连上一个电阻,但是俺没有,就直接连上了。
新建一个ledblink.c文件,然后输入下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include <stdio.h> #include <wiringPi.h> #define LED 0 #define BLINK_INTERVAL 500 int main(void){ printf("LED blink!\n"); wiringPiSetup(); pinMode(LED, OUTPUT); for(;;){ digitalWrite(LED, 1); delay(BLINK_INTERVAL); digitalWrite(LED, 0); delay(BLINK_INTERVAL); } return 0; } |
输入下面的命令编译
1 |
gcc -o ledblink ledblink.c -lwiringPi |
编译完成后,会生成一个ledblink的可执行程序,输入./ledblink运行,看led灯是不是开始闪烁了!
本文基于Ubuntu16,pi zero WH,树莓派镜像版本2019-06-20_raspbian_full
树梅派官方推荐使用Etcher制作镜像,但是下载速度实在是太慢了,使用dd也可以搞定。
官网镜像下载地址:https://www.raspberrypi.org/downloads/raspbian/
首先下载树梅派系统镜像包,是一个zip文件,如:2019-06-20_raspbian_full_latest.zip
解决zip包后得到img镜像文件,如:2019-06-20-raspbian-buster-full.img
将sd卡连接电脑,然后执行df -h
拔掉sd卡后再执行一次df -h
有变化的那一项即是sd卡的设备名称,如:/dev/sdc1
/dev/sdc即是sd卡的主设备名,先执行下面命令卸载它的子分区
1 |
umount /dev/sdc1 |
假如还有sdc2、sdc3统统卸载掉
执行下面的命令烧录系统
1 |
dd bs=4M if=./2019-06-20-raspbian-buster-full.img of=/dev/sdc |
if=后面是镜像所在的路径
of=后面是sd卡设备名称
发送端:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!bin/bash i=0 START=`date +%s`; while true do i=$((i+1)) nc -l -p 1688 < afdtest END=`date +%s`; echo "7X12_1688_$i" echo `awk 'BEGIN{printf "1688_SPEED: %.2f\n",'$i' * '67.7' / ('$END' - '$START')}' ` done |
接收端:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!bin/bash i=0 START=`date +%s`; while true do i=$((i+1)) nc 192.168.2.15 1688 > afdtest1688 END=`date +%s`; echo "1688___$i" echo `awk 'BEGIN{printf "1689_%.2f\n",'$i' * '67.7' / ('$END' - '$START')}' ` done |
其中:
67.7是指测试文件的大小是67.7mb
1688是传输文件的端口号
afdtest是传输的文件名,afdtest1688是接收的文件名(可随意设置)
默认情况下,开启ssh后,树莓派启动时会弹出一个如下提示:
1 2 3 |
SSH is enabled and the default password for the 'pi' user has not been changed. This is a security risk - please login as the 'pi' user and run Raspberry Pi Configuration to set a new password. |
取消这个提示的方法如下:
修改用户pi的默认密码
删除sshpwd.sh文件
文件位置可能如下:
/etc/profile.d/sshpasswd.sh
/etc/profile.d/sshpwd.sh
/etc/xdg/lxsession/LXDE-pi/sshpwd.sh
如果不知道是那个,可以看下文件内容,大致如下:
1 2 3 4 5 6 7 8 9 |
#!/bin/bash export TEXTDOMAIN=pprompt . gettext.sh if [ -e /run/sshwarn ] ; then zenity --warning --width=400 --text="$(gettext "SSH is enabled and the default password for the 'pi' user has not been changed.\n\nThis is a security risk - please login as the 'pi' user and run Raspberry Pi Configuration to set a new password.")" fi |
转载自:https://www.fujieace.com/linux/man/tcpdump-8.html
简介:
tcpdump全称:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。 tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
名称:
tcpdump – dump traffic on a network(转储网络上的流量);
描述:
Tcpdump打印出一个与布尔表达式匹配的网络接口上数据包内容的描述。它也可以用-w标志运行,这会导致它将分组数据保存到一个文件中供以后分析,和/或使用-r标志,这会导致它从保存的分组文件中读取,而不是读取分组从网络界面。在任何情况下,只有匹配表达式的数据包才会被tcpdump处理。
如果Tcpdump没有运行-c标志,它将继续捕获数据包,直到它被一个SIGINT信号(例如,通过输入中断字符,通常为control-C)或一个SIGTERM信号(通常由kill(1)命令); 如果使用-c 标志运行,它将捕获数据包,直到它被SIGINT或SIGTERM信号中断或指定的数据包已被处理。
当tcpdump完成捕获包时,它会报告计数:
在支持SIGINFO信号的平台上,例如大多数BSD(包括Mac OS X)和Digital / Tru64 UNIX,它会在接收到SIGINFO信号(例如,通过输入“状态”字符,通常是control-T,尽管在一些平台上,比如Mac OS X,“status”字符默认没有设置,所以你必须使用stty(1)来设置它),并且将继续捕获数据包。
从网络接口读取数据包可能需要您有特殊的权限; 有关详细信息,请参阅pcap(3PCAP)手册页。读取保存的数据包文件不需要特殊的权限。
1 2 3 4 5 6 7 |
tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -m module ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ] |
或
1 2 3 4 5 6 7 |
tcpdump [ -AdDefIKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c 计数 ] [ -C file_size ] [ -G rotate_seconds ] [ -F 文件 ] [ -i 界面 ] [ -m 模块 ] [ -M 秘密 ] [ -r 文件 ] [ -s snaplen ] [ -T 类型 ] [ -w 文件 ] [ -W filecount ] [ -E spi @ ipaddr算法:秘密,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z 用户 ] [ 表达式 ] |
-A 在ASCII中打印每个数据包(减去其链接级别标题)。方便捕捉网页。
-B 将操作系统捕获缓冲区大小设置为buffer_size。
-c 收到计数包后退出。
-C 在将一个原始数据包写入一个保存文件之前,检查该文件当前是否大于file_size,如果是,关闭当前的保存文件并打开一个新文件。第一个保存文件后的保存文件将具有用-w标志指定的名称,后面跟着一个数字,从1开始并继续向上。file_size的单位是数百万字节(1,000,000字节,而不是1,048,576字节)。请注意,与-Z选项(默认情况下启用)一起使用时,在打开第一个savefile之前会删除权限。
-d 将已编译的数据包匹配代码以可读的形式转储到标准输出并停止。
-dd 将数据包匹配代码转储为C程序片段。
-ddd 将数据包匹配代码转储为十进制数(以count开头)。
-D 打印系统上可用的网络接口列表以及哪个tcpdump可以捕获数据包。对于每个网络接口,都会打印一个编号和一个接口名称(可能后跟接口的文本描述)。可以将接口名称或编号提供给-i标志以指定要捕获的接口。这对于没有命令列出的系统是有用的(例如,Windows系统,或缺少ifconfig -a的 UNIX系统); 在Windows 2000和更高版本的系统中,该接口名称是一个有点复杂的字符串。该-D如果标志将不被支持的tcpdump与旧版本的内置的libpcap缺少该函数pcap_findalldevs() 函数。
-e 在每个转储线上打印链接级别标题。
-E 使用spi @ ipaddr algo:secret来解密寻址到addr并包含安全参数索引值spi的 IPsec ESP数据包。这种组合可以用逗号或换行符来重复。
-f 打印’外国’的IPv4地址数字而不是象征性的(这个选项是为了解决Sun的NIS服务器严重的脑损伤 – 通常它会永久性地翻译非本地的互联网号码)。
-F 使用文件作为过滤器表达式的输入。在命令行上给出的附加表达式将被忽略。
-G 如果指定,则每rotate_seconds秒旋转使用-w选项指定的转储文件。保存文件将具有由-w指定的名称,该名称 应包含由strftime(3)定义的时间格式。如果没有指定时间格式,则每个新文件都将覆盖前一个。如果与-C选项一起使用,则文件名将采用“ file <count>”的形式。
-i 在界面上听。如果未指定,则tcpdump将在系统接口列表中搜索编号最小的已配置接口(不包括环回)。选择最早的比赛会打破关系。
-I 将界面置于“监视模式”; 这仅在IEEE 802.11 Wi-Fi接口上受支持,并且仅在某些操作系统上受支持。
-K 不要试图验证IP,TCP或UDP校验和。这对于在硬件中执行部分或全部这些校验和计算的接口非常有用; 否则,所有传出的TCP校验和将被标记为坏。
-l 使stdout行缓冲。如果您希望在捕获数据的同时查看数据,则这很有用。例如:
1 |
tcpdump -l | tee dat'' or ''tcpdump -l > dat & tail -f dat |
-L 在指定的模式下列出接口的已知数据链路类型,然后退出。已知数据链接类型的列表可以取决于指定的模式; 例如,在某些平台上,当不处于监控模式时,Wi-Fi接口可能支持一组数据链路类型(例如,它可能仅支持伪造的以太网报头,或者可能支持802.11报头但不支持具有无线电信息的802.11报头)和另一组数据链路类型(例如,它可能支持802.11报头,或802.11报头,只有在监测模式下才有无线电信息)。
-m 从文件模块加载SMI MIB模块定义。这个选项可以多次使用,将几个MIB模块加载到tcpdump中。
-M 使用secret作为共享密钥,用于通过TCP-MD5选项(RFC 2385)验证TCP段中发现的摘要(如果存在)。
-n 不要将主机地址转换为名称。这可以用来避免DNS查找。
-NN 不要将协议和端口号等转换为名称。
-N 不要打印主机名的域名限定。例如,如果你给这个标志,那么tcpdump将打印“nic”而不是“nic.ddn.mil”。
-O 不要运行数据包匹配代码优化器。只有当您怀疑优化器中存在错误时,这才是有用的。
-p 不要把界面变成混杂模式。请注意,由于某些其他原因,接口可能处于混杂模式; 因此’-p’不能用作’ether host {local-hw-addr}或ether broadcast’的缩写。
-q 快(安静?)输出。打印较少的协议信息,所以输出行较短。
-R 假设ESP / AH数据包基于旧规范(RFC1825至RFC1829)。如果指定,tcpdump将不会打印重播预防字段。由于ESP / AH规范中没有协议版本字段,因此tcpdump无法推导出ESP / AH协议的版本。
-r 从文件中读取数据包(使用-w选项创建)。如果文件是“ – ”,则使用标准输入。
-S 打印绝对的,而不是相对的TCP序列号。
-s SNARF snaplen有从每个分组而不是65535个字节的缺省数据的字节。由于快照有限而截断的数据包在输出中用”[|表示 proto ]”,其中proto是发生截断的协议级别的名称。请注意,采用较大的快照既增加了处理数据包所需的时间,也有效地减少了数据包缓冲的数量。这可能会导致数据包丢失。您应该将snaplen限制为捕获您感兴趣的协议信息的最小数目。将snaplen设置为0会将其设置为缺省值65535,以便与最近较早版本的tcpdump向后兼容。
-T 由“ 表达式 ” 选择的强制数据包被解释为指定的类型。目前已知的类型是aodv(Ad-hoc按需距离矢量协议),cnfp(Cisco NetFlow协议),rpc(远程过程调用),rtp(实时应用协议),rtcp (实时应用控制协议)snmp(简单网络管理协议),tftp(普通文件传输协议),vat(视频音频工具)和wb(分布式白板)。
-t 不要在每个转储线上打印时间戳。
-tt 在每个转储线上打印未格式化的时间戳。
-ttt 在每个转储线上打印当前行和前一行之间的增量(微秒分辨率)。
-tttt 在每个转储线上打印默认格式的时间戳,并按日期打印。
-ttttt 在每个转储线上打印当前行和第一行之间的增量(微秒分辨率)。
-u 打印未解码的NFS句柄。
-U 通过-w选项“packet-buffered” 保存输出; 即当每个数据包被保存时,它将被写入输出文件,而不是仅在输出缓冲器填充时被写入。该-U如果标志将不被支持的tcpdump与旧版本的内置的libpcap是缺乏pcap_dump_flush() 函数。
-v 解析和打印时,产生(略多)详细的输出。例如,打印IP包中的生存时间,标识,总长度和选项。还启用额外的数据包完整性检查,例如验证IP和ICMP头校验和。使用-w选项写入文件时,请每隔10秒报告捕获的数据包数量。
-vv 更详细的输出。例如,从NFS回复数据包打印附加字段,SMB数据包完全解码。
-vvv 更详细的输出。例如,telnet SB … SE选项全部打印。使用-X Telnet选项也以十六进制打印。
-w 将原始数据包写入文件,而不是解析并打印出来。他们以后可以用-r选项打印。如果文件是“ – ”,则使用标准输出 。有关文件格式的说明,请参阅pcap-savefile(5)。
-W 与-C选项一起使用时,这会将创建的文件数量限制为指定的数字,并从头开始覆盖文件,从而创建“旋转”缓冲区。另外,它将命名带有足够前导0的文件以支持最大数量的文件,使它们能够正确排序。与-G选项一起使用时,这将限制创建的旋转转储文件的数量,在达到限制时以状态0退出。如果与-C一起使用,则行为将导致每个时间片的循环文件。
-X 解析和打印时,除了打印每个数据包的标题外,还要以十六进制格式打印每个数据包的数据(减去其链接级别标题)。整个数据包或snaplen字节中的较小者将被打印。请注意,这是整个链路层数据包,因此对于填充的链路层(例如以太网),当高层数据包比所需的填充数据更短时,也会打印填充字节。
-xx 解析和打印时,除了打印每个数据包的标题外,还要以十六进制格式打印每个数据包的数据,包括其链接级别标题。
-X 解析和打印时,除了打印每个数据包的标题之外,还要以十六进制和ASCII格式打印每个数据包的数据(减去其链接级别标题)。这对分析新协议非常方便。
-XX 解析和打印时,除打印每个数据包的标题外,还要以十六进制和ASCII格式打印每个数据包的数据,包括其链接级别标题。
-y 设置数据链路类型,而捕捉包中使用datalinktype。
-z 与-C或-G选项一起使用,这将使tcpdump运行“ 命令文件 ”,其中文件是每次旋转后关闭的保存文件。例如,指定-z gzip或-z bzip2将使用gzip或bzip2压缩每个保存文件。
-Z 删除权限(如果是root)并将用户标识更改为用户,将组标识更改为主要用户组。这种行为默认是启用的(-Z tcpdump),可以通过-Z root来禁用。
表达
1、打印所有到达或离开sundown的数据包:
1 |
tcpdump host sundown |
2、打印helios和hot或ace之间的流量:
1 |
tcpdump host helios and \( hot or ace \) |
3、要在ace和除helios之外的任何主机之间打印所有IP数据包:
1 |
tcpdump ip host ace and not helios |
4、打印本地主机和Berkeley(伯克利)主机之间的所有流量:
1 |
tcpdump net ucb-ether |
5、要通过Internet网关snup打印所有的ftp流量:(注意表达式被引用来防止shell(错误)解释括号):
1 |
tcpdump 'gateway snup and (port ftp or ftp-data)' |
6、要打印既不是来自本地主机也不是本地主机的流量(如果你是通往另一个网络的话,这些东西不应该放到本地网上)。
1 |
tcpdump ip and not net localnet |
7、打印涉及非本地主机的每个TCP会话的开始和结束数据包(SYN和FIN数据包)。
1 |
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet' |
8、打印所有来自端口80的HTTP HTTP数据包,即仅打印包含数据的数据包,而不打印例如SYN和FIN数据包以及ACK数据包。(IPv6是留给读者的一个练习。)
1 |
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' |
9、打印通过网关snup发送的长度超过576字节的IP数据包:
1 |
tcpdump 'gateway snup and ip[2:2] > 576' |
10、要打印未经以太网广播或多播发送的IP广播或多播数据包:
1 |
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224' |
11、要打印所有不是回显请求/回复的ICMP数据包(即不能ping数据包):
1 |
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' |
1 |
tcpdump |
普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。
1 |
tcpdump -i eth1 |
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接口。
打印所有进入或离开sundown的数据包.
1 |
tcpdump host sundown |
也可以指定ip,例如截获所有192.168.1.120 的主机收到的和发出的所有的数据包
1 |
tcpdump host 192.168.1.120 |
打印helios 与 hot 或者与 ace 之间通信的数据包
1 |
tcpdump host helios and \( hot or ace \) |
截获主机210.27.48.120 和主机192.168.1.110或192.168.1.100的通信
1 |
tcpdump host 192.168.1.120 and \ (192.168.1.110 or 192.168.1.100 \) |
打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
1 |
tcpdump ip host ace and not helios |
如果想要获取主机192.168.1.120除了和主机192.168.1.110之外所有主机通信的ip包,使用命令:
1 |
tcpdump ip host 192.168.1.120 and ! 192.168.1.110 |
截获主机hostname发送的所有数据
1 |
tcpdump -i eth0 src host hostname |
监视所有送到主机hostname的数据包
1 |
tcpdump -i eth0 dst host hostname |
如果想要获取主机192.168.1.120接收或发出的telnet包,使用如下命令
1 |
tcpdump tcp port 23 and host 192.168.1.120 |
对本机的udp 123 端口进行监视 123 为ntp的服务端口
1 |
tcpdump udp port 123 |
打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为’Berkeley网络’的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)
1 |
tcpdump net ucb-ether |
打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)
1 |
tcpdump 'gateway snup and (port ftp or ftp-data)' |
打印所有源地址或目标地址是本地主机的IP数据包(如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络.(nt: 此句翻译曲折,需补充).localnet 实际使用时要真正替换成本地网络的名字)
1 |
tcpdump ip and not net localnet |
打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))
1 |
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet' |
打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包.(ipv6的版本的表达式可做练习)
1 |
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' |
(nt: 可理解为, ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) << 2, 即 ((tcp[12]&0xf0)>>2). ((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的’Payload Length’ 与 ‘tcp头的长度’的差值, 并且其中表达方式’ip[]’需换成’ip6[]’.)
打印长度超过576字节, 并且网关地址是snup的IP数据包
1 |
tcpdump 'gateway snup and ip[2:2] > 576' |
打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报
1 |
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224' |
打印除’echo request’或者’echo reply’类型以外的ICMP数据包( 比如,需要打印所有非ping 程序产生的数据包时可用到此表达式 .(nt: ‘echo reuqest’ 与 ‘echo reply’ 这两种类型的ICMP数据包通常由ping程序产生))
1 |
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply' |
1 |
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854 |
0x4745 为”GET”前两个字母”GE”,0x4854 为”HTTP”前两个字母”HT”。
tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
Wireshark(以前是ethereal)是Windows下非常简单易用的抓包工具。但在Linux下很难找到一个好用的图形化抓包工具。还好有Tcpdump。我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux 里抓包,然后在Windows 里分析包。
1 |
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap |
1、tcp: ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型
2、-i eth1 : 只抓经过接口eth1的包
3、-t : 不显示时间戳
4、-s 0 : 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包
5、-c 100 : 只抓取100个数据包
6、dst port ! 22 : 不抓取目标端口是22的数据包
7、src net 192.168.1.0/24 : 数据包的源网络地址为192.168.1.0/24
8、-w ./target.cap : 保存成cap文件,方便用wireshark分析
tcpdump的输出是依赖于协议的。以下给出了大多数格式的简要说明和示例。
链接级别Headers
如果给出’-e’选项,则链接级别标题被打印出来。在以太网上,打印源和目标地址,协议和数据包长度。
在FDDI网络上,“-e”选项使tcpdump打印“帧控制”字段,源地址和目标地址以及数据包长度。(“帧控制”字段管理对数据包其余部分的解释,普通数据包(如包含IP数据报的数据包)是’异步’数据包,优先级值在0到7之间;例如’ async4 ‘。假设数据包包含802.2逻辑链路控制(LLC)数据包;如果LLC数据包不是 ISO数据报或所谓的SNAP数据包,则会打印LLC标头。
在令牌环网络上,“-e”选项使tcpdump打印“访问控制”和“帧控制”字段,源地址和目标地址以及数据包长度。与在FDDI网络上一样,假设数据包含有LLC数据包。无论指定了“-e”选项,源路由信息都将打印为源路由数据包。
在802.11网络上,“-e”选项使tcpdump打印出“帧控制”字段,802.11报头中的所有地址和数据包长度。与在FDDI网络上一样,假设数据包含有LLC数据包。
(注意:以下描述假定熟悉RFC-1144中描述的SLIP压缩算法。)
在SLIP链接上,打印出一个方向指示符(“入站”I“,出站”O“),数据包类型和压缩信息。数据包类型是首先打印的。这三种类型是ip,utcp和ctcp。没有进一步的链接信息打印ip数据包。对于TCP数据包,连接标识符将按照类型打印。如果数据包是压缩的,它的编码头被打印出来。特殊情况打印为 * S + n和* SA + n,其中n是序列号(或序列号和ack)已经改变的量。如果不是特例,则打印零个或多个更改。W(窗口),A(ack),S(序列号)和I(分组ID)指示改变,接着是增量(+ n或-n)或新值(= N)。最后打印数据包中的数据量和压缩的标题长度。
例如,下面的行显示了一个带有隐式连接标识符的出站压缩TCP数据包; ack改变了6,序列号改变了49,数据包ID减少了6; 有3个字节的数据和6个字节的压缩报头:
O ctcp * A+6 S+49 I+6 3 (6)
ARP / RARP包
Arp / rarp输出显示请求的类型及其参数。格式的目的是自我解释。以下是从主机rtsg到主机csam的“rlogin”开始的简短示例:
arp who-has csam tell rtsg
arp reply csam is-at CSAM
第一行说rtsg发送一个arp包,请求互联网主机csam的以太网地址。Csam以其以太网地址回复(在这个例子中,以太网地址在大写字母和互联网地址小写)。
如果我们已经完成了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,目的地是以太网广播地址,类型字段包含十六进制0806(类型ETHER_ARP),总长度是64字节。
TCP数据包
(注意:下面的描述假定你熟悉RFC-793中描述的TCP协议,如果你不熟悉协议,这个描述和tcpdump都不会对你有太大的用处。
一个tcp协议的一般格式是:
1 |
src > dst: flags data-seqno ack window urgent options |
Src和dst是源和目标IP地址和端口。标志是S(SYN),F(FIN),P(PUSH),R(RST),W(ECN CWR)或E(ECN-Echo)的一些组合,或者一个单独的’。(没有标志)。Data-seqno描述了数据包中数据覆盖的部分序列空间(见下面的例子)。确认是在该连接上期望的另一个方向的下一个数据的序列号。Window是在此连接上可用的接收缓冲区空间的另一个方向的字节数。Urg表示数据包中有“紧急”数据。选项是用尖括号括起来的tcp选项(例如,<mss 1024>)。
Src,dst和标志总是存在。其他字段取决于数据包的TCP协议头的内容,只在适当时输出。
这是从主机rtsg到主机csam的rlogin的开头部分。
rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
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上的端口登录发送了一个包。在小号表明SYN标志设置。数据包序号为768512,不包含数据。(这个符号是“first:last(nbytes)”,意思是“序列号首先到最后一个是用户数据的nbytes字节”)。没有捎带的ack,可用的接收窗口是4096字节,有一个最大段大小选项请求1024个字节的MSS。
Csam回复一个类似的数据包,除了包含rtsg的SYN的背驮式。Rtsg然后aks csam的SYN。’。’ 意味着没有设置标志。数据包不包含数据,所以没有数据序列号。请注意,确认序号是一个小整数(1)。tcpdump第一次看到一个tcp“对话”,它打印出来的数据包的序列号。在会话的后续数据包中,打印当前数据包序列号与此初始序列号之间的差异。这意味着在第一个数据流之后的序列号可以被解释为对话数据流中的相对字节位置(每个方向的第一个数据字节是’1’)。“-S”将覆盖此功能,
在第6行,rtsg发送csam 19个字节的数据(在对话的rtsg→csam侧的字节2到20)。PUSH标志被设置在数据包中。在第七行,csam表示它收到了由rtsg发送的数据,但不包括字节21.大部分数据显然都在套接字缓冲区,因为csam的接收窗口已经减少了19个字节。Csam在这个包中也发送一个字节的数据给rtsg。在第8行和第9行,csam发送紧急的两个字节的数据到rtsg。
如果快照足够小以至于tcpdump没有捕获到完整的TCP报头,它会尽可能多地解释报头,然后报告“[| tcp ]“来表示余数不能被解释。如果报头包含一个伪造的选项(一个带的长度是太小或超过头的末尾),tcpdump的报告为“” [ 坏选择 ]“”并没有解释任何进一步的选项(因为它是不可能告诉他们在哪里开始)。如果头部长度指示存在选项,但IP数据报长度不足以使选项实际存在,则 tcpdump将其报告为“[ bad hdr length ]”。
捕获特定标志组合的TCP数据包(SYN-ACK,URG-ACK等)
TCP报头的控制位部分有8位:
CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
假设我们想要观察建立TCP连接所使用的数据包。回想一下,当TCP初始化一个新的连接时,它使用3-way握手协议; 关于TCP控制位的连接顺序是
1)调用者发送SYN
2)收件人用SYN,ACK进行响应
3)主叫发送确认
现在我们有兴趣捕获只包含SYN位的数据包(步骤1)。请注意,我们不希望步骤2(SYN-ACK)的数据包,只是一个普通的初始SYN。我们需要的是一个正确的tcpdump过滤器表达式。
回想一下没有选项的TCP头的结构:
除非有选项,否则TCP头通常保存20个八位字节的数据。图的第一行包含八位字节0 – 3,第二行显示八位字节4-7等。
让我们仔细看看八位字节号。13:
这些是我们感兴趣的TCP控制位。我们对这个八位位组中的位从0到7,从右到左编号,所以PSH位是位编号3,而URG位是编号5。
回想一下,我们想要捕获只有SYN集的数据包。让我们来看看如果一个TCP数据报到达,并且在它的头部设置了SYN位,会发生什么情况?
看看控制位部分,我们看到只有位1(SYN)被设置。
假定八位字节编号13是网络字节顺序中的8位无符号整数,则该八位字节的二进制值是
00000010
其十进制表示是
7 6 5 4 3 2 1 0
0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 0*2 + 1*2 + 0*2 = 2
我们已经差不多完成了,因为现在我们知道如果只设置了SYN,TCP头中的第13个八位字节的值在网络字节顺序中解释为8位无符号整数时,必须是2。
这种关系可以表示为
tcp[13] == 2
我们可以使用这个表达式作为tcpdump的过滤器来观察只有SYN集的数据包:
tcpdump -i xl0 tcp [13] == 2
表达式“让TCP数据报的第13个八位字节具有十进制值2”,这正是我们想要的。
现在假设我们需要捕获SYN数据包,但是我们并不在乎是否同时设置了ACK或其他TCP控制位。让我们来看看当SYN-ACK集合的TCP数据报到达时,发生什么事情的八位组13:
现在bits 1和4被设置在第13个八位字节中。八位组13的二进制值是
00010010
这转换成十进制
7 6 5 4 3 2 1 0
0*2 + 0*2 + 0*2 + 1*2 + 0*2 + 0*2 + 1*2 + 0*2 = 18
现在我们不能仅仅在tcpdump过滤器表达式中使用’tcp [13] == 18′ ,因为那样只会选择那些设置了SYN-ACK的数据包,而不是那些只有SYN设置的数据包。请记住,只要设置了SYN,我们就不在乎是否设置了ACK或任何其他控制位。
为了实现我们的目标,我们需要将八位字节13的二进制值与其他值进行逻辑与,以保留SYN位。我们知道我们希望在任何情况下都要设置SYN,所以我们将第13个八位字节的值与SYN的二进制值进行逻辑与:
我们看到,无论是否设置了ACK或另一个TCP控制位,该AND操作都可以提供相同的结果。AND值的十进制表示以及此操作的结果是2(二进制00000010),所以我们知道对于设置了SYN的数据包,以下关系必须为真:
((八位字节13的值)AND(2))==(2)
这指向了tcpdump过滤器表达式
tcpdump -i xl0’tcp [13]&2 == 2′
请注意,您应该在表达式中使用单引号或反斜杠来从shell中隐藏AND(’&’)特殊字符。
UDP数据包
UDP格式由这个rwho数据包说明:
actinide.who> broadcast.who:udp 84
这就是说端口谁主机锕发送一个UDP数据报给端口谁主机广播,互联网广播地址。数据包包含84个字节的用户数据。
某些UDP服务被识别(从源端口号或目标端口号)和打印更高级别的协议信息。特别是域名服务请求(RFC-1034/1035)和Sun RPC调用(RFC-1050)到NFS。
UDP名称服务器请求
(注意:下面的描述假设你熟悉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)。查询ID是“3”。“+”表示已设置递归期望标志。查询长度为37个字节,不包括UDP和IP协议头。查询操作是正常的,查询,所以操作字段被省略。如果操作是其他任何东西,它将被打印在“3”和“+”之间。类似地,qclass是正常的,C_IN,并被省略。任何其他qclass将在“A”之后立即打印。
检查了一些异常,并可能导致在方括号内包含额外的字段:如果查询包含答案,授权记录或附加记录部分,则将ancount,nscount或arcount打印为“[ n a]”,[ n n ]’或'[ n au]’,其中n是合适的数量。如果设置了任何响应位(AA,RA或rcode)或任何“必须为零”位以字节2和3设置,则打印“[b2&3 = x ]”,其中x是十六进制值标题字节二和三。
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个名称服务器记录和7个附加记录的查询ID3。第一个答案记录是A型(地址),其数据是互联网地址128.32.137.3。响应的总大小为273字节,不包括UDP和IP标头。op(查询)和响应代码(NoError)与A记录的类(C_IN)一样被省略。
在第二个例子中,helios以不存在答案的不存在域(NXDomain)的响应代码对一个查询2作出响应,一个名称服务器和没有权限记录。’*’表示权威答案位已设置。由于没有答案,没有打印任何类型,类别或数据。
其他可能出现的标志字符是’ – ‘(递归可用,RA,未设置)和’|’ (截断消息,TC,集合)。如果“问题”部分不包含一个条目,则会打印“[ n q]”。
SMB / CIFS解码
tcpdump现在包括对UDP / 137,UDP / 138和TCP / 139数据的相当广泛的SMB / CIFS / NBT解码。IPX和NetBEUI SMB数据的一些原始解码也完成了。
默认情况下,进行相当小的解码,如果使用-v,则执行更详细的解码。被警告说,使用-va单个SMB数据包可能会占用一个或多个页面,所以只有使用-v时,如果你真的想要所有的细节。
有关SMB数据包格式的信息以及所有te字段的含义,请参阅www.cifs.org或您最喜爱的samba.org镜像站点上的pub / samba / specs /目录。SMB补丁由Andrew Tridgell编写。
NFS请求和回复
Sun NFS(网络文件系统)请求和答复打印为:
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发送一个id为6709的事务给wrl(注意src主机后面的数字是一个事务id, 而不是源端口)。请求是112个字节,不包括UDP和IP头。该操作是文件句柄(fh)21,24 / 10.731657119 上的readlink(读取符号链接)。(如果幸运的话,在这种情况下,文件句柄可以被解释为一个主要的,次要的设备号码对,接着是inode号码和世代号码。)Wrl用链接的内容回答“ok”。
在第三行,寿司问WRL查找名称“ xcolors ”在目录文件9,74 / 4096.6878。请注意,打印的数据取决于操作类型。如果与NFS协议规范一起阅读,格式的目的是自我解释。
如果给出-v(详细)标志,则会打印附加信息。例如:
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,长度和分段字段,在这个例子中已经省略了)。在第一行中,寿司要求 wrl从文件21,11 / 12.195读取8192个字节,字节偏移量24576. WRL回复’OK’; 在第二行显示的数据包是答复的第一个片段,因此只有1472字节长(其他字节将在随后的片段中,但这些片段没有NFS甚至UDP头,因此可能不会被打印,取决于所使用的过滤表达式)。由于给出了-v标志,因此将打印一些文件属性(除文件数据外还返回):文件类型(常规文件的“REG”),文件模式(八进制) uid和gid以及文件大小。
如果-v标志被给出不止一次,则会打印更多的细节。
请注意,NFS请求非常大,除非增加snaplen,否则不会打印大部分细节。尝试使用’ -s 192 ‘来观察NFS流量。
NFS回复数据包不显式标识RPC操作。相反,tcpdump会跟踪“最近”的请求,并将它们与使用事务ID的回复进行匹配。如果答复没有严格遵循相应的请求,则可能无法解析。
AFS请求和答复
Transarc AFS(Andrew文件系统)请求和答复打印为:
src.sport > dst.dport: rx packet-type
src.sport > dst.dport: rx packet-type service call call-name args
src.sport > dst.dport: rx packet-type service reply call-name args
elvis.7001 > pike.afsfs:
rx data fs call rename old fid 536876964/1/1 “.newsrc.new”
new fid 536876964/1/1 “.newsrc”
pike.afsfs > elvis.7001: rx data fs reply rename
在第一行中,主机elvis发送一个RX数据包给派克。这是一个到fs(fileserver)服务的RX数据包,并且是RPC调用的开始。RPC调用是重命名,旧的目录文件ID为536876964/1/1,旧的文件名为“.newsrc.new”,新的目录文件ID为536876964/1/1,新的文件名为“。 newsrc”。主机pike响应重命名调用的RPC回复(这是成功的,因为它是一个数据包,而不是一个中止包)。
一般来说,所有的AFS RPC至少被RPC调用名称解码。大多数AFS RPC至少有一些解码的参数(通常只有“有趣的”参数,对某些有趣的定义)。
该格式旨在自我描述,但对于不熟悉AFS和RX工作的人可能不会有用。
如果-v(详细)标志被赋予两次,则会打印确认包和附加标题信息,例如RX呼叫ID,呼叫号码,序列号,序列号和RX包标志。
如果给出-v标志两次,则会打印附加信息,例如RX呼叫ID,序列号和RX包标志。MTU协商信息也从RX ack数据包打印。
如果-v标志被给出三次,则打印安全索引和服务标识。
错误代码被打印用于中止数据包,除了Ubik信标数据包外(因为中止数据包用于表示对Ubik协议是肯定的投票)。
请注意,AFS请求非常大,除非增加snaplen,否则许多参数将不会被打印。尝试使用“ -s 256 ”来观看AFS流量。
AFS应答包不明确地标识RPC操作。相反,tcpdump跟踪“最近”的请求,并使用电话号码和服务ID将它们与答复进行匹配。如果答复没有严格遵循相应的请求,则可能无法解析。
KIP AppleTalk(UDP中的DDP)
将封装在UDP数据报中的AppleTalk DDP数据包解封装并作为DDP数据包转储(即丢弃所有的UDP报头信息)。文件/etc/atalk.names用于将AppleTalk网络和节点号码转换为名称。这个文件中的行有表格
number name
1.254 ether
16.1 icsd-net
1.254.110 ace
前两行给出了AppleTalk网络的名称。第三行给出了一个特定主机的名称(主机与网络中的第三个八位字节相区别 – 网络号必须有两个八位字节,而主机号必须有三个八位字节)。数字和名称应该分开由空白(空格或制表符)。该/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不存在或不包含某个AppleTalk主机/网络号的条目,则以数字形式打印地址。)在第一个示例中,网络上的NBP(DDP端口2)144.1节点209正在向正在监听网络icsd节点112的端口220上的任何节点发送信息。第二行是相同的,除了源节点的全名是已知的(“办公室”)。第三行是从网络jssmag节点149上的端口235发送到icsd-net NBP端口上的广播(注意,广播地址(255)由没有主机号码的网络名称指示 – 因此,这是一个好主意保持/etc/atalk.names中的节点名和网名不同)。
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
第一行是由网络主机112发送的在网络jssmag上广播的激光写入器的名称查询请求。查找的nbp id是190.第二行显示来自主机jssmag.209的这个请求(注意它具有相同的id)的回复,表示它具有在端口250上注册的名为“RM1140”的laserwriter资源。第三行是另一个答复相同的请求说,主机techpit有激光写作“techpit”186端口注册。
ATP数据包格式化由以下示例演示:
jsmag.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- (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 512: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通过请求多达8个数据包('<0-7>’)来启动与主机helios的事务ID 12266。行尾的十六进制数字是请求中’userdata’字段的值。
Helios响应8个512字节的数据包。交易ID后面的“:digit”给出了交易中的分组序列号,parens中的数字是分组中的数据量,不包括atp头。数据包7上的“*”表示EOM位已设置。
然后Jssmag.209请求重传分组3和5。Helios重新发送它们,然后jssmag.209释放事务。最后,jssmag.209发起下一个请求。请求中的“*”表示XO(’刚好一次’)未被设置。
IP碎片
碎片化的Internet数据报被打印为
(frag id:size@offset+)
(frag id:size@offset)
(第一种形式表示有更多的片段,第二种表示这是最后一个片段。)
Id是片段ID。大小是不包括IP头的片段大小(以字节为单位)。偏移量是原始数据报中该片段的偏移量(以字节为单位)。
片段信息为每个片段输出。第一个片段包含更高级别的协议头,并且在协议信息之后打印片段信息。第一个片段之后的碎片不包含更高级别的协议头,并且在源地址和目的地址之后打印碎片信息。例如,这里是一个从arizona.edu到lbl-rtsg.arpa的ftp的一部分,通过一个CSNET连接,看起来不处理576字节的数据报:
arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+)
arizona > rtsg: (frag 595a:204@328)
rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560
这里有几点需要注意:首先,第二行的地址不包含端口号。这是因为TCP协议信息全部在第一个片段中,我们不知道打印后面的片段时端口或序列号是什么。其次,打印第一行的tcp序列信息时,如果有308字节的用户数据,实际上有512字节(第一个碎片308,第二个碎片204)。如果您正在寻找序列空间中的空洞,或试图将数据与数据包进行匹配,这可能会欺骗您。
具有IP 不分段标志的分组标记有尾随(DF)。
时间戳
默认情况下,所有输出行都有一个时间戳记。时间戳是表单中的当前时钟时间
hh:mm:ss.frac
和内核的时钟一样精确。时间戳反映了内核第一次看到数据包的时间。没有尝试去考虑以太网接口从有线连接中删除数据包和内核服务于“新数据包”中断之间的时间间隔。
名称(NAME)
tcpdump-转储网络上的数据流
总览(SYNOPSIS)
tcpdump[-adeflnNOpqStvx][-ccount][-Ffile]
[-iinterface][-rfile][-ssnaplen]
[-Ttype][-wfile][expression]
描述(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”or
tcpdump-l>dat&tail-fdat”.
-n
别把地址转换成名字(就是说,主机地址,端口号等)
-N
不显示主机名字中的域名部分.例如,如果使用这个选项,tcpdump只显示nic”,而不是
nic.ddn.mil”.
-O
禁止运行报文匹配模板的优化器.只有当你怀疑优化器有bug时才有用.
-p
禁止把接口置成promiscuous模式.注意,接口有可能因其他原因而处于promiscuous模式;因此,’-p’不能作为etherhost{local-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
它等价于:
etherproto\ipandhosthost
如果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是可选的.这实际上是ether[0]&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语法形式),普通的二进制运算符[+,-,*,/,&,|],一个长度运算符,和指定的报文数据访问算符组成.要访问报文内的数据,使用下面的语法:
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中有专用,所以必须转义).
取反操作(!’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'tcp[13]&3!=0andnotsrcanddstnetlocalnet'
显示经过网关snup中大于576字节的IP数据报:
tcpdump'gatewaysnupandip[2:2]>576'
显示IP广播或多目传送的数据报,这些报文不是通过以太网的广播或多目传送形式传送的:
tcpdump'ether[0]&1=0andip[16]>=224'
显示所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文):
tcpdump'icmp[0]!=8andicmp[0]!=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-hascsamtellrtsg
arpreplycsamis-atCSAM
第一行说明rtsg发出一个arp报文询问internet主机csam的以太网地址.Csam用它的以太地址作应答(这个例子中,以太地址是大写的,internet地址为小写).
如果用tcpdump-n看上去要清楚一些:
arpwho-has128.3.254.6tell128.3.254.68
arpreply128.3.254.6is-at02:07:01:00:01:c4
如果用tcpdump-e,可以看到实际上第一个报文是广播,第二个报文是点到点的:
RTSGBroadcast080664:arpwho-hascsamtellrtsg
CSAMRTSG080664:arpreplycsamis-atCSAM
这里第一个报文指出以太网源地址是RTSG,目的地址是以太网广播地址,类型域为16进制数0806(类型ETHER_ARP),报文全长64字节.
TCP报文
(注意:以下的描述中假设你熟悉RFC-793中说明的TCP协议,如果你不了解这个协议,无论是本文还是tcpdump都对你用处不大)
一般说来tcp协议的输出格式是:
src>dst:flagsdata-seqnoackwindowurgentoptions
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:S768512:768512(0)win4096
csam.login>rtsg.1023:S947648:947648(0)ack768513win4096
rtsg.1023>csam.login:.ack1win4096
rtsg.1023>csam.login:P1:2(1)ack1win4096
csam.login>rtsg.1023:.ack2win4096
rtsg.1023>csam.login:P2:21(19)ack1win4096
csam.login>rtsg.1023:P1:2(1)ack21win4077
csam.login>rtsg.1023:P2:3(1)ack21win4077urg1
csam.login>rtsg.1023:P3:4(1)ack21win4077urg1
第一行是说从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(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操作,因此op域可以忽略.如果op设置成其他什么东西,它应该显示在3'
和+’之间.类似的,qclass是普通的C_IN类型,也被忽略了.其他类型的qclass应该在A'
后面显示.
Tcpdump会检查一些不规则情况,相应的结果作为补充域放在方括号内:如果某个查询包含回答,名字服务或管理机构部分,就把ancount,nscount,或arcount显示成[na]’,[nn]'
或[nau]’,这里的n代表相应的数量.如果在第二和第三字节中,任何一个回答位(AA,RA或rcode)或任何一个必须为零'的位被置位,就显示[b2&3=x]’,这里的x是报头第二和第三字节的16进制数.
UDP名字服务回答
名字服务回答的格式是
src>dst:idoprcodeflagsa/n/autypeclassdata(len)
helios.domain>h2opolo.1538:33/3/7A128.32.137.3(273)
helios.domain>h2opolo.1537:2NXDomain*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′应该效果不错了.
NFS请求和响应
SunNFS(网络文件系统)的请求和响应显示格式是:
src.xid>dst.nfs:lenopargs
src.nfs>dst.xid:replystatlenopresults
sushi.6709>wrl.nfs:112readlinkfh21,24/10.73165
wrl.nfs>sushi.6709:replyok40readlink”../var”
sushi.201b>wrl.nfs:
144lookupfh9,74/4096.6878″xcolors”
wrl.nfs>sushi.201b:
replyok128lookupfh9,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:
148readfh21,11/12.1958192bytes@24576
wrl.nfs>sushi.1372a:
replyok1472readREG100664ids417/0sz29388
(-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保留有近来的”请求记录,根据交易号匹配应答报文.如果应答报文没有相应的请求报文,它就无法分析.
KIPAppletalk(UDP上的DDP)
AppletalkDDP报文封装在UDP数据报中,解包后按DDP报文转储(也就是说,忽略所有的UDP报头信息).文件/etc/atalk.names用来把appletalk网络和节点号翻译成名字.这个文件的行格式是
numbername
1.254ether
16.1icsd-net
1.254.110ace
前两行给出了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-lkup190:”=:LaserWriter@*”
jssmag.209.2>icsd-net.112.220:nbp-reply190:”RM1140:LaserWriter@*”250
techpit.2>icsd-net.112.220:nbp-reply190:”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-req12266<0-7>0xae030001
helios.132>jssmag.209.165:atp-resp12266:0(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:1(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:2(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:4(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:6(512)0xae040000
helios.132>jssmag.209.165:atp-resp*12266:7(512)0xae040000
jssmag.209.165>helios.132:atp-req12266<3,5>0xae030001
helios.132>jssmag.209.165:atp-resp12266:3(512)0xae040000
helios.132>jssmag.209.165:atp-resp12266:5(512)0xae040000
jssmag.209.165>helios.132:atp-rel12266<0-7>0xae030001
jssmag.209.133>helios.132:atp-req*12267<0-7>0xae030002
Jssmag.209向主机helios发起12266号交易,请求8个报文(<0-7>').
行尾的十六进制数是请求中userdata’域的值.
ubuntu下 vi输入方向键会变成ABCD,这是ubuntu预装的是vim tiny版本,安装vim full版本即可解决。
首先,卸载了原有的vim
$ sudo apt-get remove vim-common
然后,安装新的vim-full
$ sudo apt-get install vim
以上命令执行完后即可解决问题。
原文链接:https://blog.csdn.net/qlexcel/article/details/121751395
慢慢学习了很多Linux命令
感觉还是很方便的
但是参数语法太多
实在是记不住
还是多总结记录比较好
省的再去查man,浪费时间