—. 实验目的
IP和 ICMP协议是 TCP/IP协议簇中的网络层协议,在网络寻址定位、数据分组转发和路由选择等任务中发挥了重要作用。本实验要求熟练使用 Wireshark软件,观察 IP数据报的基本结构,分析数据报的分片;掌握基于 ICMP协议的 ping和 tracert命令及其工作原理。
二. 实验内容
启动 Wireshark,捕捉网络命令执行过程中本机接受和发送的数据报。
1.执行 ping命令,观察 IP数据报和 ICMP询问报文的结构:通过Wireshark监视器观察捕获流量中的 ICMP询问报文和 IP数据报的结构。注意比较 ICMP请求帧与回应帧,及其 IP头部数据字段的异同。
2.改变 ping命令的参数,观察 IP数据报分片:更改ping命令参数MTU,使其发出长报文以触发 IP数据报分片,再观察 IP数据报的结构变化。
3.执行 Tracert命令,观察 ICMP差错报文的结构,并分析其工作原理:使用Linux操作系统提供的 tracert6命令(或者 Windows系统提供的 tracert命令),捕获和分析该命令所产生的 IP数据报,特别注意相关的 ICMP差错报文。结合捕获的具体数据,画出命令执行过程中数据交互的示意图,掌握 tracert的工作原理。
三. 实验原理、方法和手段
3.1 IP协议及数据报格式
网际互连协议(InternetProtocol,IP),是 TCP/IP体系中的网络层协议,可实现大规模的异构网络互联互通,为主机提供无连接的、尽力而为的数据包传输服务。在网际协议第 4版(IPv4)中,IP数据报是一个可变长分组,包括首部和数据两部分 (如图1.2–1)。首部由 20~60 字节组成,包含与路由选择和传输有关的重要信息,其各字段意义如下:
- 版本(4位):该字段定义 IP协议版本,所有字段都要按照此版本的协议来解释。
2. 首部长度(4位):该字段定义数据报协议头长度,表示协议首部具有 32位字长的数量,最小值为 5,最大值为 15。
3. 服务(8位):该字段定义上层协议对处理当前数据报所期望的服务质量,并对数据报按照重要性级别进行分配。前 3位为优先位,后面 4位为服务类型,最后1位没有定义。这 8位可用于分配优先级、延迟、吞吐量以及可靠性。
4. 总长度(16位):该字段定义整个 IP数据报的字节长度,包括协议首部和数据,其最大值为 65535字节。
5. 标识(16位):该字段包含一个整数,用于标识当前数据报。当数据报分片时,标识字段的值被复制到所有的分片中。
6. 标记(3位):该字段由 3位字段构成,其中最低位(MF)控制分片:若存在下一个分片则值为 1;否则置 0代表该分片是最后一个。中间位(DF)指出数据报是否可进行分片,若置1则不允许该数据报进行分片。第三位即最高位保留不使用,值为 0。
7. 分片偏移(13位):该字段指出数据分片在源数据报中的相对位置,以 8字节为长度单位。
8. 生存时间(8位):该字段是计数器,转发该数据报的路由器依次减 1直至减少为 0。
9. 协议(8位):该字段指出在 IP层处理后,由哪种上层协议接收该数据报。
10. 头部校验和(16位):该字段帮助确保 IP协议头的正确性。计算过程是先将校验和字段置为 0,然后将整个头部每 16位划分为一部分,并将各部分相加,其计算结果取反码,填入校验和字段中。
11. 源地址(32位):源主机的 IP地址。
12. 目的地址(32位):目标主机的 IP地址。
一个IP包从源主机传输到目标主机可能需要经过多个传输媒介不同的网络。每种网络对数据帧都设置了一个最大传输单元 (MTU)的限制(例如以太网的 MTU 是 1500字节)。因此,当路由器在转发 IP包时,如果数据包的大小超过了出口链路网络的 MTU时,需将对该 IP数据报进行分片,才能在目标链路上顺利传输。每个 IP分片将独立传输,直到所有分片都到达目的地后,目标主机才会把他们重组成一个完整的 IP 数据报。在IP数据报的分片与重组过程中,以下三个首部字段发挥了重要作用:
- 标记的后两位:最低位记为 MF(MoreFragment),MF= 1代表还有后续分片,MF= 0表示此为原始数据报的最后分片。次低位DF(Don’tFragment),用来控制数据报是否允许分片。DF= 1 表示该数据报不允许分片;DF= 0 允许分片。
- 标识符:用于目的主机将IP数据报的各个分片重装成原来的数据报。
- 片偏移:以 8字节为单位,目的主机在重装 IP数据报时需要根据该字段提供偏移量进行排序。这是因为数据分片的独立传输使各分片的到达顺序难以确定。
3.2 ICMP协议及报文格式
因特网控制报文协议(InternetControlMessageProtocol,ICMP),用于 IP主机、路由器之间传递控制消息。控制消息是指网络是否连通、主机是否可达、路由是否可用等网络本身的控制管理消息,对网络正常运行起着重要的作用。
ICMP报文的类型可以分为ICMP差错报文和ICMP询问报文两种(其结构如图1.2–2)。ICMP差错报告报文主要有终点不可达、源站抑制、超时、参数问题和路由重定向5种。ICMP询问报文有回送请求和应答、时间戳请求和应答、地址掩码请求和应答以及路由器询问和通告 4种。其常见的类型与代码如表1.2–1所示。
本实验涉及以下两个常用网络命令,都属于ICMP协议的典型应用。
类型
(TYPE) |
代码
(CODE) |
描述 (Description) | 查询类
(Query) |
差错类
(Error) |
0 | 0 | EchoReply——回显应答(Ping应答) | ✔ | |
3 | 1 | HostUnreachable——主机不可达 | ✔ | |
3 | 3 | PortUnreachable——端口不可达 | ✔ | |
3 | 4 | Fragmentationneededbutnofrag.bitset
——需要进行分片但设置不分片比特 |
✔ | |
8 | 0 | Echorequest——回显请求(Ping请求) | ✔ | |
11 | 0 | TTLequals0 duringtransit
——传输期间生存时间为 0 |
✔ |
1. ping命令,是测试网络最有效的工具之一。它是由主机或路由器执行 ping命令向一个特定的目的主机发送一份 ICMP回显请求(Echorequest)报文,并等待其返回 ICMP回显应答(EchoReply)。ping命令可以检测网络的连通性,简单估测数据报的往返时间(RoundTripTime),确定是否有数据包丢失或损坏,从而帮助分析网络故障。ping命令格式和常用参数罗列如下:
用法: ping [-t] [-a] [-n count] [-l size] [-f] [-i TTL] [-v TOS]
[-r count] [-s count] [[-j host-list] | [-k host-list]]
[-w timeout] [-R] [-S srcaddr] [-c compartment] [-p]
[-4] [-6] target_name
选项:
-t Ping 指定的主机,直到停止。
若要查看统计信息并继续操作,请键入 Ctrl+Break;
若要停止,请键入 Ctrl+C。
-a 将地址解析为主机名。
-n count 要发送的回显请求数。
-l size 发送缓冲区大小。
-f 在数据包中设置“不分段”标记(仅适用于 IPv4)。
-i TTL 生存时间。
-v TOS 服务类型(仅适用于 IPv4。该设置已被弃用,
对 IP 标头中的服务类型字段没有任何
影响)。
-r count 记录计数跃点的路由(仅适用于 IPv4)。
-s count 计数跃点的时间戳(仅适用于 IPv4)。
-j host-list 与主机列表一起使用的松散源路由(仅适用于 IPv4)。
-k host-list 与主机列表一起使用的严格源路由(仅适用于 IPv4)。
-w timeout 等待每次回复的超时时间(毫秒)。
-R 同样使用路由标头测试反向路由(仅适用于 IPv6)。
根据 RFC 5095,已弃用此路由标头。
如果使用此标头,某些系统可能丢弃
回显请求。
-S srcaddr 要使用的源地址。
-c compartment 路由隔离舱标识符。
-p Ping Hyper-V 网络虚拟化提供程序地址。
-4 强制使用 IPv4。
-6 强制使用 IPv6。
2. tracert命令,利用 TTL字段和 ICMP差错类型报文,查找 IP数据报的路由转发路径(含路由器信息)。源主机执行该命令向目的主机发送存时间(TTL)不同的 ICMP回送请求报文,直至收到目的主机应答,并通过分析应答报文获得转发路径和时延信息。
首先源主机发起一个 TTL=1的 ICMP报文。第一个路由器收到该报文后,TTL减 1变为 0并丢弃此报文,返回一个 [ICMP timeexceeded]的消息。源主机通过这个消息获知 IP数据报转发路径上的第一个路由器信息。然后,依次增加发送ICMP报文的 TTL值,可以获取路径上的后续路由器的信息。当到达目的地时,目标主机返回一个 [ICMPportunreachable] 的消息,使发起者确认 IP数据报已经正常到达。至此,tracert命令发起者已经获得了通向目标主机路径上的所有路由信息。tracert 命令(Linux)格式和常用参数罗列如下:
用法: tracert [-d] [-h maximum_hops] [-j host-list] [-w timeout]
[-R] [-S srcaddr] [-4] [-6] target_name
选项:
-d 不将地址解析成主机名。
-h maximum_hops 搜索目标的最大跃点数。
-j host-list 与主机列表一起的松散源路由(仅适用于 IPv4)。
-w timeout 等待每个回复的超时时间(以毫秒为单位)。
-R 跟踪往返行程路径(仅适用于 IPv6)。
-S srcaddr 要使用的源地址(仅适用于 IPv6)。
-4 强制使用 IPv4。
-6 强制使用 IPv6。
3.3 实验方法和手段
- 使用 Wireshark软件,捕获本机在 ping和 tracert网络命令执行过程中接收和发出的全部数据流量。
2. 合理设置过滤条件,观察 IP数据报和 ICMP报文,着重分析报文首部和内容变化,从而掌握协议的工作原理。
3. 调整 ping命令的参数,观察并分析 IP数据报分片情况。
4. 结合所捕获的数据报,画出 tracert命令过程中数据交互示意图。
四. 实验条件
装有 Wireshark 软件的 PC 机一台,处于局域网环境。
参考资料:
•J.FKuroseandK.W.Ross,WiresharkLab:ICMPv8.0
•Wireshark官方过滤器语法指导书
•IP协议的 RFC
五. 实验步骤
5.1 ping命令
本机启动Wireshark软件,选择要监听的网络接口(如eth0、wlan0);
本物理机IP:192.168.1.101
默认网关:19.168.1.1
同网段另一台主机IP:192.168.1.103
然后,在终端发起网络命令:pingIP地址/域名。
1、在Wireshark监视器中设置过滤条件。例如图1.2–3设置过滤条件为 icmp,则显示出所捕获的 ICMP数据包。
2、点击Internet Protocol Version 4展开(如图1.2–4),查看 IP数据报,特别观察IP数据报的首部字段及其内容。
字段 | 含义 |
Ip协议版本号 | IPv4 |
服务类型 | DSCP:CS0, ECN:Not-ECT |
IP报文头长度 | 20bytes,说明没有使用可选字段 |
数据报总长度 | 60 |
标识 | 0x3e83(16003) |
数据报是否要求分段 | Not set |
分段偏移量 | 0 |
在发送过程中经过几个路由器 | 128-64=64 |
上层协议名称 | ICMP |
报文头校验和 | 0x0000 |
源地址 | 192.168.1.101 |
目的地址 | 192.168.1.103 |
3、点击Internet Control Message Protocol展开(如图1.2–5),查看 ICMP报文,并解释回显(Echo Request 和 Echo Reply)报文的首部字段。
4、清空 Wireshark监控器,重新发起网络命令(如图1.2–6):pingIP地址/域名 –l #length,并解释对比前后两次执行 ping 命令的结果。其中,-l #length确定 echo数据报的长度为 #length,其默认值为 32字节,且小于 65,527字节。
测试一:
C:\WINDOWS\system32>ping 192.168.1.103
测试二:
C:\WINDOWS\system32>ping 192.168.1.103 -l 1688
5、可以多次改变 #length的大小(例如 1000字节、2000字节和 4000字节),观察IP数据报何时会分片?请解释 IP数据报分片的原因和具体情况。
提示:请先确认该网络的 MTU,可在 Wireshark记录中查找“IPv4 fragments”项目。
经过大量测试,ping的长度在1480的时候开始分片。
C:\WINDOWS\system32>ping 192.168.1.103 -l 1480
IP数据报分片的原因:
数据链路层具有最大传输单元MTU这个特性,它限制了数据帧的最大长度。通常要传输的IP报文的大小超过最大传输单位MTU时就会产生IP分片情况,IP分片经常发生在网络环境当中。
IP数据报分片的具体情况:
分片和重新组装的过程对传输层是透明的,其原因是当IP数据报进行分片之后,只有当它到达下一站时,才可进行重新组装,且它是由目的端的IP层来完成的。分片之后的数据报根据需要也可以再次进行分片。
IP分片和完整IP报文差不多拥有相同的IP头,ID域对于每个分片都是一致的,这样才能在重新组装的时候识别出来自同一个IP报文的分片。在IP头里面,16位识别号唯一记录了一个IP包的ID(ipid),具有同一个ID的IP分片将会重新组装;而13位片偏移则记录了某IP片相对整个包的位置;而这两个表中间的3位标志则标志着该分片后面是否还有新的分片。这三个域就组成了IP分片的所有信息, 接受方就可以利用这些信息对IP数据进行重新组织。
5.2 tracert命令
本机启动Wireshark软件,选择要监听的网络接口(如eth0、wlan0);
然后,在终端发起网络命令:tracert IP地址/域名。
本物理机IP:192.168.1.101
默认网关:19.168.1.1
同网段另一台主机IP:192.168.1.103
1、启动Wireshark软件,选择要监听的网络接口,设置过滤条件 icmp(如图1.2–7)。
2、在终端中使用tracert命令,目的主机是外网的一台设备(如图1.2–8,示例 IP为 192.168.1.103)。
C:\WINDOWS\system32>tracert 192.168.1.103
3、点击 Internet Control Message Protocol 展开,查看 ICMP 报文,观察并解释ICMP报文结构和字段内容。
4、结合 ICMP 报文记录画出数据交互示意图,并描述 tracert工作原理。
tracert工作原理:
Tracert 命令用 IP 生存时间 (TTL) 字段和 ICMP 错误消息来确定从一个主机到网络上其他主机的路由。
首先,tracert送出一个TTL是1的IP 数据包到目的地,当路径上的第一个路由器收到这个数据包时,它将TTL减1。此时,TTL变为0,所以该路由器会将此数据包丢掉,并送回一个「ICMP time exceeded」消息(包括发IP包的源地址,IP包的所有内容及路由器的IP地址),tracert 收到这个消息后,便知道这个路由器存在于这个路径上,接着tracert 再送出另一个TTL是2 的数据包,发现第2个路由器...... tracert 每次将送出的数据包的TTL 加1来发现另一个路由器,这个重复的动作一直持续到某个数据包 抵达目的地。当数据包到达目的地后,该主机则不会送回ICMP time exceeded消息,一旦到达目的地,由于tracert通过UDP数据包向不常见端口(30000以上)发送数据包,因此会收到「ICMP port unreachable」消息,故可判断到达目的地。
tracert 有一个固定的时间等待响应(ICMP TTL到期消息)。如果这个时间过了,它将打印出一系列的*号表明:在这个路径上,这个设备不能在给定的时间内发出ICMP TTL到期消息的响应。然后,Tracert给TTL记数器加1,继续进行。(注意:默认是最多30跳就结束 )
七.实验报告内容
本次实验需提交一份实验报告以及相关的数据报文保存文件。报告内容应当包括以下三个部分,其中的分析解释都有对应的截图,且与保存文件一致。
1、实施 ping命令,记录引发的 IP数据报和 ICMP报文,保存为 pcapng类型文件;解释任一个IP数据报的首部,并对比ICMPEcho请求帧和回应帧;改变ping的长度参数,解释 IP数据报分片情况。
ping.pcapng 百度网盘下载
链接: https://pan.baidu.com/s/1uogOA-XSO27FOYOiAChVkQ?pwd=kac7
提取码: kac7
2、实施 tracert命令,记录引发的 ICMP报文,保存为 pcapng类型文件;解释任一个ICMP差错报文的结构;描述 tracert工作原理,结合 ICMP报文记录画出数据交互示意图。
tracert.pcapng 百度网盘下载
链接: https://pan.baidu.com/s/1jeL1NsWO15_jSue2prx-JQ?pwd=ef8t
提取码: ef8t
3、记录自己在本次实验中所遇到的问题,以及心得感悟。如果遇到异常情况,或者无法完成的任务时,也请分析错误产生的原因。
遇到的问题:
观察ip数据报何时会分片时,由于不确定大概数值,我数据都测试到60000了,还一直提示 NO set,最后还是通过查看了“IPv4 fragments”,才知道详情,最后才确定是1480,才再一次测试成功。
感悟:
实际操作和理论还是有很大的差距的。
实验报告要求至少包含以下几个部分:
·姓名,学号
·数据报文的相关截图
·相关分析和结论
·相关问题和解决方法