linux中tcpdump的详细用法( 三 )

(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文件 , 方便用ethereal(即wireshark)分析
tcpdump 对截获的数据并没有进行彻底解码 , 数据包内的大部分内容是使用十六进制的形式直接打印输出的 。显然这不利于分析网络故障 , 通常的解决办法是先使用带-w参数的tcpdump截获数据并保存到文件中 , 然后再使用其他程序(如Wireshark)进行解码分析 。当然也应该定义过滤规则 , 以避免捕获的数据包填满整个硬盘 。
对于复杂的 pcap , 例如 , 其中包含了上百个 IP 地址、上千个端口、上万个连接的 pcap ,  通过 tcpdump 看输出可能就比较低效了 。
这时 , wireshark 这样带图形用户界面 , 且功能强大的网 络流分析工具就派上了用场 。
wireshark 支持强大的过滤功能 , 支持按 IP、端口、协议、连接、TCP flag 以及它们的各 种组合进行过滤 , 然后进行分析 , 大大节省网络排障的时间 。
wireshark 官方维护了一个 sample pcap列表
使用技巧:
wireshark导入pcap文件,我们可以看到有TCP Retransmission的情况 , 右键=>跟踪流=>TCP流 就可以只看跟这个链接相关的流

linux中tcpdump的详细用法

文章插图
 
从结果我们看到 , 由于没有ack包回复 , 触发客户端 TCP 超时重传
TCP 重传的机制:指数后退 , 比如第一次等待 1s , 第二次等 待 2s , 第三次等待 4s , 第四次 8s , 5次重传后链接超时
从这个抓包文件看 , 这次连接没有建立起来 , client 没有收到 server 的应答包 。要跟进这个问题 , 就需要在 server 端一起抓包 , 看应答包是否有发出来。
TCPDUMP技巧
[技巧一]使用-A选项 , 则tcpdump只会显示ASCII形式的数据包内容 , 不会再以十六进制形式显示;[技巧二]使用-XX选项 , 则tcpdump会从以太网部分就开始显示网络包内容 , 而不是仅从网络层协议开始显示 。[技巧三]使用tcpdump -D 则tcpdump会列出所有可以选择的抓包对象 。[技巧四]如果想查看哪些ICMP包中“目标不可达、主机不可达”的包 , 请使用这样的过滤表达式:icmp[0:2]==0x0301[技巧五]要提取TCP协议的SYN、ACK、FIN标识字段 , 语法是:tcp[tcpflags] & tcp-syntcp[tcpflags] & tcp-acktcp[tcpflags] & tcp-fin[技巧六]要提取TCP协议里的SYN-ACK数据包 , 不但可以使用上面的方法 , 也可以直接使用最本质的方法:tcp[13]==18[技巧七]如果要抓取一个区间内的端口 , 可以使用portrange语法:tcpdump -i eth0 -nn 'portrange 52-55' -c 1 -XX

【linux中tcpdump的详细用法】


推荐阅读