ICMP协议

ICMP全称Internet Control Message Protocol(网际控制信息协议)。提起ICMP,一些人可能会感到陌生,实际上,ICMP与我们息息相关。在网络体系结构的各层次中,都需要控制,而不同的层次有不同的分工和控制内容,IP层的控制功能是最复杂的,主要负责差错控制、拥塞控制等,任何控制都是建立在信息的基础之上的,在基于IP数据报的网络体系中,网关必须自己处理数据报的传输工作,而IP协议自身没有内在机制来获取差错信息并处理。为了处理这些错误,TCP/IP设计了ICMP协议,当某个网关发现传输错误时,立即向信源主机发送ICMP报文,报告出错信息,让信源主机采取相应处理措施,它是一种差错和控制报文协议,不仅用于传输差错报文,还传输控制报文。

二、ICMP报文格式

ICMP报文包含在IP数据报中,属于IP的一个用户,IP头部就在ICMP报文的前面,所以一个ICMP报文包括IP头部、ICMP头部和ICMP报文(见图表,ICMP报文的结构和几种常见的ICMP报文格式),IP头部的Protocol值为1就说明这是一个ICMP报文,ICMP头部中的类型(Type)域用于说明ICMP报文的作用及格式,此外还有一个代码(Code)域用于详细说明某种ICMP报文的类型,所有数据都在ICMP头部后面。RFC定义了13种ICMP报文格式,具体如下:

类型代码 类型描述

0 响应应答(ECHO-REPLY)
3 不可到达
4 源抑制
5 重定向
8 响应请求(ECHO-REQUEST)
11 超时
12 参数失灵
13 时间戳请求
14 时间戳应答
15 信息请求(*已作废)
16 信息应答(*已作废)
17 地址掩码请求
18 地址掩码应答

其中代码为15、16的信息报文已经作废。

下面是几种常见的ICMP报文:

1.响应请求

我们日常使用最多的ping,就是响应请求(Type=8)和应答(Type=0),一台主机向一个节点发送一个Type=8的ICMP报文,如果途中没有异常(例如被路由器丢弃、目标不回应ICMP或传输失败),则目标返回Type=0的ICMP报文,说明这台主机存在,更详细的tracert通过计算ICMP报文通过的节点来确定主机与目标之间的网络距离。

2.目标不可到达、源抑制和超时报文

这三种报文的格式是一样的,目标不可到达报文(Type=3)在路由器或主机不能传递数据报时使用,例如我们要连接对方一个不存在的系统端口(端口号小于1024)时,将返回Type=3、Code=3的ICMP报文,它要告诉我们:“嘿,别连接了,我不在家的!”,常见的不可到达类型还有网络不可到达(Code=0)、主机不可到达(Code=1)、协议不可到达(Code=2)等。源抑制则充当一个控制流量的角色,它通知主机减少数据报流量,由于ICMP没有恢复传输的报文,所以只要停止该报文,主机就会逐渐恢复传输速率。最后,无连接方式网络的问题就是数据报会丢失,或者长时间在网络游荡而找不到目标,或者拥塞导致主机在规定时间内无法重组数据报分段,这时就要触发ICMP超时报文的产生。超时报文的代码域有两种取值:Code=0表示传输超时,Code=1表示重组分段超时。

3.时间戳

时间戳请求报文(Type=13)和时间戳应答报文(Type=14)用于测试两台主机之间数据报来回一次的传输时间。传输时,主机填充原始时间戳,接收方收到请求后填充接收时间戳后以Type=14的报文格式返回,发送方计算这个时间差。一些系统不响应这种报文。 

### ICMP协议详解 ICMPInternet Control Message Protocol)即互联网控制消息协议,是TCP/IP协议族中的一个子协议,主要用于在IP网络中传递控制消息。它为网络设备提供了一种发送错误消息、获取信息以及进行网络诊断的机制。 #### 工作原理 ICMP工作网络层,通常与IP协议一起使用,但它本身并不提供传输服务,而是作为IP协议的一部分,用于报告IP数据报传输过程中的错误和异常情况。ICMP报文被封装在IP数据报的数据部分,其基本结构包括类型(Type)、代码(Code)和校验和(Checksum)等字段。不同类型和代码的组合表示不同的ICMP报文类型,如回显请求(Echo Request)和回显应答(Echo Reply)等。 ICMP的一个典型应用是`ping`命令,它通过发送ICMP Echo Request报文并等待Echo Reply来测试网络连通性。另一个常见的应用是`traceroute`,它利用ICMP超时消息来确定数据包在网络中的路径。 #### 应用场景 - **网络故障诊断**:利用`ping`和`traceroute`工具来检测网络连通性和路径信息。 - **网络优化**:通过ICMP重定向消息通知主机调整路由以优化网络性能。 - **安全监控**:监控网络中的ICMP消息,可以检测网络攻击和异常行为。 例如,当一个路由器发现某个网络或主机不可达时,它可以发送ICMP Destination Unreachable报文给源主机,告知其具体的问题所在。此外,在进行网络优化时,如果路由器发现有一条更优的路径,可以通过ICMP Redirect报文引导主机更新其路由表。 以下是一个简单的Python代码示例,展示如何使用`scapy`库构造一个ICMP Echo Request报文: ```python from scapy.all import IP, ICMP, sr1 # 构造ICMP Echo Request报文 packet = IP(dst="8.8.8.8") / ICMP() # 发送报文并接收响应 response = sr1(packet, timeout=2) if response: response.show() else: print("No response") ``` 这段代码首先导入了必要的模块,然后构造了一个目标地址为`8.8.8.8`的ICMP Echo Request报文,并使用`sr1`函数发送该报文并等待响应。如果接收到响应,则显示响应报文的信息;如果没有响应,则输出提示信息。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值