ICMP协议

MP(Internet Control Message Protocol, Internet控制报文协议),协议号为1,封装在IP报文
中,用来传递差错、控制、查询等信息,典型应用ping/tracert依赖ICMP报文。

ICMP应用-ping

Echo Request和Echo Reply分别用来查询和响应某些信息,进行差错检测。

ICMP应用-tracert

一起看看下面的习题吧:

1、ping使用了( )类型的ICMP查询报文。
A.Echo Reply
C.Redirect for Host
B.Host Unreachable
D.Source Queach

解析:A。Ping使用echo request和echo reply。

2、ICMP是TCP/IP分层模型第三层协议,其报文封装在( )中传送。
A.以太帧             B.IP数据报            C.UDP报文       D.TCP报文

解析:B。ICMP、OSPF都封装在IP中,RIP封装于UDP520,BGP封装于TCP179。

3、使用ping命令连接目的主机,收到连接不通报文。此时ping命令使用的是ICMP的( )。
A.IP参数问题           B.回声请求与响应       C.目的主机不可达         D.目的网络不可

解析:C。

### 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
发出的红包

打赏作者

当你需要个夏天217

感谢老板的赏赐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值