ICMP协议全称为Internet Control Message Protocol,互联网控制消息协议。它的主要作用是在IP主机和路由器之间传送控制消息和错误消息。
ICMP协议的主要功能:
- 检测网络可达性:使用ICMP Echo请求和回显响应报文检查网络是否可达。这是PING命令的基础。
2.报告错误:如网络、端口、协议不可达。接收方会发送ICMP错误报告给发送方。 - 负载报告:报告TTL字段减小为0的情况。用于实现TTL检查和定向功能。
- 重定向:当路由器接收数据报文时,会报告目的地址和该路由器的地址,用于修正发送方的路由表。
- 路由器通告:路由器周期性地发送ICMP类型9报文来进行路由更新。
- 地址掩码请求:主机可以请求其子网掩码,路由器会响应其掩码值。
ICMP报文类型:
类型值 名称 说明
0 Echo Reply 回显响应
3 Destination Unreachable 目的地不可达
4 Source Quench 源端限制
5 Redirect 重定向
8 Echo Request 回显请求
11 Time Exceeded 超时
12 Parameter Problem 参数问题
13 Timestamp 时间戳请求
14 Timestamp Reply 时间戳响应
15 Information Request 信息请求
16 Information Reply 信息响应
代码示例:
python
import socket
import time
# 发送ICMP回显请求报文
def ping(host):
sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP)
sock.settimeout(1)
now = time.time()
sock.sendto(b'', (host, 80))
try:
data, addr = sock.recvfrom(1024) # 接收ICMP回显响应
delay = time.time() - now
print('来自%s的回显: 时延%.3fms' % (addr[0], delay*1000))
except socket.timeout:
print('%s请求超时' % host)
if __name__ == '__main__':
ping('127.0.0.1') # 本地主机
ping('www.baidu.com') # 外部主机