目录
tcpdump介绍
tcpdump帮助信息
抓包对象
使用表达式文件
数据包的保存及查看
manpage里的例子
更多示例
输出格式(以下为man原文翻译)
链接级别标题
ARP/RARP数据包
IPv4数据包
TCP数据包
UDP数据包
UDP名称服务器请求
UDP名称服务器响应
SMB / CIFS解码
NFS请求和回复
AFS请求和回复
KIP AppleTalk(UDP中的DDP)
NBP数据包格式
ATP数据包格式
tcpdump介绍
https://www.tcpdump.org/
https://www.tcpdump.org/manpages/tcpdump.1.html
https://jvns.ca/tcpdump-zine-print.pdf
tcpdump是一个功能强大的命令行数据包分析器;
和
libpcap,一个用于网络流量捕获的可移植C
/ C ++库。tcpdump
– 在网络上转储流量。是一个抓包工具,一种嗅探器(sniffer)。
man描述
Tcpdump在网络接口上打印出与布尔表达式匹配的数据包内容的描述;
描述之前是一个时间戳,默认情况下打印为小时,分钟,秒和午夜以来的分数。
它也可以使用-w
标志运行
,这会导致它将数据包数据保存到文件中以供以后分析,和/或使用
-r 标志,这会使它从保存的数据包文件中读取而不是读取数据包来自网络界面。
它也可以使用-V
标志运行
,这会使它读取已保存的数据包文件列表。在所有情况下,只有匹配表达式的数据包
才会被tcpdump处理
。
如果没有使用-c
标志运行,Tcpdump将
继续捕获数据包,直到被SIGINT信号(例如,通过键入中断字符,通常是control-C)或SIGTERM信号(通常使用kill产生)生成
(1)命令);
如果使用-c
标志运行
,它将捕获数据包,直到被SIGINT或SIGTERM信号中断或已处理指定数量的数据包。
当
tcpdump 完成捕获数据包时,它将报告以下计数:
-
数据包``capture''(这是tcpdump
接收和处理的数据包数
);
-
数据包“received
by filter”(其含义取决于您运行
tcpdump的操作系统,可能与操作系统配置的方式有关
-
如果在命令行上指定了过滤器,则在某些操作系统上计数数据包,无论它们是否与过滤器表达式匹配,即使它们与过滤器表达式匹配,无论tcpdump是否
已经读取并处理它们,在其他操作系统上它只计算与过滤器表达式匹配的数据包,而不管tcpdump是否
已经读取并处理它们,而在其他操作系统上,它只计算与过滤器表达式匹配并由tcpdump处理的数据包
);
-
数据包“dropped
by kernel”(这是由于缺少缓冲区空间而被丢弃的数据包数量,由
运行tcpdump的操作系统中的数据包捕获机制
,如果操作系统向应用程序报告该信息;如果没有,它将被报告为0)。
在支持SIGINFO信号的平台上,例如大多数BSD(包括macOS)和Digital
/ Tru64
UNIX,它会在收到SIGINFO信号时报告这些计数(例如,通过键入“状态”字符生成,通常control-T,虽然在某些平台上,例如macOS,默认情况下不设置``status''字符,所以你必须用stty(1)设置
才能使用它,并继续捕获数据包。在不支持SIGINFO信号的平台上,使用SIGUSR1信号可以实现相同的功能。
使用SIGUSR2信号和
-w 标志会强制将数据包缓冲区刷新到输出文件中。
从网络接口读取数据包可能要求您具有特殊权限;
有关详细信息,请参见
pcap(3PCAP)手册页。通过将网卡适配器(NIC)置于混杂模式(promiscuous)来获取传输在网络中的信息包。需要root权限将网卡变更为“混杂模式”,切换到root或者用sudo。读取已保存的数据包文件不需要特殊权限。
tcpdump帮助信息
https://www.tcpdump.org/manpages/tcpdump.1.html
Index:
NAME名称;
SYNOPSIS概要;
DESCRIPTION描述;
OPTIONS选项;
EXAMPLES
例子;
OUTPUT
FORMAT输出格式;
SEE
ALSO跟多信息;
AUTHORS作者;
BUGS异常反馈;
上面是英文原文的目录链接,可以直接转到英文原文的对应章节。
tcpdump
version 4.9.2
libpcap
version 1.9.0-PRE-GIT (with TPACKET_V3)
OpenSSL
1.1.1c 28 May 2019
常用选项:
红色:抓包选项;蓝色:输出选项;紫色:其他常用功能选项
-a 》尝试将网络和广播地址转换成名称。
-A 只会显示ASCII形式的数据包内容,不会再以十六进制形式显示
-b 以ASDOT表示法而不是ASPLAIN表示法打印BGP数据包中的AS编号。
-d 将编译后的数据包匹配代码以人类可读的形式转储到标准输出并停止。
-dd 将数据包匹配代码转储为
C 程序片段。
-ddd
将数据包匹配代码转储为十进制数字(以计数开头)。
-D --list-interfaces
列出系统上可用的网络接口列表以及
tcpdump
可以捕获数据包的列表。
-e 打印链接级标题。例如,可打印诸如以太网和IEEE
802.11之类协议的MAC层地址。
-f 用数字显示网际网络地址。
-h --help
打印tcpdump和libpcap版本字符串,打印用法消息,然后退出。
--version
打印tcpdump和libpcap版本字符串并退出。
-H 尝试检测802.11s草图网格标头。
-I --monitor-mode将界面置于(监控模式);
这仅在IEEE
802.11 Wi-Fi接口上受支持,及某些OS上受支持。
请注意,在监视器模式下,适配器可能与与其关联的网络取消关联,因此您将无法使用具有该适配器的任何无线网络。如果您在监视器模式下捕获并且未使用其他适配器连接到另一个网络,则可能会阻止访问网络服务器上的文件或解析主机名或网络地址。该标志将影响-L
标志的输出
。如果 未指定-I,则仅显示未处于监控模式时可用的链路层类型;
如果
指定-I,则仅显示处于监视模式时可用的链接层类型。
--immediate-mode
以“立即模式”捕获。在此模式下,数据包一到达就会传送到tcpdump,而不是为了提高效率而进行缓冲。这是打印数据包时的默认设置,而不是在将数据包打印到终端而不是文件或管道时将数据包保存到“savefile”。
-J --list-time-stamp-types 列出接口支持的时间戳类型并退出。如果无法为接口设置时间戳类型,则不会列出时间戳类型。
--time-stamp-precision =
tstamp_precision
捕获时,将捕获的时间戳精度设置为
tstamp_precision。请注意,高精度时间戳(纳秒)的可用性及其实际精度取决于平台和硬件。还要注意,当以纳秒级精度将捕获写入保存文件时,时间戳以纳秒分辨率写入,并且文件使用不同的幻数编写,以指示时间戳以秒和纳秒为单位;
并非所有读取pcap
savefiles的程序都能读取这些捕获。
读取保存文件时,将时间戳转换为timestamp_precision指定的精度,并以该分辨率显示它们。如果指定的精度小于文件中时间戳的精度,则转换将失去精度。
为支持的值timestamp_precision是微为微秒分辨率和纳米为十亿分之一秒分辨率。默认值为微秒分辨率。
--micro
--nano
速记为--time时间戳精度=微或
--time戳精度=纳米,相应地调节时间戳精度。从保存文件读取数据包时,如果使用纳秒精度创建保存文件,则使用
--micro截断时间戳。与此相反,具有微秒精度创建的SAVEFILE将具有当后添加的时间标记的零
--nano被使用。
-K --dont-verify-checksums 请勿尝试验证IP,TCP或UDP校验和。这对于在硬件中执行部分或全部校验和计算的接口非常有用; 否则,所有传出的TCP校验和都将被标记为错误。
-l 使用标准输出列的缓冲区。在捕获数据时查看数据,非常有用。例如,
tcpdump -l | tee dat
or
tcpdump -l > dat & tail
-f dat
请注意,在Windows上,“line
buffered”表示“无缓冲”,因此如果
指定了-l,WinDump将单独写入每个字符
。
-U 在其行为上
类似于 -l,但它会导致输出为“数据包缓冲”,因此输出在每个数据包的末尾而不是在每行的末尾写入stdout;
这是在所有平台上缓冲的,包括Windows。
-L --list-数据链路类型
在指定模式下列出接口的已知数据链接类型,然后退出。已知数据链接类型列表可能取决于指定的模式; 例如,在某些平台上,Wi-Fi接口可能在不处于监控模式时支持一组数据链路类型(例如,它可能仅支持伪以太网报头,或者可能支持802.11报头但不支持带有无线电信息的802.11报头)和处于监控模式时的另一组数据链路类型(例如,它可能支持802.11标头,或仅具有无线电信息的802.11标头,仅在监控模式下)。
-n 数字显示,
-n显示ip地址(不解析为主机名);-nn地址+端口号码(端口不解析为服务名称)。
-N 不打印host的域名部分
-O --no-optimize,不要运行数据包匹配代码优化器。仅当您怀疑优化器中存在错误时,此选项才有用。
-p --no-promiscuous-mode 不要将接口置于混杂模式。
请注意,由于某些其他原因,界面可能处于混杂模式;
因此,`-p'不能用作`ether
host {local-hw-addr}或ether
broadcast'的缩写。
--print, 即使将原始数据包保存到带有-w
标志的文件,也会打印已分析的数据包输出
。
-q 快速简短打印
-S --absolute-tcp-sequence-numbers打印绝对而非相对的TCP序列号。
-t 输出时不打印时间戳
-tt 显示未经格式化的时间戳记。即自1970年1月1日00:00:00,UTC以及自该时间以来的每秒分数
-ttt 在每个转储行上的当前行和上一行之间
打印增量 (微秒或纳秒分辨率,具体取决于
--time-stamp-precision选项)。默认值为微秒分辨率。
-tttt 在每个转储行上打印一个时间戳,以小时,分钟,秒和从午夜开始的一小时一秒为止。
-ttttt 在每个转储线上的当前行和第一行之间
打印增量 (微秒或纳秒分辨率,具体取决于
--time-stamp-precision选项)。默认值为微秒分辨率。
-u 打印未解码的NFS句柄。
-U --packet-buffered
如果
未指定-w选项,或者如果指定了
-w选项但是
也指定了 --print标志,则使打印的数据包输出``packet-buffered'';
即,当打印每个数据包的内容的描述时,它将被写入标准输出,而不是在不写入终端时,仅在输出缓冲器填满时写入。
如果
指定了 -w选项,则使保存的原始数据包输出``packet-buffered'';
即,在保存每个数据包时,它将被写入输出文件,而不是仅在输出缓冲区填满时才写入。
该
-U
如果标志将不被支持
的tcpdump
与旧版本的内置
的libpcap
是缺乏
pcap_dump_flush(3PCAP)
功能。
-v 输出更详细的信息,tos值、ttl值、ID值、总长度、校验值等。-vv, -vvv.
-x 用十六进制字码列出数据包资料。
解析和打印时,除了打印每个数据包的标头外,还要以十六进制格式打印每个数据包的数据(减去其链接级别标题)。 将打印整个数据包或snaplen字节中较小的一个 。请注意,这是整个链路层数据包,因此对于填充(例如以太网)的链路层,当较高层数据包短于所需填充时,也将打印填充字节。
-xx 除了打印每个数据包的标头外,还要打印每个数据包的数据,
包括 其链接级别标题,以十六进制表示。
-X 除了打印每个数据包的标题外,还要以16进制和ASCII格式打印每个数据包的数据(减去其链接级别标题)。这对于分析新协议非常方便。
-XX 除了打印每个数据包的标头外,还要以
16进制和ASCII格式打印每个数据包的数据,
包括其链接级别标题。
-# --number,
在行的开头打印一个可选的包号。
[
-B size ] --buffer-size = buffer_size
将OS捕获缓冲区大小设置为buffer_size,以KiB(1024字节)为单位。
[
-c count ] 数量,收到计数包后退出
[
-C file_size ] 检查文件大小
在将原始数据包写入保存文件之前,请检查该文件当前是否大于file_size,如果是,请关闭当前保存文件并打开一个新文件。第一个savefile之后的savefiles将使用-w 标志指定名称 ,后面带一个数字,从1开始并继续向上。file_size的单位是数百万字节(1,000,000字节,而不是1,048,576字节)。
[
-E algo:secret ] 解密数据包。
使用spi@ipaddr
algo:secret来解密发送到addr并包含安全参数索引值
spi的
IPsec
ESP数据包。可以用逗号或换行符分隔重复该组合。
请注意,此时支持为IPv4
ESP数据包设置机密。
算法可以是
des-cbc,
3des-cbc,
blowfish-cbc,
rc3-cbc,
cast128-cbc或
none。默认为des-cbc。只有在启用加密编译tcpdump的情况下才能解密数据包。
secret是ESP密钥的ASCII文本。如果前面带有0x,则将读取十六进制值。
该选项假定为RFC2406
ESP,而不是RFC1827
ESP。该选项仅用于调试目的,不鼓励使用此选项和真正的“秘密”密钥。通过在命令行上显示IPsec密钥,您可以通过ps(1)和其他场合将其显示给其他人
。
除了上面的语法之外,语法文件名可以用来让tcpdump读取提供的文件。文件在收到第一个ESP数据包后打开,所以tcpdump可能已经放弃的任何特殊权限应该已经放弃了。
[
-F file ] 指定过滤表达式所在的文件
[
-G seconds ]
- 如果指定,使得与指定的转储文件 -w 每个选项rotate_seconds秒。Savefiles将具有-w指定的名称,该名称 应包含strftime(3)定义的时间格式 。
- 如果未指定时间格式,则每个新文件都将覆盖前一个。每当生成的文件名不唯一时,tcpdump将覆盖预先存在的数据; 因此,不建议提供比捕获周期更粗糙的时间规范。
- 如果与-C 选项一起使用 ,文件名将采用` file <count>'的形式。
[
-i interface ] 指定网卡。若不指定,会使用[-D可用中]编号最小的已配置接口(不包括环回),如eth0。
[
-j tstamptype ] 将捕获的时间戳类型设置为tstamp_type。
用于时间戳类型的名称在
pcap-tstamp(7)中给出;
并非所有列出的类型都必须对任何给定的接口有效。
[
-M secret ] 使用secret作为共享密钥,使用TCP-MD5选项(RFC
2385)验证TCP段中的摘要(如果存在)。
[
--number ]
[
-Q in|out|inout ] --direction=direction选择发送/接收方向上的哪些数据包应该被捕获。可能的值是“in”,“out”和“inout”。并非适用于所有平台。
[
-r file ] 从文件读取数据包(使用-w
选项或其他编写pcap或pcapng文件的工具创建
)。如果文件是“ -
”,则使用标准输入。
[
-s snaplen ] --snapshot-length = snaplen <数据包大小>
设置每个数据包的大小。
Snarf
snaplen来自每个数据包的数据字节而不是默认值262144字节。由于快照有限而被截断的数据包在输出中用`[|proto]',其中proto
是发生截断的协议级别的名称。
请注意,拍摄较大的快照会增加处理时间,并有效地减少数据包缓冲量。这可能会导致数据包丢失。
另请注意,拍摄较小的快照会丢弃传输层上方协议的数据,这会丢失可能很重要的信息。例如,NFS和AFS请求和回复非常大,如果选择了太短的快照长度,则很多细节将不可用。
如果您需要将快照大小减小到默认值以下,则应将snaplen限制为捕获您感兴趣的协议信息的最小数量。
将snaplen设置
为0会将其设置为默认值262144,以便向后兼容最近的旧版本tcpdump的版本
。
[
--time-stamp-precision precision ]
[
--immediate-mode ]
[ -T type ] <数据包类型> 强制“ 表达式 ” 选择的数据包将被解释为指定的类型。目前已知的类型是:
-
aodv
(Ad-hoc On-demand Distance Vector protocol), Ad-hoc按需距离矢量协议
-
carp
(Common Address Redundancy Protocol), 通用地址冗余协议
-
cnfp
(Cisco NetFlow protocol), Cisco NetFlow协议
-
lmp
(Link Management Protocol), 链路管理协议
-
pgm
(Pragmatic General Multicast), 实用通用多播
-
pgm_zmtp1
(ZMTP/1.0 inside PGM/EPGM),
-
resp
(REdis Serialization Protocol), REdis序列化协议
-
radius
(RADIUS),
-
rpc
(Remote Procedure Call), 远程过程调用
-
rtp
(Real-Time Applications protocol), 实时应用程序协议
-
rtcp
(Real-Time Applications control protocol), 实时应用程序控制协议
-
snmp
(Simple Network Management Protocol), 简单网络管理协议
-
tftp
(Trivial File Transfer Protocol), 普通文件传输协议
-
vat
(Visual Audio Tool), 视觉音频工具
-
wb
(distributed White Board), 分布式白板
-
zmtp1
(ZeroMQ Message Transport Protocol 1.0), ZeroMQ消息传输协议1.0
-
vxlan
(Virtual eXtensible Local Area Network). 虚拟可扩展局域网
请注意,上面的pgm类型仅影响UDP解释,无论如何,本机PGM始终被识别为IP协议113。UDP封装的PGM通常称为“EPGM”或“PGM
/ UDP”。
请注意,上面的pgm_zmtp1类型会同时影响本机PGM和UDP的解释。在本机PGM解码期间,ODATA
/ RDATA分组的应用数据将被解码为具有ZMTP
/ 1.0帧的ZeroMQ数据报。在UDP解码期间,除了任何UDP分组之外,任何UDP分组都将被视为封装的PGM分组。
[ -V file ] 从文件中读取文件名列表。如果文件是“ - ”,则使用标准输入。
[ -w file ] 将原始数据包写入文件而不是解析并打印出来。稍后可以使用-r选项打印它们。如果文件是“ - ”,则使用标准输出。
如果写入文件或管道,则此输出将被缓冲,因此从文件或管道读取的程序在收到后可能无法在任意时间内看到数据包。使用 -U 标志可以在收到数据包后立即写入数据包。MIME类型application/vnd.tcpdump.pcap已在IANA注册pcap文件。文件扩展名.pcap 似乎是最常用的.cap和 .dmp。读取捕获文件时Tcpdump本身不检查扩展名,并且在写入时不添加扩展名(它在文件头中使用幻数)。但是,许多操作系统和应用程序将使用扩展(如果存在)并建议添加一个(例如.pcap)。有关文件格式的说明,请参阅 pcap-savefile(5)。
[ -W filecount ] 限制循环转储文件的数量
- 与-C 选项一起使用时 ,这将限制创建的文件数量达到指定的数量,并从头开始覆盖文件,从而创建一个“循环”缓冲区。此外,它会将具有足够前导0的文件命名为支持最大文件数,从而允许它们正确排序。
- 与-G 选项一起使用时 ,这将限制创建的循环转储文件的数量,在达到限制时退出状态0。
- 如果两者配合使用 -C 和 -G, 该 -W 选项将目前被忽略,并且只会影响的文件名。
[ -y datalinktype ] --linktype=datalinktype 设置要在将数据包捕获到datalinktype时使用的数据链接类型。
[
-z postrotate-command ]
与-C
或
-G
选项一起使用时
,这将使 tcpdump
运行“
postrotate-command
file ”,其中
file
是每次轮换后关闭的savefile。例如,指定
-z gzip 或
-z bzip2
将使用gzip或bzip2压缩每个savefile。
请注意,tcpdump将使用最低优先级并行执行命令,以便不会干扰捕获过程。
如果您想使用一个本身带有标志或不同参数的命令,您总是可以编写一个shell脚本,它将保存文件名作为唯一参数,制作标志和参数排列并执行您想要的命令。
[
-Z user ] --relinquish-privileges=user
如果 tcpdump的 运行作为根,打开所述捕获装置或输入SAVEFILE之后,但在打开任何savefiles输出之前,用户ID来改变 用户 和组ID的主组 用户。默认情况下,在编译时也可以启用此行为。
[
expression ]
选择要转储的数据包。如果没有
给出表达式,则网络上的所有数据包都将被转储。否则,只会转储表达式为“true”的数据包。有关表达式语法,请参阅
pcap-filter(7)。
该表达式参数可被传递给和tcpdump作为单一壳牌参数,或作为多个壳牌参数,取其更方便。通常,如果表达式包含Shell元字符,例如用于转义协议名称的反斜杠,则更容易将其作为单个引用参数传递,而不是转义Shell元字符。在解析之前,多个参数与空格连接在一起。
抓包对象
列出所有可以选择的抓包对象
$
sudo tcpdump -D
1.wlp16s0
[Up, Running]
2.lo
[Up, Running, Loopback]
3.any
(Pseudo-device that captures on all interfaces) [Up, Running]
4.enp0s25
[Up]
5.bluetooth-monitor
(Bluetooth Linux Monitor) [none]
6.nflog
(Linux netfilter log (NFLOG) interface) [none]
7.nfqueue
(Linux netfilter queue (NFQUEUE) interface) [none]
8.dbus-system
(D-Bus system bus) [none]
9.dbus-session
(D-Bus session bus) [none]
抓个包看看
$ sudo tcpdump -i
wlp16s0 -nn -X ‘port 53’ -c 1
// ‘port
53’:看看53端口的包,DNS服务
$ sudo tcpdump -i
wlp16s0 -nn -X -c 1
$ sudo tcpdump -i
wlp16s0 -nn -c 1
$ sudo tcpdump -i
wlp16s0 -nn -c 1 -e
使用表达式文件
[
-F file ] 指定过滤表达式所在的文件
$ sudo tcpdump -i eth0 -nn
-X ‘port 53′ -c 1
这里的’port
53’便叫做“过滤表达式”,当表达式比较复杂时,可以将表达式保存到文件中,使用-F调用。Like
this:
$ sudo cat filter.txt
port 53
$ sudo tcpdump -i eth0 -c
1 -t -F filter.txt
数据包的保存及查看
[
-w file ] 将原始数据包写入文件而不是解析并打印出来。
$ sudo tcpdump -i
wlp16s0 -w flowdata.txt
[
-r file ] 从文件读取数据包(使用-w
选项或其他编写pcap或pcapng文件的工具创建
)。如果文件是“ -
”,则使用标准输入。
$ sudo tcpdump -r
flowdata.txt |less
由于是按raw
packets来存储的,所以可以使用-e、-l和过滤表达式来对输出信息进行控制。
manpage里的例子:
打印所有到达或离开sundown的数据包:
$ sudo tcpdump host sundown
打印helios和hot或ace之间的流量:
$ sudo tcpdump host helios
and \( hot or ace \)
要在ace和除helios之外的任何主机之间打印所有IP数据包:
$ sudo tcpdump ip host ace
and not helios
要在伯克利打印本地主机和主机之间的所有流量:
$ sudo tcpdump net
ucb-ether
要通过互联网网关snup打印所有ftp流量:(请注意,引用该表达式是为了防止shell(错误地)解释括号):
$ sudo tcpdump 'gateway
snup and (port ftp or ftp-data)'
要打印既不是来自本地主机也不是发往本地主机的流量(如果你通往另一个网络,那么这些东西永远不应该进入你的本地网络)。
$ sudo tcpdump ip and not
net localnet
打印涉及非本地主机的每个TCP对话的开始和结束数据包(SYN和FIN数据包)。
$ sudo tcpdump
'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net
localnet'
要打印与端口80之间的所有IPv4
HTTP数据包,即仅打印包含数据的数据包,而不打印例如SYN和FIN数据包以及仅ACK数据包。(IPv6留给读者练习。)
$ sudo tcpdump 'tcp port 80
and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2))
!= 0)'
要打印通过网关snup发送的长度超过576字节的IP数据包:
$ sudo tcpdump 'gateway
snup and ip[2:2] > 576'
要打印未
通过以太网广播或多播发送的IP广播或多播数据包
:
$ sudo tcpdump 'ether[0] &
1 = 0 and ip[16] >= 224'
要打印所有不是回应请求/回复的ICMP数据包(即不ping数据包):
$ sudo tcpdump
'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
打印IP包长超过576字节的网络包
$ sudo tcpdump 'ip[2:2] >
576'
打印涉及非本地主机的每个TCP对话的开始SYN标记数据包,排除目标主机google。
$ sudo tcpdump
'tcp[tcpflags] & tcp-syn != 0 and not dst host google.com'
更多示例
协议过滤:
ether, ip, ip6, arp, tcp, udp, rarp
$ sudo tcpdump -i
wlp16s0 -c 10 'udp'
指定源或者目的地址:默认是src
or dst。
$ sudo tcpdump -i
wlp16s0 -c 10 'dst 8.8.8.8'
限定端口port;
portrange端口区域;
host; net(网络段);
$ sudo tcpdump -i
wlp16s0 -c 10 'dst port 53 or dst port 80'
指定通过网卡与某个特定服务器的数据包
$ sudo tcpdump -i
wlp16s0 -c 1 'host google.com'
只看ftp及ftp数据
$ tcpdump 'port ftp or
ftp-data'
TCP协议的SYN、ACK、FIN标识
tcp[tcpflags] &
tcp-syn
tcp[tcpflags] &
tcp-ack
tcp[tcpflags] &
tcp-fin
查看ICMP包中“目标不可达、主机不可达”的包:
icmp[0:2]==0x0301
proto就是protocol的缩写,可用的协议包括:
tcp, udp,
ip, ip6, icmp,
ether, fddi, tr,
wlan, ppp, slip, link – 链路层协议
arp, rarp, radio,
输出格式(man原文翻译)
tcpdump的输出取决于协议。以下给出了大多数格式的简要说明和示例。
⚓ 时间戳
HH:MM:ss.frac
默认情况下,所有输出行都以时间戳开头。时间戳是表单中的当前时钟时间
并且与内核的时钟一样准确。时间戳反映了内核将时间戳应用于数据包的时间。没有尝试考虑网络接口完成从网络接收分组与内核何时向分组应用时间戳之间的时间延迟;该时间延迟可能包括网络接口完成从网络接收数据包的时间与中断传递到内核以使其读取数据包的时间和内核服务于内核之间的延迟之间的延迟“新数据包”中断以及向数据包应用时间戳的时间。
链接级别标题
如果给出'-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)已更改的量。如果不是特殊情况,则打印零个或多个更改。更改由U(紧急指针),W(窗口),A(ack),S(序列号)和I(数据包ID)指示,后跟delta(+
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字节。
IPv4数据包
如果未打印链路层标头,则对于IPv4数据包,将在时间戳之后打印IP。
如果指定了-v标志,那么来自IPv4标头的信息将显示在IP或链路层标头之后的括号中。此信息的一般格式为:
tos tos, ttl ttl, id id, offset offset, flags [flags], proto proto, length length, options (options)
tos是服务领域的类型;如果ECN位非零,则将其报告为ECT(1),ECT(0)或CE。ttl是生存时间;如果它为零,则不报告。id是IP标识字段。offset是片段偏移字段;打印它是否是碎片数据报的一部分。标志是MF和DF标志;如果设置了MF,则报告+,如果设置了F,则报告DF。如果两者都没有设置,。据报道。proto是协议ID字段。length是总长度字段。选项是IP选项,如果有的话。
接下来,对于TCP和UDP数据包,将打印源和目标IP地址以及TCP或UDP端口(每个IP地址与其对应端口之间带有一个点),并使用>分隔源和目标。对于其他协议,将打印地址,并使用>分隔源和目标。之后将打印更高级别的协议信息(如果有)。
对于分段的IP数据报,第一个片段包含更高级别的协议头;第一个之后的片段不包含更高级别的协议头。如上所述,将在IP报头信息中仅使用-v标志打印分段信息。
TCP数据包
(注意:以下描述假定您熟悉RFC-793中描述的TCP协议。如果您不熟悉该协议,则此描述对您没有多大用处。)
TCP协议线的一般格式是:
src > dst: Flags [tcpflags], seq data-seqno, ack ackno, win window, urg urgent, options [opts], length len
Src和dst是源和目标IP地址和端口。Tcpflags是S(SYN),F(FIN),P(PUSH),R(RST),U(URG),W(ECN CWR),E(ECN-Echo)或“。”的某种组合。(ACK),如果没有设置标志,则为“none”。Data-seqno描述了该数据包中数据所覆盖的序列空间部分(参见下面的示例)。Ackno是预期此连接上另一个方向的下一个数据的序列号。Window是此连接上另一个方向可用的接收缓冲区空间的字节数。Urg表示数据包中存在“紧急”数据。OPTS是TCP选项(例如,MSS 1024)。莱恩是有效载荷数据的长度。
Iptype,Src,dst和flags总是存在。其他字段取决于数据包的TCP协议头的内容,仅在适当时输出。
这是从主机rtsg到主机csam的rlogin的开头部分。
IP rtsg.1023 > csam.login: Flags [S], seq 768512:768512, win 4096, opts [mss 1024] IP csam.login > rtsg.1023: Flags [S.], seq, 947648:947648, ack 768513, win 4096, opts [mss 1024] IP rtsg.1023 > csam.login: Flags [.], ack 1, win 4096 IP rtsg.1023 > csam.login: Flags [P.], seq 1:2, ack 1, win 4096, length 1 IP csam.login > rtsg.1023: Flags [.], ack 2, win 4096 IP rtsg.1023 > csam.login: Flags [P.], seq 2:21, ack 1, win 4096, length 19 IP csam.login > rtsg.1023: Flags [P.], seq 1:2, ack 21, win 4077, length 1 IP csam.login > rtsg.1023: Flags [P.], seq 2:3, ack 21, win 4077, urg 1, length 1 IP csam.login > rtsg.1023: Flags [P.], seq 3:4, ack 21, win 4077, urg 1, length 1
第一行说rtsg上的TCP端口1023将数据包发送到csam上的端口登录。在小号表明SYN标志设置。数据包序列号为768512,不包含任何数据。(符号是'first:last',表示`序列号首先到但不包括last'。)没有背负的ack,可用的接收窗口是4096字节,并且有一个max-segment-size选项请求一个1024字节的mss。
Csam回复了一个类似的数据包,除了它包含rtsg的SYN的背驮式ack。Rtsg然后acks csam的SYN。'。'表示已设置ACK标志。数据包不包含数据,因此没有数据序列号或长度。注意,ack序列号是一个小整数(1)。第一次tcpdump看到TCP“会话”时,它会打印数据包中的序列号。在随后的会话分组中,打印当前分组的序列号与该初始序列号之间的差异。这意味着第一个之后的序列号可以被解释为对话数据流中的相对字节位置(每个方向的第一个数据字节为“1”)。`-S'将覆盖此功能,导致输出原始序列号。
在第6行,rtsg发送csam 19字节的数据(在会话的rtsg→csam一侧的字节2到20)。PUSH标志在数据包中设置。在第7行,csam表示接收到的数据由rtsg发送但不包括字节21.大多数数据显然都位于套接字缓冲区中,因为csam的接收窗口缩小了19个字节。Csam还将一个字节的数据发送到此数据包中的rtsg。在第8行和第9行,csam将两个字节的紧急推送数据发送到rtsg。
如果快照足够小以至于tcpdump没有捕获完整的TCP标头,它会尽可能多地解释标头,然后报告``tcp]''表示无法解释余数。如果标题包含一个伪造的选项(一个长度太小或超出标题末尾的选项),tcpdump会将其报告为“[bad opt]”并且不会解释任何其他选项(因为它无法分辨)他们开始的地方)。如果标题长度表示存在选项,但IP数据报长度不足以使选项实际存在,则tcpdump将其报告为“[bad hdr length]”。
使用特定标志组合捕获TCP数据包(SYN-ACK,URG-ACK等)
TCP报头的控制位部分有8位:
- CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
假设我们想要观察用于建立TCP连接的数据包。回想一下TCP在初始化新连接时使用3次握手协议;关于TCP控制位的连接顺序是
- 1)来电者发送SYN
- 2)收件人用SYN,ACK响应
- 3)呼叫者发送ACK
现在我们对捕获仅设置了SYN位的数据包感兴趣(步骤1)。请注意,我们不希望来自步骤2(SYN-ACK)的数据包,只是简单的初始SYN。我们需要的是tcpdump的正确过滤器表达式。
回想一下没有选项的TCP头的结构:
0 15 31
-----------------------------------------------------------------
| source port | destination port |
-----------------------------------------------------------------
| sequence number |
-----------------------------------------------------------------
| acknowledgment number |
-----------------------------------------------------------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
-----------------------------------------------------------------
| TCP checksum | urgent pointer |
-----------------------------------------------------------------
除非存在选项,否则TCP标头通常包含20个八位字节的数据。图的第一行包含八位字节0-3,第二行显示八位字节4-7等。
从0开始计数,相关的TCP控制位包含在八位字节13中:
0 7| 15| 23| 31
----------------|---------------|---------------|----------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
----------------|---------------|---------------|----------------
| | 13th octet | | |
让我们仔细看看octet no。13:
| | |---------------| |C|E|U|A|P|R|S|F| |---------------| |7 5 3 0|
这些是我们感兴趣的TCP控制位。我们将此八位位组中的位从0到7,从右到左编号,因此PSH位为3位,而URG位为5。
回想一下,我们想要捕获只有SYN集的数据包。让我们看看如果TCP数据报到达其标头中的SYN位,那么八位字节13会发生什么:
|C|E|U|A|P|R|S|F| |---------------| |0 0 0 0 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|
查看控制位部分,我们看到只设置了位号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会发生什么:
|C|E|U|A|P|R|S|F| |---------------| |0 0 0 1 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|
现在位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,因此我们将使用SYN的二进制值逻辑AND第13个八位字节中的值:
00010010 SYN-ACK 00000010 SYN AND 00000010(我们想要SYN)和00000010(我们想要SYN) -------- -------- = 00000010 = 00000010
我们看到,无论是否设置了ACK或其他TCP控制位,此AND操作都会产生相同的结果。AND值的十进制表示以及此操作的结果为2(二进制00000010),因此我们知道对于具有SYN集的数据包,以下关系必须为true:
- ((八位组13的值)和(2))==(2)
这指向了tcpdump过滤器表达式
- tcpdump -i xl0 'tcp [13] & 2 == 2'
一些偏移和字段值可以表示为名称而不是数值。例如,tcp [13]可以用tcp [tcpflags]替换。以下TCP标志字段值也可用:tcp-fin,tcp-syn,tcp-rst,tcp-push,tcp-ack,tcp-urg。
这可以证明如下:
- tcpdump -i xl0 'tcp[tcpflags] & tcp-push != 0'
请注意,您应该在表达式中使用单引号或反斜杠来隐藏shell中的AND('&')特殊字符。
UDP数据包
这种rwho数据包说明了UDP格式:
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协议头。查询操作是正常的,查询,所以省略了运算字段。如果op是其他任何东西,它将被打印在'3'和'+'之间。类似地,qclass是正常的,C_IN,并且被省略。在'A'之后立即打印任何其他qclass。
检查一些异常并可能导致用方括号括起来的额外字段:如果查询包含答案,权限记录或附加记录部分,则ancount,nscount或arcount打印为“[na]”,“[nn ]'或`[nau]'其中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的查询ID 3,其中包含3个答案记录,3个名称服务器记录和7个附加记录。第一个答案记录是A型(地址),其数据是因特网地址128.32.137.3。响应的总大小为273个字节,不包括UDP和IP头。省略了op(查询)和响应代码(NoError),以及A记录的类(C_IN)。
在第二个示例中,helios使用不存在的域(NXDomain)的响应代码响应查询2,没有答案,一个名称服务器并且没有权限记录。“*”表示权威答案位已设置。由于没有答案,因此没有打印任何类型,类别或数据。
可能出现的其他标志字符是“ - ”(递归可用,RA,未设置)和“|”(截断消息,TC,设置)。如果`question'部分不包含一个条目,则打印`[nq]'。
SMB / CIFS解码
tcpdump现在包括对UDP / 137,UDP / 138和TCP / 139上的数据进行相当广泛的SMB / CIFS / NBT解码。还完成了对IPX和NetBEUI SMB数据的一些原始解码。
默认情况下,完成相当小的解码,如果使用-v,则执行更详细的解码。请注意,使用-va单个SMB数据包可能占用一页或更多页面,因此如果您真的需要所有血腥细节,请仅使用-v。
有关SMB数据包格式的信息以及所有字段的含义,请参阅您最喜爱的samba.org镜像站点上的www.cifs.org或pub / samba / specs /目录。SMB补丁由Andrew Tridgell(tridge@samba.org)编写。
NFS请求和回复
Sun NFS(网络文件系统)请求和回复打印为:
src.sport > dst.nfs: NFS request xid xid len op args src.nfs > dst.dport: NFS reply xid xid reply stat len op results sushi.1023 > wrl.nfs: NFS request xid 26377 112 readlink fh 21,24/10.73165 wrl.nfs > sushi.1023: NFS reply xid 26377 reply ok 40 readlink "../var" sushi.1022 > wrl.nfs: NFS request xid 8219 144 lookup fh 9,74/4096.6878 "xcolors" wrl.nfs > sushi.1022: NFS reply xid 8219 reply ok 128 lookup fh 9,74/4134.3150
在第一行,主机寿司发送带有ID的交易26377至WRL。请求是112个字节,不包括UDP和IP头。该操作是文件句柄(fh)21,24 / 10.731657119上的readlink(读取符号链接)。(如果幸运的话,就像在这种情况下,文件句柄可以被解释为主要的次要设备号对,然后是inode号和世代号。)在第二行中,wrl用相同的事务回复“ok” id和链接的内容。
在第三行中,sushi请求(使用新的事务id)wrl在目录文件9,74 / 4096.6878中查找名称`xcolors'。在第四行中,wrl发送带有相应事务id的回复。
请注意,打印的数据取决于操作类型。如果与NFS协议规范一起阅读,则该格式旨在自我解释。另请注意,旧版本的tcpdump以稍微不同的格式打印NFS数据包:将打印事务ID(xid)而不是数据包的非NFS端口号。
如果给出-v(详细)标志,则打印附加信息。例如:
sushi.1023 > wrl.nfs: NFS request xid 79658 148 read fh 21,11/12.195 8192 bytes @ 24576 wrl.nfs > sushi.1023: NFS reply xid 79658 reply ok 1472 read REG 100664 ids 417/0 sz 29388
(-v还打印IP头TTL,ID,长度和碎片字段,这些字段已在本例中省略。)在第一行中,sushi要求wrl从文件21,11 / 12.195读取8192个字节,字节偏移量24576.Wrl回复'ok';第二行显示的数据包是应答的第一个片段,因此只有1472个字节长(其他字节将跟随后续片段,但这些片段没有NFS甚至UDP头,所以可能不会打印,取决于使用的过滤器表达式)。因为给出了-v标志,所以打印了一些文件属性(除文件数据外还返回):文件类型(常规文件的“REG”),文件模式(八进制), uid和gid以及文件大小。
如果多次给出-v标志,则会打印更多详细信息。
NFS回复数据包未明确标识RPC操作。相反,tcpdump会跟踪“最近”的请求,并使用事务ID将它们与回复相匹配。如果答复没有严格遵循相应的请求,则可能无法解析。
AFS请求和回复
Transarc AFS(安德鲁文件系统)请求和回复打印为:
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数据包到pike。这是到fs(文件服务器)服务的RX数据包,并且是RPC调用的开始。RPC调用是重命名,旧目录文件ID为536876964/1/1,旧文件名为`.newsrc.new',新目录文件ID为536876964/1/1,新文件名为`。 newsrc”。主机派克响应重命名调用的RPC回复(这是成功的,因为它是一个数据包而不是中止数据包)。
通常,所有AFS RPC至少由RPC调用名称解码。大多数AFS RPC至少有一些参数被解码(通常只有“有趣的”参数,对于某些有趣的定义)。
该格式旨在自我描述,但对于不熟悉AFS和RX工作的人可能没有用。
如果给出两次-v(详细)标志,则打印确认包和附加标题信息,例如RX呼叫ID,呼叫号,序列号,序列号和RX分组标志。
如果给出-v标志两次,则打印附加信息,例如RX呼叫ID,序列号和RX包标志。还从RX ack分组打印MTU协商信息。
如果给出-v标志三次,则打印安全性索引和服务标识。
为中止数据包打印错误代码,但Ubik信标数据包除外(因为中止数据包用于表示Ubik协议的是投票)。
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网络的名称。第三行给出了特定主机的名称(主机与数字中的第3个八位字节区分开来 - 网络号必须有两个八位字节,主机号必须有三个八位字节。)数字和名称应该分开通过空格(空格或制表符)。该/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主机/网络号的条目,则地址以数字形式打印。)在第一个示例中,网络144.1上的NBP(DDP端口2)节点209发送到正在监听网络节点112的端口220的任何内容。除了源节点的全名已知(“办公室”)之外,第二行是相同的。第三行是从net 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
第一行是由net icsd主机112发送并在网络jssmag上广播的激光写入器的名称查找请求。查找的nbp id是190.第二行显示来自主机jssmag.209的此请求的回复(请注意它具有相同的id),表示它在端口250上注册了名为“RM1140”的激光编写器资源。 line是对同一请求的另一个回复,称主机techpit在端口186上注册了laserwriter“techpit”。
ATP数据包格式:
jssmag.209.165 > helios.132: atp-req 12266<0-7> 0xae030001 helios.132 > jssmag.209.165: atp-resp 12266:0 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:1 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:2 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:4 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:6 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp*12266:7 (512) 0xae040000 jssmag.209.165 > helios.132: atp-req 12266<3,5> 0xae030001 helios.132 > jssmag.209.165: atp-resp 12266:3 (512) 0xae040000 helios.132 > jssmag.209.165: atp-resp 12266:5 (512) 0xae040000 jssmag.209.165 > helios.132: atp-rel 12266<0-7> 0xae030001 jssmag.209.133 > helios.132: atp-req* 12267<0-7> 0xae030002
Jssmag.209通过请求最多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(“恰好一次”)。