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

ICMP协议全称为Internet Control Message Protocol,互联网控制消息协议。它的主要作用是在IP主机和路由器之间传送控制消息和错误消息。

ICMP协议的主要功能:

  1. 检测网络可达性:使用ICMP Echo请求和回显响应报文检查网络是否可达。这是PING命令的基础。
    2.报告错误:如网络、端口、协议不可达。接收方会发送ICMP错误报告给发送方。
  2. 负载报告:报告TTL字段减小为0的情况。用于实现TTL检查和定向功能。
  3. 重定向:当路由器接收数据报文时,会报告目的地址和该路由器的地址,用于修正发送方的路由表。
  4. 路由器通告:路由器周期性地发送ICMP类型9报文来进行路由更新。
  5. 地址掩码请求:主机可以请求其子网掩码,路由器会响应其掩码值。

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')   # 外部主机