一般能抓到的每个包(称为“帧”更准确,但是出于表达习惯,本书可能会经常用“包”代替“帧”和“分段”)的最大长度为1514字节,启用了Jumbo Frame(巨型帧)之后可达9000字节以上,而大多数时候我们只需要IP头或者TCP头就足够分析了。在Wireshark上可以这样抓到包头。
新版本的wireshark(2.x以后)的Options对话框变化比较大,限制单包的方法是:捕获->选项,找到要抓包的接口,选中它,找到列表标题中的捕获长度(B),单击对应栏,发现变为可输出状态,在这里输入限制的单包大小即可(同旧版本的Limi each packet to)"Limit each packet to"的值。
一般设个偏大的数字:80字节,也就是说每个包只抓前80字节。这样TCP层、网络层和数据链路层的信息都可以包括在内。
如果问题涉及应用层,就应该再加上应用层协议头的长度。如果你像我一样经常忘记不同协议头的长度,可以输入一个大点的值。即便设成200字节,也比1514字节小多了。
用tcpdump命令抓包时可以用"s"参数达到相同效果。比如以下命令只抓etho上每个包的前80字节,并把结果存到/tmp/tcpdump.cap文件中。
[root@server/]#tcpdump -i eth0 -s 80 -w /tmp/tcpdump.cap
可以在开始捕获之前应用捕获过滤器,这样就可以过滤掉不需要的数据包
用tcpdump命令抓包时,也可以用"host"参数达到相同效果。比如以下命令只抓与1.1.1.1通信的包,并把结果存到/tmp/tepdump.cap文件中。
[root@server-1/]#tcpdump -i eth0 host 1.1.1.1 -w /tmp/tcpdump.cap
注意:设置过滤捕获器之前务必三思,以免把有用的包也过滤掉,尤其是容易被忽略的广播包。当然有时候再怎么考虑也会失算,比如我有一次把对方的IP地址设为filter,结果一个包都没抓到。最后只能去掉filter再抓,才发现是NAT(网络地址转换)设备把对方的IP地址改掉了。
抓的包除了要小,最好还能为每步操作打上标记。这样的包一目了然,赏心悦目。比如
要在Windows上抓一个包含三步操作的问题,我会这样抓。
ping -n 1-l 1
ping -n 1-l 2
ping -n 1-l 3
ping -n 1-l 4
byte的数目表示是第几步,这样就算在步骤很多的情况下也不会混乱。
我经常需要参照服务器上的日志时间,找到发生问题时的网络包。所以就把Wireshark的时间调成跟服务器一样的格式。
单击视图->时间显示格式->选择对应的时间格式,就可以实现此设置。
不同类型的网络包可以自定义颜色,比如网络管理员可能会把OSPF等协议或者与Spanning Tree Protocol(生成树协议)相关的网络包设成最显眼的颜色。
而文件服务器的管理员则更关心FTP,SMB和NFS协议的颜色。我们可以通过视图->着色规则来设置颜色。
如果已经有一套非常适合你工作内容的配色方案,可以请从导出,然后导入到你的Wireshark里。
更多的设置可以在编辑->首选项窗口中完成。
这个窗口的设置精度可以达到一些协议的细节。比如在此窗口单击Protocols-->TCP就可以看到多个TCP相关选项,将鼠标停在每一项上都会有详细介绍。假如经常要对Sequence Number做加减运算,不妨选中Relative sequence numbers,这样会使Sequence number看上去比实际小很多。
很多时候,解决问题的过程就是层层过滤,直至找到关键包。前面已经介绍过抓包时的Capture Filter功能了。其实在包抓下来之后,还可以进一步过滤,而且这一层的过滤功能更加强大。
要说过滤的作用与技巧,就算专门写一本小册子都不为过。篇幅所限,本文只能“过滤”出最适合初学者的部分。
最简单的用法就是直接输入要过滤的协议,比如直接输入arp就会过滤出arp的数据包
IP地址加port号是最常用的过滤方式。除了手工输入ip.addreq P地址>
&& tcporteq <端口号>之类的过滤表达式。
Wireshark还提供了更快捷的方式:右键单击感兴趣的包,选择追踪流(选择TCP还是UDP要视传输层协议而定)
就可以自动过滤,而且该Stream的对话内容会在新弹出的窗口中显示出来。
经常有人在论坛上问,Wireshark是按照什么过滤出一个TCP/UDP Stream的?
答案就是:两端的IP加port。
单击Wireshark的统计->Conversations,再单击TCP或者UDP标签就可以看到所有的Stream。
我们有时因为Wireshark而苦恼,并不是因为它功能不够,而是强大到难以驾驭。比如在过滤时,有成千上万的条件可供选择,但怎么写才是合乎语法的?虽然http://www.wireshark.org/docs/dfref/提供了参考,但经常查找毕竟太费时费力了。
Wireshark考虑到了这个需求,右键单击Wireshark上感兴趣的内容,然后选择作为过滤器应用->选中,就会在Fiter 中自动生成过滤表达式。在有复杂需求的时候,还可以选择And,Or等选项来生成一个组合的过滤表达式。
有些类型的问题,我们根本不需要研究包里的细节,直接交给Wireshark分析就行了。
1.单击Wireshark的分析->专家信息,就可以在不同标签下看到不同级别的提示信息。比如重传的统计、连接的建立和重置统计,等等。在分析网络性能和连接问题时,我们经常需要借助这个功能。
2.单击统计->Service Response Time,再选定协议名称,可以得到响应时间的统计表。我们在衡量服务器性能时经常需要此统计结果。
3.单击统计->TCP 流图形,可以生成几类统计图。
4.单击统计->捕获文件属性,可以看到一些统计信息,比如平均流量等,这有助于我们推测负载状况。比如图中的网络包才35kbit/s,说明流量低得很。
5.可以通过统计->流量图更为直观的看到通信的过程
可以先编写一个过滤的规则
在流量图窗口选择限制显示过滤器就可以看到两个IP直接的通信了
与很多软件一样,Wireshark也可以通过"Control+F"搜索关键字。假如我们怀疑包里含有"error"一词,就可以按下"Control+F"之后选中"String",单选按钮,然后在Filter中输入"error"进行搜索,很多应用层的错误都可以靠这个方法锁定问题包。
进入编辑->首选项->Name Resolution->resolve network(IP) addresses将IP地址解析为域名
文章整理自《wireshark网络分析就这么简单》