ICMP(互联网控制消息协议)是用于网络设备之间传递控制消息的网络层协议。它的主要作用是:
- 错误报告:ICMP可以在网络中传递错误报告消息,如主机不可达、端口不可达等。
- 重定向:ICMP可以在网络中传递路由重定向消息,通知发送端更改路由。
- 参数问题:ICMP可以在网络中传递参数问题消息,如TTL超时等。
- 回显请求:ICMP支持使用Ping命令发出回显请求消息,测试网络连接。
- 回显应答:接收方接收到回显请求消息后,使用ICMP回显应答消息进行回复。
- 时间戳请求:ICMP支持使用Traceroute命令发出时间戳请求消息,测试网络延迟和路径。
- 地址屏蔽请求:ICMP支持使用IPv6下的度量命令发出地址屏蔽请求,测试地址可达性。
ICMP消息类型主要包含:
- 错误报告:3(网关不可达)、4(源断开)、5(重定向)、11(TTL超时)等。
- 回显请求/应答:8(回显请求)、0(回显应答)。
- 时间戳请求/应答:13(时间戳请求)、14(时间戳应答)。
代码示例:
python
# 使用ICMP socket发出Ping请求
import os
import socket
ICMP_ECHO_REQUEST = 8
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
while True:
data = "abcdefghijklmnopqrs"
s.sendto(data.encode(), (target_host, 0))
data_recv, address = s.recvfrom(512)
# 检查接收到的数据包是否为ICMP回显应答
if data_recv[20:28] == data:
print("Ping success!")
time.sleep(1) # 等待1秒钟
python
# 使用Traceroute跟踪路由
for ttl in range(1, max_hops):
s.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, ttl)
s.sendto(data.encode(), (target_host, 0))
_, address = s.recvfrom(512)
print(f"{ttl} {address[0]}") # 打印中间路由跳点地址
ICMP协议为IP协议提供重要的控制消息和测试功能,是管理和故障排除网络问题的必要工具,也是学习网络知识的重要实验手段。