Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
ICMP
ICMP协议的简单介绍
发布于 2021-07-31 09:47:21 浏览:1087
订阅该版
[tocm] ## ICMP ### ICMP功能简介 IP是一种不可靠、无连接的协议,只在各个主机间交付数据,但是**对于数据的到达与否,IP并不关心**。为了提高数据交付的准确性,ICMP(Internet Control Message Protocol , 因特网控制报文协议)随之出现。在交付数据时,如果由于网络状况不佳、链路不通等情况导致数据报无法到达目标主机,ICMP就会返回一个差错报文,让源主机知道数据没能正常到达目标主机,接着进行重发或者放弃发送都可以。 ICMP通常被认为是IP层协议的一部分,但从体系结构上讲它是位于IP层之上的,因为ICMP报文是承载在IP数据报中的。这就是说:**ICMP报文是作为IP数据报数据区域的,就像TCP与UDP报文作为IP数据报区域那样。**类似的,**当一台主机收到一个指明上层协议为ICMP的IP数据报时**,它将分解出该数据报的内容给ICMP,就像分解出一个数据报的内容给TCP或UDP一样,但与TCP或UDP又有所不同,**ICMP不是为上层应用程序提供服务,而只是在IP层传递差错信息的报文,依赖于IP进行传输。** ### ICMP报文结构 ICMP报文是使用IP数据报来封装发送的,所以ICMP报文也没有额外的可靠性与优先级,它一样会被别的路由器丢弃。与此同时,ICMP报文封装在IP数据报中,IP数据报封装在以太网中,因此ICMP报文经过了两次封装,具体如下述所示:  ICMP报文与IP报文一样,都由首部与数据区域组成,ICMP首部是8个字节,对于不同类型的ICMP报文,ICMP报文首部的格式也会略有不同,但首部的前四个字节是通用的。 **第一个字节:**占据8bit空间,是类型(type)字段,表示产生这种类型ICMP报文的原因。 **第二个字节:**占据8bit空间,是代码(code)字段,进一步描述了产生这种类型ICMP报文的具体原因。每种类型的报文都可能有多个,比如目的不可达报文,产生这种报文的原因可能有主机不可达、协议不可达、端口不可达等。 **第三个字节:**占据16bit空间,是校验和字段,用于记录包括ICMP报文数据部分在内的整个ICMP数据报的校验和,以检验报文在传输过程中是否出现了差错,其计算方法与IP数据报中首部校验和的计算方法是一样的。 ICMP首部剩下的四个字节会因为不同类型的报文而有不一样的定义,并且数据部分的长度也存在差异。ICMP报文格式如下图所示:  ### ICMP报文类型 **ICMP报文可以划分为**
**差错报告报文**
和
**查询报文**
两类。**差错报告报文**主要用来向IP数据报源主机返回一个差错报告信息,而产生这个差错报告信息的原因是路由器或者主机不能对当前数据进行正常的处理,简单来说,就是源主机发送的数据报无法到达目标主机,或者到达了目标主机而无法递交给上层协议。 **查询报文**适用于一台主机向另一台主机发送一个请求情况,如果目标主机收到这个查询的请求后,就会按照查询报文的格式向源主机做出应答,比如我们使用的ping命令,它的本质就是一个ICMP查询报文。 差错报告报文与查询报文的具体类型如下表所示:  虽然ICMP报文有很多,但是它并不能纠正错误,只是借助IP简单报告差错,然后将差错报文返回源主机。因为如果出现差错,那么数据报中可用的就只有目标IP地址和源IP地址,源主机收到ICMP差错报文后,传递给上层协议,至于要如何处理差错就不在ICMP的作用范围内。 #### ICMP差错报告报文 **目的不可达:**当路由器或主机不能交付数据报时就向源主机发送终点(目的)不可达的报文。 **超时:**IP数据报首部有一个TTL字段,当IP数据报每经过一个路由器转发,TTL的值就会减1,如果TTL的值被减到0,那么路由或者主机就会丢弃该数据报,并返回一个ICMP超时报文到源主机中。此外,在数据报分片重装的时候也使用了ICMP报文,当所有的IP分片数据报无法在规定的时间内完成重装时,主机也会认为它超时了,那么这些数据报就会被删除,同时返回一个ICMP超时报文到源主机中。 **参数问题:**IP数据报在网络中传输时,都是根据其首部进行识别的,如果首部出现错误,那么就会产生严重的问题,因此**如果IP数据报首部出现错误就会丢弃数据报,并且向源主机返回一个ICMP参数错误表。**不过,
**对于携带ICMP差错报文的数据报、非第一个分片的分片数据报、具有特殊目的地的数据报(如环回、多播、广播)等,即使出现了差错,也不会返回对应的差错报文。**
**重定向:**一般来说,某个主机在启动的时候只有一个路由表(即:默认路由),所以它发送的数据都发给了默认路由,让其帮忙转发,而路由器发现数据应该是发送给另一个路由的,那么它会返回一个ICMP重定向报文给源主机,告诉源主机应该直接发给另一个路由器。**重定向一般用来让刚启动的主机逐渐建立更完善的路由表**,
**重定向报文只能有路由器生成而不能有主机生成,但是使用重定向报文的只能是主机而非路由器**
。 在主机刚开始工作时,一般都在路由表中设置一个默认路由器的IP地址,不管数据报要发送到哪个目的地,都一律先把数据报传送给这个默认路由器,而这个默认路由器知道到每一个目的网络的最佳路由(通过和其他路由器交换路由信息)。如果路由器发现主机发往某个目的地址的数据报的最佳路由应该经过网络上的另一个路由器R时,就会发送重定向的ICMP报文将此情况告诉主机。于是主机就会在其路由表中增加一个项目:到某某目的地址应该经过路由器R(而不是默认路由器)。 **所有ICMP差错报文中的数据字段都具有同样的格式:把收到的需要进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来,作为ICMP报文的数据字段,再加上相应的ICMP差错报文的前8个字节,就构成了ICMP差错报告报文。**如下图所示:  提取收到的数据报的数据字段前8个字节是为了得到运输层的端口号(对于TCP和UDP)以及运输层报文的发送序号(对于TCP),这些信息对源主机通知高层协议是有用的,然后整个ICMP报文作为IP数据报的数据字段发送给源主机。 #### ICMP查询报文 ICMP的查询报文常见的只有两种: **回送请求和回答:**ICMP回送请求报文是由主机或路由器向一个特定的目的主机发出的询问。收到此报文的主机必须给源主机或路由器发送ICMP回送回答报文。这种询问报文用来测试目的站是否可达以及了解其有关状态。 **时间戳请求和应答:**ICMP时间戳请求报文是请某台主机或路由器回答当前的日期和时间。在ICMP时间戳回答报文中有一个32位的字段,其中写入的整数代表从1900年1月1日起到当前时刻一共多少秒。**时间戳请求和回答可用于时钟同步和时间测量。** ICMP查询报文最通用的一个事例是**ping命令**,用来测试两台主机之间的连通性。ping是应用层直接使用
**网络层ICMP**
的一个例子,**它没有通过传输层的TCP或UDP。**Windows操作系统的用户可以在接入互联网后,在CMD中输入**ping hostname(hostname是要测试连通性的主机名或它的IP地址)**,按回车键后就可看到结果。
1
条评论
默认排序
按发布时间排序
登录
注册新账号
关于作者
ZBXY_7941
这家伙很懒,什么也没写!
文章
4
回答
35
被采纳
4
关注TA
发私信
相关文章
1
stm32f207ve+rtt2.1 ping checksum错误
2
lwip组件通过ping 主机名实现ping主机功能
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
国产MCU移植系列教程汇总,欢迎查看!
4
机器人操作系统 (ROS2) 和 RT-Thread 通信
5
五分钟玩转RT-Thread新社区
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
热门标签
RT-Thread Studio
串口
Env
LWIP
SPI
AT
Bootloader
Hardfault
CAN总线
FinSH
ART-Pi
DMA
USB
文件系统
RT-Thread
SCons
RT-Thread Nano
线程
MQTT
STM32
RTC
rt-smart
FAL
I2C_IIC
UART
ESP8266
cubemx
WIZnet_W5500
ota在线升级
PWM
BSP
flash
freemodbus
packages_软件包
潘多拉开发板_Pandora
定时器
ADC
GD32
flashDB
socket
编译报错
中断
Debug
rt_mq_消息队列_msg_queue
keil_MDK
ulog
SFUD
msh
C++_cpp
MicroPython
本月问答贡献
RTT_逍遥
10
个答案
3
次被采纳
xiaorui
3
个答案
2
次被采纳
winfeng
2
个答案
2
次被采纳
三世执戟
8
个答案
1
次被采纳
KunYi
8
个答案
1
次被采纳
本月文章贡献
catcatbing
3
篇文章
5
次点赞
lizimu
2
篇文章
9
次点赞
swet123
1
篇文章
4
次点赞
Days
1
篇文章
4
次点赞
YZRD
1
篇文章
2
次点赞
回到
顶部
发布
问题
投诉
建议
回到
底部