那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
高质量博客汇总
https://blog.csdn.net/yu_cblog/category_12379430.html?spm=1001.2014.3001.5482
目录
编辑前言
Wireshark软件使用与 ARP 协议分析
WireShark基本使用
编辑 以太网的帧结构的分析和mac地址分析
分析arp数据包并描述arp协议工作过程
捕获与本机同网段ARP报文步骤
本机同网段ARP报文分析
本机不同网段ARP报文分析
请求和响应过程分析以及同网段和跨网段arp报文对比
IP与ICMP 分析
IP报头分析和ICMP请求帧和回应帧的对比
捕获过程
分析一个IP数据报
ICMP请求帧和回应帧的对比
IP报文分片分析
ICMP差错报文分析
捕获步骤
ICMP差错报文分析
traceroute工作原理分析
根据ICMP报文的数据交互示意图
本小节实验内容包括:
WireShark基本使用
以太网的帧结构的分析和mac地址分析
ARP协议分析
思考题以及总结
使用wireshark开始抓包
点击鲨鱼标志符号即可开始抓包,点击正方形红色符号,可以停止抓包。
添加抓包的筛选条件
当前我将筛选出基于tcp协议的且端口号位为80的所有数据包,如下图所示。
显示arp报文,如下图所示。
可以导出特定分组
实验准备
另用上一次编写的基于TCP的HTTP服务器。用本地浏览器向远端阿里云服务器的HTTP服务器发送请求,设置端口号为8080,并利用wireshark捕捉整个过程的数据报文。
帧结构分析
以下是捕获的一个数据包的详细信息,通过右键连续点击可以打开如下界面。
Arrival Time 数据包的捕获时间:May 11, 2023 23:36:36.794865000
Frame Number 帧序号:250
Frame Length 数据包的长度:78 bytes
Capture Length 捕获的长度:78 bytes
Protocols in frame 协议封装层次 :etc:ethertype:ip:tcp
Time delta from previous captured frame 上一帧捕获的时间增量:0.067s
Time delta from previous displayed frame 上一帧显示的时间增量:0.0s
mac地址分析
在Ethernet帧头部,有两个重要的标志位,分别是LAC位和IG位,其中LAC位对应的是第13位,IG位对应的是第14位。
LAC位(也称为LG bit)表示本帧是否为组播帧,当LAC位设置为“1”时,表示该帧为组播帧;当LAC位设置为“0”时,表示该帧为单播帧或广播帧。
IG位(也称为IG bit)表示本帧是否需要被交换机进行学习,当IG位设置为“1”时,表示本帧不需要进行学习,即不需要将发送端的MAC地址加入到交换机的MAC地址表中;当IG位设置为“0”时,表示本帧需要进行学习,即需要将发送端的MAC地址加入到交换机的MAC地址表中。
在以太网中,如果一个数据包是广播或组播帧,那么交换机会对它进行广播,使得被连接的所有设备都可以接收到该数据包。而如果是单播帧,交换机只会将它发送给目标MAC地址所对应的端口。因此,LAC位和IG位的设置对于以太网中广播、组播和单播帧的处理及交换机的学习过程非常重要。
在本次实验的mac帧中,所有的LG位和IG位都是0,表示是一个需要学习的单播帧。
通过点击数据报,选择Ethernet II
选项,可以查看帧的详细信息。
现在将开始分析每一个字段以及所对应的字节范围。
一个标准的mac头部包含14字节,其中包括源mac地址(6字节),目标mac地址(6字节)和协议类型(2字节),结构如下图所示。
在wireshark中体现如下图所示。
后面的字节部分,就是要向上交付(网络层)的有效载荷了,是一个完整的IP报文。其中IP报文的有效载荷,即为一个完整的TCP报文。
在mac电脑上使用sudo arp -d -a
命令清空 ARP 缓存。
在wireshark上选择捕获选项,设置捕获本地的本机接口
arp
,捕获到一个ARP报文除了报文前14个字节,其余都属于ARP报文,格式如下图所示。
通过与Wireshark上的字段一一对应,可以得出该报文的信息,如下所示。
硬件类型: Ethernet (1) 协议类型: IPv4 (0x0800) 硬件地址长度: 6 协议地址长度: 4 操作: reply (2) 源MAC地址: 22:37:a5:51:ae:64 (22:37:a5:51:ae:64) 源IP地址: 172.20.10.1 目标MAC地址: Apple_0c:35:22 (ac:c9:06:0c:35:22) 目标IP地址: 172.20.10.3
捕获结果如下所示。
筛选出的数据包中Destination字段为Broadcast的数据包即为想要跨网段传输的ARP数据包。
这是因为ARP请求通常都是以广播的形式发送的,因此以太网层的目的地址字段应该设置为全F,表示数据包将发送到本地网络中的所有设备。而ARP层的目标MAC地址字段设置为全0,因为ARP请求的目的是查找某个IP地址的MAC地址,此时该IP地址对应的MAC地址尚未被确定,因此ARP层的目标MAC地址字段应该设置为全0。如下图所示。
同网段的情况
当本机发送一个 ICMP 报文给同一网段的另一个设备时,它会先查询本地的 ARP 缓存表,查找目标设备的 MAC 地址。如果缓存中没有该设备的 MAC 地址,则该设备需要发送一个 ARP 请求包以获取目标设备的 MAC 地址。
ARP请求包是一个广播包,在本机所在网络内传播。该包包含源 MAC 地址和源 IP 地址(本机的 IP 地址),目标 IP 地址和目标 MAC 地址。
当目标设备接收到 ARP 请求包时,它将检查包中的目标 IP 地址,如果目标 IP 地址和它的 IP 地址匹配,该设备将生成并发送一个 ARP响应包。
ARP 响应包是一个单播包,将仅发送到请求来源设备的 MAC 地址。该包包含源 MAC 地址和源 IP 地址,目标 IP 地址和目标 MAC 地址。
当请求来源设备接收到 ARP 响应包时,它将更新本地 ARP 缓存表并保存目标设备的 MAC 地址。在以后的通信中,该设备可以直接使用目标设备的 MAC 地址。
这样,请求/响应的过程就完成了。本机和目标设备之间建立了一个 ARP 表项和对应的 MAC 地址,以便将来通信时可以更快地查找目标设备的 MAC 地址。
不同网段的情况
与本机同一网段的 ARP 数据包和与本机不同网段的 ARP 数据包之间的主要区别是目标 MAC 地址和源 IP 地址的不同。
当本机与不同网段的设备通信时,本机将首先使用 ARP 查询其默认网关,然后使用默认网关的 MAC 地址将通信路由到外部网络。在这种情况下,ARP 请求中的目标 IP 地址是路由器网关的 IP 地址(如下图所示),而不是目标设备的 IP 地址。
实验内容
实施ping命令,记录引发的IP数据报和ICMP报文,保存为pcapng文件。解释任一个IP数据报的首部,并对比 ICMP Echo请求帧和回应帧。改变ping的长度参数,解释IP数据报分片情况。
在过滤器框中输入ping命令的过滤器表达式:icmp && icmp.type==8
。这将只显示与ping命令相关的ICMP Echo请求报文。
在终端窗口中执行ping命令。例如,执行以下命令:ping 192.168.0.1
在Wireshark中捕获和分析ping命令生成的数据包。
停止捕获后,选择“文件”->“保存为”,选择pcapng格式并保存文件。
捕获结果如下图所示
下图是一个IP数据报文的结构。
下面是Wireshark的捕捉结果以及其IP报文的分析。
字段分析结果: 版本 Version: 4 头部长度 Header Length: 20 bytes (5) 服务类型 Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT) 总长度 Total Length: 84 标识符 Identification: 0x503b (20539) 标志 Flags: 0x0 片位移 Fragment Offset: 0 存活时间 Time to Live: 64 上层协议 Protocol: ICMP (1) 报头校验和 Header Checksum: 0xa0bf [validation disabled] 源IP地址 Source Address: 172.28.28.233 目的IP地址 Destination Address: 192.168.0.1
我利用自己的电脑ping自己的平板电脑,Wireshark捕获结果如下,可以得到一系列请求帧和回应帧。
ICMP是一个运行在IP层之上的协议,用于在IP网络中传递控制消息。ICMP Echo Request和ICMP Echo Reply都是ICMP报文的一种类型,它们包含了Type、Code、Checksum、Identifier、Sequence Number等字段。如下图所示。
通过对比请求帧和回应帧,可以分析两者之间的差异。
ICMP Echo Request的Type字段是8,Code字段是0,而ICMP Echo Reply的Type字段是0,Code字段也是0。这两个报文的其它字段也可能会有不同。例如,ICMP Echo Request报文通常包含一个Identifier(标识符)字段和一个Sequence Number(序列号)字段,而ICMP Echo Reply报文则包含与之前发送的Echo Request报文相同的Identifier和Sequence Number字段。
此外,当ICMP Echo Request报文超时或收到错误响应时,通常会返回一个终止这一过程的ICMP错误报文,其中Type字段是11,Code字段是0(ICMP Time Exceeded报文)或Type字段是3,Code字段是0(ICMP Destination Unreachable报文)。(这一部分的现象,将会在 ICMP 差错报文分析部分作详细体现)
我通过ping
向自己的平板电脑发送请求,并把报文长度不断增加,此时可以观察到IP报文分片的现象。
ping 172.20.10.4 -s 3000
(报文长度为3000为例)
为什么会有IP报文分片现象
IP报文分片的原因是由于传输过程中可能会遇到MTU(Maximum Transmission Unit,最大传输单元)限制的问题,即网络的传输介质(例如以太网)能够传输的每个数据包的最大大小有限制。如果IP报文的大小超过了MTU,那么就需要将其分成多个较小的数据包进行传输,这就是IP报文分片的作用。分片操作由发送端进行,接收端需要将分片后的数据包进行重组,还原出原始的IP报文。
实验结果
通过不断调整数据包大小和长度,最终实验做得,当数据包大小达到1484
时,ip数据包开始分片。
以下是分片和不分片的ip数据报文对比。
通过实验结果可以分析得知,分片的IP数据报文和不分片的IP数据报文主要区别在于大小和标识字段的设置。
大小:不分片的IP数据报文大小不超过MTU限制,而分片的IP数据报文可根据MTU的限制被切割成多个较小的数据片进行传输。
标识:不分片的IP数据报文中的标识字段为0,而分片的IP数据报文中的标识字段一般是相同的,以便接收端在接收到多个数据片时能够准确地将它们组装在一起恢复原始的IP数据报文。
另外,分片的IP数据报文还会包含偏移量字段,用于指示数据片在原始IP数据报文中的位置。而不分片的IP数据报文中则没有此字段。
在实验中,我认为通过观察是否含有偏移量字段(偏移量字段是否为0),是最好的也是最方便判断ip数据报是否分段的方法。
要求:实施 tracert 命令,记录引发的ICMP报文,保存为pcapng 文件;解释 任一个 ICMP 差错报文的结构;描述 tracert 工作原理,结合 ICMP 报文记录画出数据交互示意图。
使用traceroute
命令,traceroute 172.20.10.4
,终端现象如下图所示。
利用wireshark捕获icmp报文。
这样我们就捕获到了一系列的icmp差错报文。
以下是一个差错报文。
报文类型 Type: 11 (Time-to-live exceeded) 表示时间超时 代码 Code: 0 (Time to live exceeded in transit) 校验和Checksum: 0x9d17 [correct] [Checksum Status: Good] Unused: 00000000 Internet Protocol Version 4, Src: 172.29.69.176, Dst: 172.20.10.4 User Datagram Protocol, Src Port: 62171, Dst Port: 33435
我们可以对比之前的请求帧和回应帧中的ICMP报文的信息,可以发现,报文类型Type
这个字段是不同的。目前我们所知的,请求帧是8,回应帧是0,而本次实验的超时报文是11。
通过查阅资料,我查询到了Type码所对应报文类型的解释,如下表所示。
在区分这些报文时,一般可以通过ICMP报文头中的类型和代码字段来判断是哪一种类型的报文。对于差错报文还可以使用IP头中的“协议字段”和ICMP报文中的TTL等信息来判断报文的信息。
traceroute是一种用于测试网络连接路径和瓶颈的命令行工具。其基本原理是在每次发送ICMP数据报时,将数据报的TTL字段递增,每一次经过一个路由器都会将数据报TTL递减,直到TTL减为0为止。当TTL减为0时,路由器将数据报丢弃,并向发送方返回一条“ICMP Time Exceeded”的差错报文,同时包含该路由器的IP地址。
traceroute通过向目标主机发送一系列TTL值递增的ICMP报文,并记录每次传输消耗的时间,推算出TTL值递增的顺序,即数据报的经过路由列表,从而得出源主机到目标主机的完整路由路径。
简单来说,traceroute的工作流程如下:
设置TTL值为1,向目标主机发送一个Ping消息,第一个路由器收到Ping消息后,将TTL减1,把消息向目标主机转发,同时返回一个ICMP差错报文,表示时间已超时。
设置TTL值为2,向目标主机发送一个Ping消息,第二个路由器收到Ping消息,将TTL减1,把消息向目标主机转发,同时返回一个ICMP差错报文,表示时间已超时。
逐渐增加TTL值,直至目标主机收到数据包,返回一个ICMP回应报文,表示目标主机已接收到消息。
根据返回的ICMP差错报文和ICMP回应报文以及每次发送和接收的时间,推算出每一个路由器的IP地址和延迟时长,从而得到源主机到目标主机的完整路由路径。
根据ICMP报文的数据交互示意图如图所示。