ICMP协议

ICMP被认为是IP层的一个组成部分,主要功能有查询报文和差错报文。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。

通过IP包传送的ICMP信息主要用于涉及网络操作或错误操作的不可达信息。ICMP包发送是不可靠的,所以主机不能依靠接收ICMP包解决任何网络问题。
 
ICMP的主要功能如下:
⑴ 发现网络错误。比如,某台主机或整个网络由于某些故障不可达。
⑵ 通告网络拥塞。当路由器缓存太多包,由于传输速度无法达到它们的接收速度,将会生成ICMP源结束信息。对于发送者,这些信息将会导致传输速度降低。当然,更多的ICMP源结束信息的生成也将引起更多的网络拥塞,所以使用起来较为保守。
⑶ 协助解决故障。ICMP支持echo功能,即在两个主机间一个往返路径上发送一个包。Ping是一种基于这种特性的通用网络管理工具,它将传输一系列的包,测量平均往返次数并计算丢失百分比。
⑷ 通告超时。如果一个IP 包的TTL降低到零,路由器就会丢弃此包,这时会生成一个ICMP包通告这一事实。TraceRoute是一个工具,它通过发送小TTL 值的包及监视ICMP 超时通告可以显示网络路由。
 
ICMP报文是在IP数据报内部被传输的。
 
ICMP报文格式
所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。
类型字段可以有15个不同的值,以便描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来进一步描述不同的条件。
检验和字段覆盖整个ICMP报文。使用的算法和IP首部校验和算法相同。ICMP的检验和是必需的。
 
ICMP报文类型
各种类型的ICMP报文由下图所示。不同类型由报文中的类型字段和代码字段来共同决定。
图中的最后两列表明ICMP报文是一份查询报文还是一份差错报文。
 
当发送一份ICMP差错报文时,报文始终包含IP首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来。
 
下面各种情况都不会导致产生ICMP差错报文:
⑴ ICMP差错报文(ICMP查询报文可能会产生ICMP差错报文)
⑵ 目的地址是广播地址或多播地址的IP数据报
⑶ 作为链路层广播的数据报
⑷ 不是IP分片的第一片
⑸ 源地址不是单个主机的数据报。
这些规则是为了防止ICMP差错报文对广播分组响应所带来的广播风暴。
 
ICMP地址掩码请求与应答
ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取IP地址是类似的)。无盘系统获取子网掩码的另一个方法是BOOTP协议。
ICMP地址掩码请求与应答报文格式:
ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。
32位子网掩码段在ICMP地址掩码请求报文中为空,由接收端填写后以应答报文方式发送回源。
 
ICMP端口不可达差错
ICMP不可达报文的一般格式:
 
可用UDP来查看ICMP端口不可达报文(3,3):
UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP将返回一个ICMP不可达报文。
ICMP的一个规则是:ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括在该首部后面的前8个字节。这8个字节包含了TCP或UDP的源目端口号,可以将ICMP差错报文与应用程序联系起来。导致差错的数据报中的IP首部要被差错报文送回的原因是因为IP首部中包含协议字段,使得ICMP知道如何解释后面的8个字节。
ICMP一共有16种不同类型的ICMP不可达报文,代码分别是从0到15。ICMP端口不可达差错代码是3。在ICMP不可达报文中的第二个32bit字必须为0。但当代码为4时,路径MTU发现机制允许路由器把出站接口的MTU填在这个32bit字的低16bit中。
 
注:ICMP时间戳请求与应答报文在现实应用中已被NDP协议取代,故略去不再赘述。
 
 
 
 
参考书籍:
Stevens,W.R.TCP/IP Illustrated,Vol.1.Reading
Comer,D.E.Internetworking with TCP/IP,Vol.1
Jeff Doyle.Routing TCP/IP Vol.1 Second Edition
### ICMP协议的介绍与使用方法 ICMP(Internet Control Message Protocol,互联网控制消息协议)是TCP/IP协议族中的一个重要成员,主要用于在IP网络中传递控制消息和错误信息。ICMP报文作为IP数据报的数据部分进行传输[^1]。它不仅与IP协议紧密相关,还与TCP和UDP等传输层协议协同工作,提供更全面的网络服务。 #### ICMP的基本用途 ICMP的主要功能包括以下几个方面: - **错误报告**:当网络信中发生错误时,ICMP会生成相应的错误消息并发送给源主机。例如,目标不可达(Type=3)、超时(Type=11)等。 - **诊断工具**:ICMP网络诊断提供了重要支持。常见的网络诊断工具有ping和traceroute,它们依赖ICMP实现其功能。 - **流量控制**:过源抑制报文(Source Quench),ICMP可以知发送方减少数据包的发送速率,以缓解网络拥塞问题[^1]。 #### ICMP协议结构 ICMP报文的格式较为简单,主要包括类型字段(Type)、代码字段(Code)、校验和字段(Checksum)以及根据具体类型定义的额外数据。以下是ICMP报文的基本结构: - **Type**:标识ICMP消息的类型。 - **Code**:进一步细化Type字段的具体含义。 - **Checksum**:用于检测ICMP报文的完整性。 - **剩余数据**:根据不同的ICMP消息类型,这部分内容可能包含IP头部或数据部分的信息。 #### 使用场景 1. **MTU探测**:过接收“需要分片”差错报文(Type=3, Code=4),动态调整数据包大小,避免分片带来的性能损失[^2]。 2. **网络性测试**:使用ping命令向目标主机发送ICMP回显请求(Echo Request)报文,并等待回显应答(Echo Reply)报文。 3. **路径跟踪**:使用traceroute命令结合ICMP时间超过(Time Exceeded)报文来确定数据包到达目标主机的路径。 #### 示例代码 以下是一个简单的Python脚本,演示如何使用`socket`库发送ICMP回显请求报文: ```python import socket import struct import os import time def create_packet(id): # Header is type (8), code (8), checksum (16), id (16), sequence (16) header = struct.pack("bbHHh", 8, 0, 0, id, 1) data = struct.pack("d", time.time()) my_checksum = checksum(header + data) header = struct.pack("bbHHh", 8, 0, my_checksum, id, 1) return header + data def checksum(source_string): count_to = (int(len(source_string) / 2)) * 2 sum_ = 0 count = 0 while count < count_to: this_val = source_string[count + 1] * 256 + source_string[count] sum_ += this_val sum_ &= 0xffffffff count += 2 if count_to < len(source_string): sum_ += source_string[-1] sum_ &= 0xffffffff sum_ = (sum_ >> 16) + (sum_ & 0xffff) sum_ += (sum_ >> 16) answer = ~sum_ & 0xffff answer = socket.htons(answer) return answer def send_ping(dest_addr): try: with socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_ICMP) as sock: packet_id = os.getpid() & 0xFFFF packet = create_packet(packet_id) sock.sendto(packet, (dest_addr, 1)) received, _ = sock.recvfrom(1024) print(f"Received: {received}") except PermissionError: print("Raw sockets require administrative privileges.") if __name__ == "__main__": send_ping("8.8.8.8") ``` #### 安全须知 在实际应用中,需要注意ICMP的安全性问题。例如,合理配置防火墙规则以防止ICMP被用于网络侦察;警惕ICMP Flood攻击,限制请求频率;在某些云环境中,ICMP可能被禁用,此时可考虑使用TCP Ping等替代方案[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值