tcpdump:网络协议栈“釜底抽薪”
小E:网络协议栈干什么用的?
太好解释了。信件包的信封邮票,包裹包的袋子箱子快递单,网络协议栈干的是邮递员、分拣员的活,大物件不能散了,小物件不能丢了,各家的快递还得找到各家,有的快递里三层外三层算是加密,有时候还要收费算是计费功能吧。
下图所示为通信网络协议栈的示意,tcpdump是从第1层与第2层之间的接口上复制的数据,最底层的包裹的最严实,所有的网络数据都在这里,真正的“釜底抽薪”。
tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ]
[ -i interface ] [ -r file ] [ -s snaplen ]
[ -T type ] [ -w file ] [ expression ]
-a //试着 把 网络和广播地址 转换成 名称.
-c //当 收到 count 数量 的报文 后 退出.
-d //把 编译好的 报文匹配代码 (packet-matching code) 翻译成 可读形式, 传往 标准输出, 然后退出.
-dd //把 报文匹配代码 (packet-matching code) 以 C 程序片断 的 形式 输出.
-ddd //把 报文匹配代码 (packet-matching code) 以 十进制数 形式 输出 (前面 加上 总数).
-e //显示 链路层报头.
-f //以 数字形式 显示 '外部的' 互联网地址, 而不是 字符形式 (这个 选项 用来 绕开 脑壳坏光的 SUN 黄页服务器 的 问题 — 一般说来 当它 翻译 外部网络 的 数字地址 时 会长期挂起).
-F //把 file 的内容 用作 过滤表达式. 忽略 命令行 上 的 表达式.
-i //监听 interface. 如果 不指定 接口, tcpdump 在 系统 的 接口 清单 中, 寻找 号码最小, 已经 配置好的 接口 (loopback 除外). 选中的时候 会 中断 连接.
-l //行缓冲 标准输出. 可用于 捕捉 数据 的 同时 查看 数据. 例如,
``tcpdump -l | tee dat'' or ``tcpdump -l > dat & tail -f dat''.
-n //不要把 地址 转换成 名字 (指的是 主机地址, 端口号等)
-N //不显示 主机名字 中的 域名 部分. 例如, 如果 使用 这个 选项, tcpdump 只显示 ``nic'', 而不是 ``nic.ddn.mil''.
-O //禁止运行 报文匹配代码 的 优化器. 这个选项 只有 当你 怀疑 优化器 有 bug 时 才有用.
-p //禁止 把 接口 置成 promiscuous(杂凑) 模式. 注意, 接口 有可能 因 其他原因 而 处于 promiscuous 模式; 因此, '-p' 不能 作为 `ether host {local-hw-addr} 或 ether broadcast' 的 简写.
-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 (远程过程调用 Remote Procedure Call), rtp (实时应用协议 Real-Time Applications protocol), rtcp
(实时应用控制协议 Real-Time Applications control protocol), vat (可视音频工具 Visual Audio Tool), 和 wb (分布式白板 distributed White Board).
-S //显示 绝对的, 而不是 相对的 TCP 流序号.
-t //禁止 显示 时戳标志.
-tt //显示 未格式化的 时戳标志.
-v //(稍微多一点) 繁琐的输出. 例如, 显示 IP 数据报 中的 生存周期 和 服务类型.
-vv //更繁琐的输出. 例如, 显示 NFS 应答报文 的 附加域.
-w //把 原始报文 存进 file, 不做 分析 和 显示. 它们 可以 以后 用 -r 选项 显示. 如果 file 是 ``-'', 就 写往 标准输出.
直接将包写入文件中(即原始包,如果使用 重定向 > 则只是保存显示的结果,而不是原始文件)
-x //以 16 进制数 形式 显示 每一个 报文 (去掉链路层报头后) . 可以 显示 较小的 完整 报文, 否则 只 显示 snaplen (96)个 字节 .
//较新的还有以下好用的命令
-X //需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示)
-vvv //更详细的输出
//一些关键字 用''引起来
src , dst , port , tcp , udp , fddi , ip , arp , rarp
重剑无锋 大巧不工