Wireshark是一款图形界面的网络嗅探器,支持多种平台,是网络流量分析的利器。在日常工作中抓包分析往往是解决根本问题的最有效手段。最近刚把《Wireshark网络分析就是这么简单》看完,写的很有意思,把一些心得和技巧分享一下。
IP TCP协议
在正式开始抓包分析前先简单介绍下我们抓包中最常碰到的IP、TCP协议的头部信息。
IP头部
• 版本号(4位):v4、v6
• 首部长度(4位):4比特是15,每1位代表4个字节32位一行,所以IP头部最长60个字节,固定长度20字节,选项最多40字节
• TOS位(8位):前三位IP优先级中间四位表示TOS最后一位保留。中间四位各位被置1的意思:最小的延时、最大的吞吐量、最高的可靠性、最小的开销
• 总长度(16位):211=65535字节
• 标识(16位):标识一个数据包。
• 标志(3位):第一位DF第二位第三位保留。DF(Don't Fragment)置1表示中间路由器遇到要分片的数据包直接丢掉发送一个ICMP消息(这个消息在源端会显示一个M),MF(More Fragment)置1表示被分片数据包不是最后一个分片。
• 片偏移(13位):标识被分片数据包的顺序。
• TTL(8位):防止路由环路时网络上出现过多数据包,每跳路由器-1。
• 协议位(8位):标识每个数据包下一个头部是什么,1为ICMP,TCP为6,17为UDP。
首部校验和(16位):校验头部完整性
•每个TCP包都会包含发送端口和接收端口,用来确定发端和收端的应用进程。五元组(源IP、目标IP、协议号、源端口、目的端口)唯一确定一个session。
•一个IP地址跟一个端口号称为一个插口对。
•序号是指数据部分第一个比特的序号。序号是一个32比特的无符号数。一个SYN包和一个FIN包分别消耗一个序号。
•确认序号是上次成功收到数据的序号+1。AB两端传输数据,A收到B传过来的上个数据包的序号为300,这个数据包的确认序号就是301,表示我下一个想收的数据包是序号为301 的数据包。确认序号指的是期待的收到下个数据包的序号。只有ACK标志位置1才有效。
•ACK包不占用任何序号,除了建立连接的第一个SYN包,其余包的ACK标志位都被置1。
•TCP为应用层提供全双工服务。连接每一端必须对两个方向维护序号。
•TCP没有选择性确认或者否认的功能。
•TCP的首部长度跟IP的类似都是4位表示TCP头部长度最长只能有60个字节,标准长度20字节,剩下40个字节在选项 。
•TCP有6个标志位,可以同时多个置1。
•window size是每一方都会提供的,这是一个流量控制技术。由数据接收方确定,这个字段是告诉发送方可以发送多少数据而未经确认。(接收方流控)
•校验和强制,覆盖TCP头部和数据,计算方法跟UDP一样要加伪首部计算。
•紧急指针, 仅当URG位为1的时候才有效。计算方法是把序号加上这个位置的序号表示紧急数据的最后一字节。起始在哪只有应用程序知道。
•最长报文段大小MSS(常见可选项),指明每次能接收的最大报文段大小。指数据部分不含TCP头部,UCP头部。
•数据也是可选的。TCP包可以不发数据
开始抓包
Wireshark是一款免费软件,可以在官网https://www.wireshark.org/ download.html 下载相应版本进行安装。在拿到一个网络包时,我们总希望它尽可能小。因为操作一个大包相当费时,有时甚至会死机。所以抓包时应该尽量只抓必要的部分。可以通过以下设置对包的长度进行过滤,按下图配置则表示只抓取每个数据包前200个字节。
Wireshark的默认设置堪称友好,但是在不同场景下通常需要对时间显示格式进行调整。
过滤
很多时候,解决问题的过程就是层层过滤,直至找到关键包。Wireshark提供了强大的过滤功能,方便我们可以快速找到相关的报文,要说过滤的作用与技巧,就算专门写一本小册子都不为过,这里只是列出了一些常用的过滤表达式以及示例。
过滤ip地址为163.177.93.254且tcp端口号等于443的数据包:
追踪该数据包的完整tcp会话:
过滤IP:
IP源地址:ip.src ==192.168.1.1
IP目的地址:ip.dst== 192.168.1.1
IP地址(包括源和目的):ip.addr== 192.168.1.1
过滤端口:
TCP端口:tcp.port==80
TCP目的端口:tcp.dstport == 80
TCP源端口:tcp.srcport == 80
UDP端口:udp.port eq 15000
TCP 1-80之间的端口:tcp.port >= 1 and tcp.port <= 80
过滤协议:
http、tcp、udp、arp、icmp、http、smtp、ftp、dns 等。
过滤MAC地址:
源MAC地址:eth.src==A0:00:00:04:C5:84
目的MAC地址:eth.dst==A0:00:00:04:C5:84
MAC地址(包括源和目的):eth.addr==A0:00:00:04:C5:84
过滤包长度:
整个UDP数据包:udp.length==20
TCP数据包中的IP数据包:tcp.len>=20
整个IP数据包:ip.len==20
整个数据包:frame.len==20
自动分析
Wireshark有强大的统计分析功能,可以帮助分析人员快速统计出一些基本信息。比如点击分析-->专家信息,就可以看到数据包的中的一些不同级别的信息统计,包含重传次数、链接建立次数、网络错误等,在分析网络性能时这个功能很有作用。
Wireshark做为一个强大的工具箱,可以通过其强大的过滤及分析功能辅助我们进行问题分析。但是能否解决问题还需依赖于我们自身对相关协议的熟悉程度。新手上路,共勉!