作者:牛小宝
tcpdump是一款非常强大的网络抓包工具,可以在网络问题的分析中提供很多有用的信息,适用场景丰富。tcpdump的使用简单易上手,它的命令格式如下:
tcpdump [-adeflnNOpqStvx][-c<数据包数目>][-dd][-ddd][-F<表达文件>][-i<网络界面>][-r<数据包文件>][-s<数据包大小>][-tt][-T<数据包类型>][-vv][-w<数据包文件>][输出数据栏位]
其他常用参数的说明:
-c:指定要抓取的包数量;
-i interface:指定tcpdump需要监听的接口
-n:对地址以数字方式显式,否则显式为主机名,也就是说-n选项不做主机名解析。
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名。
-s: <数据包大小> 设置每个数据包的大小。
-N:不打印出host的域名部分。。
-P:指定要抓取的包是流入还是流出的包。可以给定的值为"in"、"out"和"inout",默认为"inout"。
-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,长度设置不够可能会产生包截断,若出现包截断,
-e:输出的每行中都将包括数据链路层头部信息,例如源MAC和目标MAC。
-q:快速打印输出。即打印很少的协议相关信息,从而输出行都比较简短。
-X:输出包的头部数据,会以16进制和ASCII两种方式同时输出。
-XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
-v:当分析和打印的时候,产生详细的输出。
-vv:产生比-v更详细的输出。
-vvv:产生比-vv更详细的输出。
-w<数据包文件> 把数据包数据写入指定的文件。
常用关键字说明:
host(缺省类型): 指明一台主机
net: 指明一个网络地址
port: 指明端口号
src: 指定网络源地址
dst: 指定目标网络地址;
tcpdump的参数虽多,但在使用过程中有几种常用的写法:
tcpdump -i eth0 net 59.111.243.17
对网卡eth0进行抓包,并且只抓所有进入和离开网络地址59.111.243.17的包
tcpdump –i eth0 net 59.111.243.17 and src port 80
对网卡eth0进行抓包,并且只抓所有进入和离开网络地址59.111.243.17的包,且源端口号为80;
tcpdump -i eth0 net 59.111.243.17 -c 10000 -w temp.pcap
对网卡eth0进行抓包,并且只抓所有进入和离开网络地址59.111.243.17的包,抓包个数指定为10000个,并写入temp.pcap
上面最后一个命令已经将tcpdump的包写入temp.pcap文件,接下来就需要对tcpdump进行分析。wireshark是当下最流行的网络分析工具,可以截取各种网络封包,显示网络封包的详细信息。使用wireshark可以直接打开pcap文件,打开tcpdump后如下图界面所示:
对于wireshark的指标说明这里不再赘述,可以参考博文:http://www.cnblogs.com/tankxiao/archive/2012/10/10/2711777.html
用wireshark分析tcpdump包主要是为了发现网络上的异常,所以需要重点关注异常数据,在了解异常状态之前,我们先来弄清两个很重要的概念:seq和ack,只有清楚seq和ack的变化关系,才能判断乱序,重传等异常状态;
seq和ack的概念我们在TCP建连的三次握手中已经说到无数次,但他们不仅仅在三次握手中出现,建立连接后仍在数据传输中充当重要的角色:
seq:为当前端成功发送的数据位数;
ack:为当前端成功接收的数据位数;
假如三次握手建立连接后,A发给B的数据为100B,B返回给A的数据是50B,那么A下一个发给B的请求包中seq为101,ack为51,为什么会比发送或者接口的数据多1位,因为建立连接后请求的发送会带有ack标志位,而且TCP报文种ACK位占1位。
下面介绍几种异常的状态:
在TCP传输过程中,同一台主机发出的数据段应该是连续的,即后一个包的seq号等于前一个包的seq + len(数据位数)(三次握手和四次挥手是例外)。如果Wireshark发现后一个包的Seq号大于前一个包的Seq Len,就说明中间有一段数据的缺失,会进行异常提示;
感觉seq的生成规则,正常报文传输,seq应该是一直增加的,假如一个包的seq小于前一个包的seq+len,则说明出现了顺序混乱的情况,即乱序;
当乱序或者丢包发生时,接收方会收到一些Seq号比期望值大的包。它每收到一个这种包就会Ack一次期望的Seq值,以此方式来提醒发送方,于是就产生了一些重复的Ack
如果一个包真的丢了,又没有后续包可以在接收方触发[Dup Ack],就不会快速重传。这种情况下发送方只好等到超时了再重传,此类重传包就会被Wireshark标上[TCP Retransmission]。
当发送方收到3个或以上[TCP Dup ACK],就意识到之前发的包可能丢了,于是快速重传它(这是RFC的规定)。
网易云产品免费体验馆,无套路试用,零成本体验云计算价值。
本文来自网易实践者社区,经作者牛小宝授权发布