当我们需要跟踪网络有关的信息时,经常会说“抓包”。这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通过wireshark抓包分析。
Wireshark 是最著名的网络通讯抓包分析工具。功能十分强大,可以截取各种网络封包,显示网络封包的详细信息。
Wireshark下载安装,略。注意,若在Windows系统安装Wireshark,安装成功后可能会出现Wireshark的两个图标,一个是Wireshark(中文版);另外一个是Wireshark Legacy (英文版)。下面的内容会以Wireshark Legacy为例介绍。
打开Wireshark,开始界面如下:

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

我们打开浏览器输入任意http网址,连接再关闭,比如:http://blog.csdn.net。然后,我们回到Wireshark界面,点击左上角的停止按键。查看此时Wireshark的抓包信息。在看抓包信息之前,先简单介绍下Wireshark界面的含义。其中,封包列表的面板中显示编号、时间戳、源地址、目标地址、协议、长度,以及封包信息。

封包详细信息是用来查看协议中的每一个字段。各行信息分别对应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层收到上层大块报文后分解成段后发出去。

每个数据包的Protocol Length都是1502 Byte,这是因为以太网帧的封包格式为: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 = 1448 Byte(从下图可见)。
所以,每个数据包的Protocol Length = 14 Byte + 20 Byte + 20 Byte + 1448 Byte = 1502 Byte。

我们再来看四次挥手。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通信过程:

Your blog is a testament to your dedication to your craft. Your commitment to excellence is evident in every aspect of your writing. Thank you for being such a positive influence in the online community.
I’ve been following your blog for some time now, and I’m consistently blown away by the quality of your content. Your ability to tackle complex topics with ease is truly admirable.
I like this post, enjoyed this one thank you for putting up. “What is a thousand years Time is short for one who thinks, endless for one who yearns.” by Alain.
GAcpY MUEcwo hqvquH wcmBqjzA
Awesome read! Definitely looking forward to more posts like this!
Great content as always! Keep it coming!
Great post! Love the insights, really made me think. Keep it up!
Awesome read! Very informative and well-written. Looking forward to more!
Really enjoyed this post! Thanks for sharing such valuable info!