ICMP协议是什么?有什么作用?

ICMP(互联网控制消息协议)是用于网络设备之间传递控制消息的网络层协议。它的主要作用是:

  1. 错误报告:ICMP可以在网络中传递错误报告消息,如主机不可达、端口不可达等。
  2. 重定向:ICMP可以在网络中传递路由重定向消息,通知发送端更改路由。
  3. 参数问题:ICMP可以在网络中传递参数问题消息,如TTL超时等。
  4. 回显请求:ICMP支持使用Ping命令发出回显请求消息,测试网络连接。
  5. 回显应答:接收方接收到回显请求消息后,使用ICMP回显应答消息进行回复。
  6. 时间戳请求:ICMP支持使用Traceroute命令发出时间戳请求消息,测试网络延迟和路径。
  7. 地址屏蔽请求: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协议提供重要的控制消息和测试功能,是管理和故障排除网络问题的必要工具,也是学习网络知识的重要实验手段。