ICMP协议

一,介绍。

ICMP协议全称:Internet Control Message Protocol ,即网际控制报文协议。该协议在网络层使用,众所周知,IP协议是不可靠的数据传输服务,它是尽最大努力交付的,不保证数据报到达的顺序,是否重复,以及是否丢失等问题,(这些问题由运输层负则),有了ICMP协议,便是为了有效地转发IP数据报和提高交付成功的机会。。

二,其作用。

ICMP报文分两种,一种是ICMP 差错报告报文,另一种为ICMP询问报文。
我们分两次来说明。
首先对于差错报告报文
1,其组成

前4个字节是统一的格式,它包括1字节的类型字段,1字节的代码字段,以及2字节的检验和字段。
通过类型字段用来区分具体是哪种差错。而检验和字段是因为,IP数据报只提供了首部检验和字段,它并不负责数据的差错检测,因此不能保证经过传输的ICMP报文不产生差错。
ICMP差错报告报文有细分5钟类型。
它包括:
1,终点不可达。 路由器或主机不能交付数据报时便向源点发送该类型报文
2,源点抑制。当路由器或主机由于网络拥塞时需要丢弃数据报时,便向源点发送源点抑制报文,其作用便是告诉源点当前网络情况不好,需要其放慢数据报发送的速率。
3,时间超过。当路由器收到TTL为0的数据报时,除了丢弃该数据包还要向源点发送时间超过报文。当终点不能在预定时间内收到一个数据报的全部数据报片时,便丢弃已收到的数据报片,并向源点发送时间超过报文(IP 数据报长度超过MTU时会进行分片发送)。
4,参数问题。当路由器或目的主机收到的数据报的首部中有字段不正确的时候,便丢弃之,并向源点报告发送参数问题报文。
5,改变路由。路由器把改变路由报文发送给主机,让主机知道下次应将数据报发送给另外的路由器。

其具体组成:所有的ICMP差错报告报文中的数据字段具有相同的格式。它把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段,再加上ICMP差错报告报文的前8个字节,就构成了ICMP差错控制报文。提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号,以及运输层报文的发送序号。

ICMP询问报文:
有两种:1,回送请求和回答。功能:由主机或路由器向一个特定的目的主机发出询问,收到此报文的主机必须给源主机或路由器发送一个ICMP回送回答报文,说明自身是否可达,其有关状态。
2,时间戳请求和回答。请求某个主机或路由器回答当前的时间与日期。
时间戳:自1970.1.1到现在一共过了多少秒。常用来时间同步和测量时间。

三,其应用。
1,分组网间探测。即PING命令。该命令是应用层直接使用网络层ICMP的一个例子,它没有通过运输层的TCP或UDP。用来测试与相应站点的连接情况。
2,traceroute (Unix下),tracert (windows下),用来测试到相应站点需要经过的路径与时间。
Traceroute从源主机发送一连串的IP数据报,数据报中是封装的是无法交付的UDP用户数据报(非法的端口号),第一个数据报的TTL设置为1,当数据报到达第一个路由器时,路由器将它收下后,TTL减为0,然后把它丢弃,并向源主机发送一个ICMP时间超过差错报告报文。
源主机接着发第二次,此次把TTL设置为2,重复上面的过程。直到最后一个数据报刚刚到达目的主机时,数据报的TTL为1,但此时,由于IP数据报中封装的是无法交付的运输层UDP用户数据报,因此主机向源点发送ICMP终点不可达差错报告报文。

四,具体使用。
ping命令
这里写图片描述
tracert命令
这里写图片描述

### 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、付费专栏及课程。

余额充值