【技术流】以TCP/IP协议为例,如何通过wireshark抓包分析?

【技术流】以TCP/IP协议为例,如何通过wireshark抓包分析?

本文作者:李莉, 网易云平台测试组高级测试工程师。

当我们需要来跟踪网络通信有关的信息时,经常会说“抓包”。

这里抓包究竟是什么?抓到的包又能分析出什么?在本文中,先从TCP/IP协议为例,简单介绍TCP/IP协议,以及如何通过wireshark抓包分析。

Wireshark是最著名的网络通讯抓包分析工具。功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。

Wireshark下载安装,略。注意,若在Windows系统安装Wireshark,安装成功后可能会出现Wireshark的两个图标,一个是Wireshark(中文版);另外一个是Wireshark Legacy (英文版)。下面的内容会以Wireshark Legacy为例介绍。

打开Wireshark,开始界面如下:

Wireshark是捕获网卡的网络包,当机器上有多块网卡的时候,需要先选择网卡。开始界面中的Interface List,即网卡列表,选择我们需要的监控的网卡。点击Capture
Options,选择正确的网卡,然后点击"Start"按钮, 开始抓包。

然后打开浏览器输入http网址再关闭,比如:blog.csdn.net。需要停止抓取报文的时候,点击左上角的停止按键。查看此时Wireshark的抓包信息。先来看下Wireshark界面的含义。其中,封包列表的面板中显示编号、时间戳、源地址、目标地址、协议、长度,以及封包信息。

封包详细信息是用来查看协议中的每一个字段。各行信息分别对应TCP/IP协议的不同层级。以下图为例,分别表示:TCP层、IP层、数据链路层、物理层,一共四层。如果有应用层数据会显示五层。

每一层都有一个字段指向上一层,表明上一层是什么协议。这大概是因为发包的时候会在数据上依次加上应用层、传输层、网络层、链路层的头部,但是对方收到数据包后是从最底层(链路层)开始层层剥去头部解包的,所以在每层上有一个字段指向上层表明上层的协议,对方就知道下一步该怎么解包了。以TCP/IP协议为例,下图中分别是:IPv4、TCP。由于建立TCP连接用不到应用层协议,所以传输层就没有相应的指明上层(应用层)的字段了。

在了解Wireshark界面显示的基本信息之后,我们来分析TCP协议,添加对应的过滤条件。此外,我添加了目标的ip地址和端口号:tcp and ip.addr==47.95.47.253 and
tcp.port==53992,此时获取到的封包列表如下。

在此之前,先看下TCP/IP报文的格式。

根据上述报文格式我们可以将wireshark捕获到的TCP包中的每个字段与之对应起来,更直观地感受一下TCP通信过程。先看三次握手,下图中的3条数据包就是一次TCP建立连接的过程。

第一次握手,客户端发送一个TCP,标志位为SYN=1,序号seq为Sequence
number=0, 53992 -> 80,代表客户端请求建立连接;

第二次握手,服务器向客户端返回一个数据包,SYN=1,ACK=1,80 -> 53992,将确认序号(Acknowledgement
Number)设置为客户的序号seq(Sequence number)加1,即0+1=1;

第三次握手,客户端收到服务器发来的包后检查确认序号(Acknowledgement
Number)是否正确,即第一次发送的序号seq加1(X+1= 0+1=1)。以及标志位ACK是否为1。若正确,客户端会再向服务器端发送一个数据包,SYN=0,ACK=1,确认序号(Acknowledgement
Number)=Y+1=0+1=1,并且把服务器发来ACK的序号seq(Sequence number)加1发送给对方,发送序号seq为X+1= 0+1=1。客户端收到后确认序号值与ACK=1,53992 -> 80,至此,一次TCP连接就此建立,可以传送数据了。

还可以通过直接看标志位查看三次握手的数据包,如下图所示,第一个数据包标志位【SYN】,这是第一次握手;第二个数据包标志位【SYN,ACK】,这是第二次握手;第三个数据包标志位【ACK】,这是第三次握手。

在三次握手的三个数据包之后,第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。

再往下看其他数据包,发现会存在大量的这里看到有大量的TCP segment of a reassembled PDU,字面意思是要重组的协议数据单元(PDU:Protocol Data Unit)的TCP段,这是TCP层收到上层大块报文后分解成段后发出去。

以太网帧的封包格式为:Frame = Ethernet Header + IP Header + TCP Header + TCP Segment Data。即:

1、Ethernet Header = 14 Byte = Dst Physical Address(6 Byte)+ Src Physical Address(6 Byte)+ Type(2 Byte),以太网帧头以下称之为数据帧。

2、IP Header = 20 Byte(without options field),数据在IP层称为Datagram,分片称为Fragment。

3、TCP Header = 20 Byte(without options field),数据在TCP层称为Stream,分段称为Segment(UDP中称为Message)。

4、TCP Segment Data = 1448Byte(从下图可见)。

我们再来看四次挥手。TCP断开连接时,会有四次挥手过程,标志位是FIN,我们在封包列表中找到对应位置,理论上应该找到4个数据包,但我试了好几次,实际只抓到3个数据包。查了相关资料,说,是因为服务器端在给客户端传回的过程中,将两个连续发送的包进行了合并。因此下面会按照合并后的三次挥手解释,若有错误之处也请指出。

第一次挥手:客户端给服务器发送TCP包,用来关闭客户端到服务器的数据传送。将标志位FIN和ACK置为1,序号seq=X=2242,确认序号ack=Z=17602,53992 -> 80;

第二次挥手:服务器收到FIN后,服务器关闭与客户端的连接,发回一个FIN和ACK(标志位FIN=1,ACK=1),确认序号ack为收到的序号加1,即X=X+1=2243。序号seq为收到的确认序号=Z=17602,80
-> 53992;

第三次挥手:客户端收到服务器发送的FIN之后,发回ACK确认(标志位ACK=1),确认序号为收到的序号加1,即Y+1=17603。序号为收到的确认序号X=2243,53992 -> 80。

至此,整个TCP通信过程已经介绍完毕。

附:TCP通信过程:


如果小伙伴们有什么疑问,可以在评论区留言,也欢迎各位与我们分享自己的看法~


注:“TCP/IP报文格式图”及“TCP通信过程图”来源于网络,如有侵权,请私信联系删除。

编辑于 2018-05-04