计算机网络数据包捕获与协议分析
本文利用Wireshark软件分析网络协议,包括ARP、ICMP、TCP、HTTP和DNS。探讨了ARP的工作机制、ICMP数据包分类、TCP的三次握手过程以及HTTP和DNS数据包的构成。通过捕获和分析请求与应答数据包,深入理解了各协议在网络通信中的作用和特征。
一、捕获ARP请求、应答数据包,分析其组成特征
首先弄清楚ARP协议的作用,ARP是如何工作的?ARP缓冲的内容如何保存与其作用?请求与应答包的区别?
我们知道,无论网络层使用什么协议,在实际网络的链路上传输数据帧时,最终必须使用硬件地址。所以需要一种方法来完成IP地址到MAC地址的映射,这就是地址解析协议(Address Resolution Protocol,ARP)。每台主机都设有一个ARP高速缓存,用来存放本局域网上各主机和路由器的IP地址到MAC地址的映射表,成ARP表,使用ARP来动态维护此ARP表。
ARP工作在网络层,其工作原理如下:主机A欲向本局域网上的某台主机B发送IP数据报时,先在其 ARP 高速缓存中查看有无主机B 的IP地址。如果有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该MAC 帧发往此硬件地址。如果没有,那么就通过使用目的MAC 地址为 FF-FF-FF-FF-FF-FF 的帧来封装并广播 ARP 请求分组(广播发送),使同一个局域网里的所有主机都收到此 ARP 请求。主机 B 收到该 ARP 请求后,向主机 A 发出ARP 响应分组(单播发送),分组中包含主机B 的IP与MAC地址的映射关系,主机 A收到 ARP响应分组后就将此映射写入 ARP 缓存, 然后按查询到的硬件地址发送MAC帧。ARP由于“看到了”IP地址,所以它工作在网络层,而NAT路由器由于看到了“端口”,所以它工作在传输层。(注意:ARP 用于解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问題。如果所要找的主机和源主机不在同一个局域网上,那么就要通过 ARP 找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。剩下的工作就有下一个网络来做,尽管ARP请求分组是广播发送,但ARP相应分组是普通的单播,即从一个源地址发送到一个目的地址。)
使用ARP的4种典型情况总结如下:

(图1.1 使用ARP的4种典型情况)
(1)发送方是主机(如H1),要把IP数据报发送到本网络上的另一台主机(如H2)。这时H1
在网 1用 ARP找到日的主机H2的硬件地址。
(2)发送方是主机(如H1),要把IP数据报发送到另一个网络上的一台主机(如H3)。这时H1用 ARP 找到与网1 连接的路由器R1的硬件地址,剩下的工作由R1来完成。
(3)发送方是路由器(如R1),要把IP数据报转发到与R1连接的网络(网2)上的一台主机(如H3),这时R1在网2用 ARP 找到目的主机H3的硬件地址。
(4)发送方是路由器(如R1),要把IP数据报转发到网3上的一台主机(如H4)。这时R1在网2用 ARP找到与网2连接的路由器R2的硬件地址,剩下的工作由R2来完成。
从 IP地址到硬件地址的解析是自动进行的,主机的用户并不知道这种地址解析过程。只要主机或路由器和本网络上的另一个已知IP 地址的主机或路由器进行通信,ARP 就会自动地将这个IP地址解析为数据链路层所需要的硬件地址。
使用WireShark对ARP协议进行分析:
第一步:Ping本网段内任意主机
1)cmd执行下面这条命令获取局域网内所有主机:
for /L %i IN (1,1,254) DO ping -w 2 -n 1 192.168.31.%i

命令的意思是:ping 192.168.31.1 到 192.168.31.255 之间的所有IP。
2)cmd执行 arp -a 命令,从ARP表中查看本网段内有哪些主机。

3)记录一个本网段的IP,然后 arp -d 清空ARP表。
4)cmd执行 arp -a,验证ARP表已被清空。

5)Wireshark开启抓包后,ping 本网段的IP。

第二步:过滤ARP协议的数据包
显示过滤器中输入:arp,过滤ARP协议的数据包。
![]()
抓到了两个数据包,第一个包是ARP请求包,第二个包是ARP响应包。
第三步:数据包分析
先分析一下这两个数据包做了什么。
1)先看第一个数据包,源地址(Source字段)是我自己的MAC地址。

cmd 执行 ipconfig /all 验证一下:

目标地址(Destination字段)是 Broadcast,就是广播的意思。
Info 字段,是对当前动作的描述:

总结一下第一个数据包做了什么:
我的电脑,发送了一个广播,广播的内容是 “谁是192.168.1.100?告诉192.168.1.104”,
192.168.1.100是我电脑的IP,意思就是:呼叫192.168.1.100,收到请回复我。
2)第二个数据包的目的地址(Destination 字段)是我电脑的MAC地址。

结合 Info 字段的信息,总结一下第二个数据包做了什么:
有个主机,向我的电脑发送了一个信息,信息的内容是 “192.168.1.100 是b0:c9:52:a9:98:5f”,
这个主机把MAC地址告诉了我的电脑。
综上所述,我们可以得出一个结论:
ARP地址解析协议就像一个队内语音,他会向局域网内所有主机广播请求,索要目标IP的MAC地址;知道的主机就会响应具体的MAC地址。
第四步:数据内容分析
接下来我们根据包的数据分析一下,这两个包是怎么做的。
1)第一个包的数据
第一处:ARP后面的括号里是 request,说明这是个请求包。
第二处:源IP、源MAC、目标IP都有值,目标MAC却全是0,意思就是告诉他们:我不知道这个IP的MAC地址。

2)第二个包的数据
第一处:ARP后面的括号里是 reply,说明这是个响应包。
第二处:源IP、源MAC、目标IP、目标MAC都有值,接收方可以从这里获取IP对应的MAC地址。

第五步:ARP自主学习
还记得第一步的时候,我们清空了ARP表吗?
再次使用 arp -a 查看ARP表:

可以发现,表中添加了我们刚才 ping 的IP,以及对应的MAC地址,这就是ARP的学习能力:解析成功的MAC地址会被临时缓存,以节约资源。
第六步:再次访问
1)Wireshark开启抓包,重新访问这个主机。

2)查看ARP请求包的目的MAC地址。

由于是第二次访问,ARP表中已经缓存了MAC地址,所以这次ARP请求不再广播,而是直接从ARP表中获取。
二、捕获ICMP数据包并分析研究
弄清楚ICMP数据包的分类、作用? 捕捉Ping命令数据包,如何构成ICMP协议包,请示与应答包的区别,怎样传输的?
为了提高IP数据报交付成功的机会,在网络层使用了网际控制报文协议 (Internet Control Message Protocol,ICMP)来让主机或路由器报告差错和异常情况。ICMP报文作为IP层数据报的数据,加上数据报的首部,组成IP数据报发送出去。
ICMP的主要功能包括:确认IP包是否成功送达目标地址,报告发送过程中IP包被废弃的原因和改善网络设置等。
ICMP报文的种类有两种,即ICMP差错报告报文和ICMP询问报文。
ICMP差错报告报文用于目标主机或到目标主机路径上的路由器向源主机报告差错和异常情况。共有以下 5 种类型:
1)终点不可达。当路由器或主机不能交付数据报时,就向源点发送终点不可达报文。
2)源点抑制。当路由器或主机由于拥塞而丢弃数据报时,就向源点发送源点抑制报文,使源点知道应当把数据报的发送速率放慢。
3)时间超过。当路由器收到生存时间(TTL)为零的数据报时,除丢弃该数据报外,还要向源点发送时间超过报文。当终点在预先规定的时间内不能收到一个数据报的全部数据报片时,就把己收到的数据报片都丢弃,并向源点发送时间超过报文。
4)参数问题。当路由器或目的主机收到的数据报的首部中有的字段的值不正确时,就丢弃该数据报,并向源点发送参数问题报文。
5)改变路由(重定向)。路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器(可通过更好的路由)。
不应发送 ICMP 差错报告报文的几种情况如下:
1)对 ICMP 差错报告报文不再发送 ICMP 差错报告报文。
2)对第一个分片的数据报片的所有后续数据报片都不发送 ICMP 差错报告报文。
3)对具有组播地址的数据报都不发送ICMP 差错报告报文。
4)对具有特殊地址(姐 127.0.0.0 或 0.0.0.0) 的数据报不发送 ICMP 差错报告报文。
ICMP 询问报文有4 种类型:回送请求和回答报文、时间戳请求和回答报文、地址掩码请求和回答报文、路由器询问和通告报文,最常用的是前两类。
几种常用的ICMP报文类型
|
ICMP报文种类 |
类型的值 |
ICMP报文 |
|
差错报告报文 |
3 |
终点不可达 |
|
11 |
时间超过 |
|
|
12 |
参数问题 |
|
|
5 |
改变路由 |
|
|
询问报文 |
8或0 |
回送请求或回答 |
|
13或14 |
时间戳请求或回答 |
以下主要分析的是回送请求或回答报文。
ICMP的一个重要应用:分组网间探测PING(Packet Internet Groper),用来测试两台主机或主机与路由器之间的连通性。
PING是用了ICMP回送请求与回送回答报文。
第一步:捕获ICMP数据包
1)打开wireshark软件,同时打开主机的命令提示符窗口。
2)首先假设Ping的是www.baidu.com。

3)打开WireShark软件,在在应用显示过滤器中输入icmp。

4)出现以下界面。

①会出现8条报文,4次request,4次reply,一共4次往返。
②长度74是因为不包含MAC层校验的4字节。
③从编号可以看出,一共有6帧,每一帧的结构都是类似的:
•Frame 1:物理层的数据帧情况,对应OSI七层模型中的【物理层】
•Ethernet II, Src:数据链路层以太网帧头部信息,对应OSI七层模型中的【数据链路层】
•Internet Protocol Version 4, Src: 互联网层IP包头信息,对应OSI七层模型中的【网络层】
• Internet Control Message Protocol:互联网控制信息协议,即ICMP,对应OSI七层模型中的【网络层】
第二步:研究分析数据包
1)分析request报文


2)分析reply报文

3)请求包与应答包的区别
①Type(标识ICMP消息类型)不一样。
•8表示Echo Request , 回送请求报文。
•0表示Echo Reply , 回送应答报文。
②Request frame不一样 。
•序列号会依次+1。
③目的地址和源地址的顺序不一样。
WireShark用了分层的方式,展示了各个层的包头信息。
•可以在数据链路层,看到 MAC 包头信息,如源 MAC 地址和目标 MAC 地址等字段;
•可以在 IP 层,看到 IP 包头信息,如源 IP 地址和目标 IP 地址、TTL、IP 包长度、协议等 IP 协议各个字段的数值和含义;
•可以在 ICMP 层,看到 ICMP 包头信息,比如 Type、Code 等 ICMP 协议各个字段的数值和含义;
•从 ping 的例子中,我们可以看到网络分层就像有序的分工,每一层都有自己的责任范围和信息,上层协议完成工作后就交给下一层,最终形成一个完整的网络包。

三、捕获TCP“三次握手”连接与释放数据包的过程并进行分析
TCP报文段的首部格式:

三次握手连接建立过程:
1)服务端主动监听某个端口,处于LISTEN状态。
2)第一次握手建立连接,客户端向服务端发送 SYN 报文 (SYN=1,SEQ=X,X为客户端序列号client_isn)。
3)第二次握手,服务端接收到请求并允许连接,就会返回SYN+ACK报文(SEQ=Y,ACK_NUM=X+1,SYN=1,ACK=1)给客户端,告诉它确认允许连接。报文说明【SEQ为服务端序列号,即Sequence Num。ACK_NUM为确认号(Acknowledgement),ACK_NUM=X(客户端序列号)+1】。
4)第三次握手,当客户端接收到服务端返回的【SYN+ACK报文】后,客户端需要再次发送确认包ACK(SEQ=X+1. ACK_NUM=Y+1)。
5)连接建立成功。
第一步:筛选TCP开始抓包


1)第一次由我本机192.168.1.104的6654685端口请求到52.109.8.45主机的443端口,发送syn报文。
2)第二次由52.109.8.45主机的443端口向192.168.1.104主机的6654685端口发送了【SYN+ACL】报文。
3)第三次由192.168.1.104主机的6654685端口向52.109.8.45主机的443端口,发送【ACK】报文。
第二步:分析“三次握手”数据包
第一次握手
首先客户端向服务器发送一个SYN包,并等待服务器确认;标志位为SYN,表示请求建立连接;序号为Seq = x;随后客户端进入SYN-SENT阶段。


第二次握手
服务器接收到客户端发来的SYN包后,对该包进行确认后结束LISTEN阶段,并返回一段TCP报文。
标志位为SYN和ACK,表示确认客户端的报文Seq序号有效,服务器能正常接收客户端发送的数据,并同意创建新连接。序号为Seq = y;确认号为Ack = x + 1,表示收到客户端的序号Seq并将其值加1作为自己确认号Ack的值,随后服务器端进入SYN-RECV阶段。


第三次握手
客户端接收到发送的SYN + ACK包后,明确了从客户端到服务器的数据传输是正常的,从而结束SYN-SENT阶段。并返回最后一段报文。
标志位为ACK,表示确认收到服务器端同意连接的信号。序号为Seq = x + 1,表示收到服务器端的确认号Ack,并将其值作为自己的序号值。确认号为Ack= y + 1,表示收到服务器端序号seq,并将其值加1作为自己的确认号Ack的值。随后客户端进入ESTABLISHED。
当服务器端收到来自客户端确认收到服务器数据的报文后,得知从服务器到客户端的数据传输是正常的,从而结束SYN-RECV阶段,进入ESTABLISHED阶段,完成三次握手。


总结三次握手图解过程:

(图3.12)
【思考】:为什么是「三」次握手?
因为三次是保证client和server端均让对方知道自己具备发送和接收能力的最小次数:
client > server:client具备发送能力
server > client:server具备接收和发送能力
client > server:client具备接收能力
第三步:释放连接的四次挥手过程

这里假设客户端主动释放连接。在挥手之前主动释放连接的客户端结束ESTABLISHED阶段,随后开始四次挥手:
第一次挥手
首先客户端向服务器发送一段TCP报文表明其想要释放TCP连接。
标记位为FIN,表示请求释放连接;序号为Seq = u
随后客户端进入FIN-WAIT-1阶段,即半关闭阶段,并且停止向服务端发送通信数据。
第二次挥手
服务器接收到客户端请求断开连接的FIN报文后,结束ESTABLISHED阶段,进入CLOSE-WAIT阶段并返回一段TCP报文。
标记位为ACK,表示接收到客户端释放连接的请求;序号为Seq = v;确认号为Ack = u + 1,表示是在收到客户端报文的基础上,将其序号值加1作为本段报文确认号Ack的值。
随后服务器开始准备释放服务器端到客户端方向上的连接。
客户端收到服务器发送过来的TCP报文后,确认服务器已经收到了客户端连接释放的请求,随后客户端进入FIN-WAIT-2阶段。
第三次挥手
服务器端在发出ACK确认报文后,服务器端会将遗留的待传数据传送给客户端,待传输完成后即经过CLOSE-WAIT阶段,便做好了释放服务器端到客户端的连接准备,再次向客户端发出一段TCP报文。
标记位为FIN和ACK,表示已经准备好释放连接;序号为Seq = w;确认号Ack = u + 1,表示是在收到客户端报文的基础上,将其序号Seq的值加1作为本段报文确认号Ack的值。
随后服务器端结束CLOSE-WAIT阶段,进入LAST-ACK阶段,并且停止向客户端发送数据。
第四次挥手
客户端收到从服务器发来的TCP报文,确认了服务器已经做好释放连接的准备,于是进入TIME-WAIT阶段,并向服务器发送一段报文。
标记位为ACK,表示接收到服务器准备好释放连接的信号;序号为Seq= u + 1,表示是在已收到服务器报文的基础上,将其确认号Ack值作为本段序号的值;确认号为Ack= w + 1,表示是在收到了服务器报文的基础上,将其序号Seq的值作为本段报文确认号的值。
随后客户端开始在TIME-WAIT阶段等待2 MSL。服务器端收到从客户端发出的TCP报文之后进入CLOSED阶段,由此正式确认管关闭服务器端到客户端方向上的连接。客户端等待完2 MSL之后,进入CLOSED阶段,由此完成四次挥手。
总结四次挥手图解过程:

【思考】:为什么是「四」次挥手?
因为TCP是一个全双工协议,必须单独拆除每一条信道,两个方向的接收、发送都需要单独关闭。
四、捕获HTTP、DNS数据包,分析其构成
捕获本机浏览外部某一网站时的DNS、HTTP数据包,取DNS、HTTP典型数据包各一个,列出其应用层、传输层、IP层、数据链路层上各层上数据包相应参数,首部内容,并对感兴趣的部分进行深入分析。

第一步:捕获DNS数据包
![]()
主机ping www.baidu.com

第一个包为请求包:


第二个包为响应包:

其中Data length表示资源数据长度,以字节为的单位;
响应包中发现三条资源记录,百度的另一个域名为www.a.shifen.com,IP地址分别为183.232.231.172和183.232.231.174。
第二步:捕获HTTP数据包

分析物理层数据帧:


分析数据链路层数据帧:

1.Destination:目标MAC地址;
2.Source:源MAC地址;
注:wireshark显示的MAC地址是出场商名称
分析网络层IP包:


分析传输层TCP数据段:


分析应用层:
(1)请求数据包:


(2)响应数据包:


五、总结
本实验通过使用Wireshark抓包软件,分析ARP、ICMP、TCP和DNS/HTTP等网络协议。首先,捕获ARP请求与应答数据包,了解其作用及工作机制。接着,捕捉ICMP数据包,研究Ping命令的构成以及请求与应答包的区别。然后,捕获TCP的三次握手过程,分析连接建立与释放的机制。最后,捕获并分析DNS和HTTP数据包的结构,深入探究各层参数及首部内容。通过这些分析,可以更好地理解网络协议的工作原理和数据传输过程。
更多推荐

所有评论(0)