Educoder | 计算机网络实验-Ping命令与ICMP协议分析

第1关:抓取Ping命令中的ICMP包

任务描述

本关任务:捕获 Ping 程序生成的数据包。

相关知识

为了完成本关任务,你需要掌握:

  1. 指定 ping 命令;
  2. 分析过滤出的 ICMP 数据包。

ping命令

Ping 程序是一个简单的工具,允许任何人(例如:网络管理员)验证主机是否存在。源主机中的 Ping 程序将数据包发送到目标 IP 地址; 如果目标是在线的,则目标主机中的 Ping 程序将会发送响应 Ping 数据包证明他在线,这两个 Ping 数据包都是 ICMP 数据包。

  • 在 Unix/Linux,序列号从 0 开始计数,依次递增。而 Windows 中 ping 程序的 ICMP 序列号是没有规律;

  • ICMP 协议在实际传输中的数据包结构:20 字节 IP 首部 + 8 字节 ICMP 首部 + 1472 字节<数据大小> 38 字节

  • ICMP报文格式:IP 首部(20 字节) + 8 位类型 + 8 位代码 + 16 位校验和 + (不同的类型和代码,格式也有所不同)

  • ping命令用法:

  • ping命令选项:

ICMP的应用--ping

ping 是 ICMP 最常见的应用,当我们某一个网站上不去的时候。通常会 ping 一下。ping 会回显出一些有用的信息。 ping 程序利用 ICMP 协议包来侦测另一个主机是否可达。原理是用类型码为 0 的 ICMP 发请求,受到请求的主机则用类型码为 8 的 ICMP 回应。ping 程序来计算间隔时间,并计算有多少个包被送达。用户就可以判断网络大致的情况。我们可以看到,ping 给出来了传送的时间和 TTL 的数据。

指定ping命令

  1. 打开 Wireshark,开始抓包,在 Linux 系统中,打开虚拟终端执行 ping 命令:ping -n 10 www.baidu.com,我们看到源 ping 程序发送了 10 个查询包。

### Ping命令的工作原理 Ping命令用于测试网络连接状态及其质量。通过发送ICMP回显请求消息给目标主机并等待接收来自该主机的ICMP回显应答消息来验证通信路径是否可达[^1]。 当发起一次Ping操作时,源设备会构建一个ICMP Echo Request(类型8)报文,并将其封装在一个IP里发出;一旦目的端收到这个Echo Request之后就会回复一个对应的ICMP Echo Reply(类型0),同样也是被嵌入到另一个IP分组之中返回给原发者。整个过程可以简单描述如下: 1. 发送方构造ICMP Echo Request数据; 2. 将其作为上层负载打成IPv4/IPv6格式的数据帧传输至接收节点; 3. 接收方解析出ICMP部分的信息后作出回应——即创建相应的Reply响应; 4. 这个答复再次经过相同的流程逆向传回到最初的询问者那里完成一轮交互循环。 这种机制不仅能够确认两台机器间的连通状况如何,还可以测量往返时间(RTT),从而评估链路性能的好坏程度。 #### ICMP协议详解 Internet控制消息协议(ICMP)属于TCP/IP模型中的网际层组件之一,主要负责传递有路由选择错误、拥塞情况以及其他异常事件的通知信息给应用程序或者操作系统本身处理[^2]。除了支持像Ping这样的诊断工具外,在其他方面也有广泛应用场景比如Traceroute用来发现到达远程位置所经过的所有中间跳数等。 ICMP报文通常由三部分组成:固定长度为四个字节的首部字段加上可变大小的内容区域再加上校验和计算范围覆盖整个PDU(Protocol Data Unit)[^3]。具体来说, - **Type**: 表明当前消息种类,如上述提到过的Request (8)/Reply (0); - **Code**: 对type做进一步补充说明,默认情况下设为零表示无特殊含义; - **Checksum**: 保障数据完整性的一种手段,通过对全部有效载荷实施CRC算法得出的结果值; ```python import struct def calculate_checksum(data): """Calculate checksum of data""" sum = 0 for i in range(0, len(data), 2): if i + 1 >= len(data): sum += ord(data[i]) & 0xFF else: w = ((ord(data[i]) << 8) & 0xFF00) + (ord(data[i+1]) & 0xFF) sum += w while (sum >> 16) > 0: sum = (sum & 0xFFFF) + (sum >> 16) return ~sum & 0xFFFF # Example usage with an echo request packet creation echo_request_type = 8 # Type field value for Echo Requests code_value_zero = 0 # Code set to zero as per standard practice identifier_field = b'\x1a\x2b' # Identifier can be any two-byte sequence; here we use arbitrary values. sequence_number = b'\xc8\x7d' # Sequence number also takes up exactly two bytes. pseudo_header = struct.pack('!BBHHH', echo_request_type, code_value_zero, 0, int.from_bytes(identifier_field,'big'), int.from_bytes(sequence_number,'big')) checksum_result = calculate_checksum(pseudo_header+b'data') # Replace 'data' with actual payload content when implementing fully functional ping utility. print(f"Calculated Checksum Value: {hex(checksum_result)}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值