lwIP TCP/IP 协议栈笔记之十三: ICMP协议

目录1. 简介2. ICMP 报文结构3. ICMP 报文类型3.1 ICMP 差错报告报文3.1.1 目的不可达3.1.2源站抑制3.1.3 重定向3.1.4 超时3.1.5参数错误3.2 ICMP 查询报文4. LwIP 中的ICMP 实现4.1 ICMP 报文数据结构4.2 发送ICMP 差错报文4.3 处理 ICMP 报文1...
摘要由CSDN通过智能技术生成

目录

1. 简介

2. ICMP 报文结构

3. ICMP 报文类型

3.1 ICMP 差错报告报文

3.1.1 目的不可达

3.1.2 源站抑制

3.1.3 重定向

3.1.4 超时

3.1.5 参数错误

3.2 ICMP 查询报文

 4. LwIP 中的ICMP 实现

4.1 ICMP 报文数据结构

4.2 发送ICMP 差错报文

4.3 处理 ICMP 报文


1. 简介

ICMP 是“Internet Control Message Protocol”(因特网控制报文协议)的缩写。IP 协议是一种不可靠、无连接的协议,只在各个主机间交付数据,但是对于数据的到达与否,IP 协议并不关心,为了提高数据交付的准确性,ICMP 就随之出现,在交付数据的时候,如果由于网络状况、链路不通等情况数据报无法到达目标主机,ICMP 就会返回一个差错报文,让源主机知道数据没能正常到达目标主机,接着进行重发或者放弃发送都可以。如在IP 数据报生存时间TTL 为0 的时候,路由器不再对数据报进行转发操作,而是会直接丢弃这个数据报,并且返回一个ICMP 报文,告诉源主机。

为什么需要ICMP,因为IP 协议认为丢掉没用的数据是合理的,这样子能提高数据处理的效率,但是源主机更希望能得到当数据没能发送到目标的时候有个回应,不然目标主机都不知道发的数据到了哪里,到达接收没用,就像石沉大海一样,这是不可接受的。此外,ICMP 也被主机和路由器用来彼此沟通网络层的信息,如果链路都连不通,那发送数据就是没有意义的事情,ICMP 报文虽然不传输用户数据,但是对于用户数据的传递起着重要的作用。

ICMP 最典型的用途是差错报告。例如,当运行一个FTP 或HTTP 应用时,也许会遇到一些诸如“目的不可达”之类的错误报文,这种报文就是在ICMP 中产生的,可能在转发的时候,在某个位置,路由器不能找到一条合适的路径转发该数据包以通往FTP 或HTTP 应用所指定的主机,该路由器就会向源主机创建和发出一个类型为3 的ICMP 报文以指示该错误(目的不可达)。

ICMP 通常被认为是IP 层协议的一部分,但从体系结构上讲它是位于IP 之上的,因为ICMP 报文是承载在IP 数据报中的。这就是说,ICMP 报文是作为IP 数据报数据区域的(有一些书籍也称之为有效载荷),就像TCP 与UDP 报文段作为IP 数据报数据区域那样。类似地,当一台主机收到一个指明上层协议为ICMP 的IP 数据报时,它将分解出该数据报的内容给ICMP,就像分解出一个数据报的内容给TCP 或UDP 一样,但与TCP 或UDP 协议又有所不同,ICMP 出现的目的不是为上层应用程序提供服务,只是在IP 层传递差错的报文,依赖于IP 协议进行传输。

2. ICMP 报文结构

ICMP 报文是使用IP 数据报来封装发送的,所以ICMP 报文也是没有额外的可靠性与优先级,它一样会被别的路由器丢弃,与此同时,ICMP 报文封装在IP 数据报中,IP 数据报封装在以太网帧中,因此ICMP 报文是经过了两次的封装。

ICMP 报文格式 

ICMP 报文与IP 数据报一样,都是由首部与数据区域组成,ICMP 首部是8 个字节,对于不同类型的ICMP 报文,ICMP 报文首部的格式也会有点差异,但是首部的前4 个字节都是通用的: 

第一个字节(占据8bit 空间)是类型(Type)字段,表示产生这种类型ICMP 报文的原因。

第二个字节是代码(Code)字段,它进一步描述了产生这种类型ICMP 报文的具体原因。因为每种类型的报文都可能有多个,比如目的不可达报文,产生这种原因可能有主机不可达、协议不可达、端口不可达等多个原因。

接下来的校验和字段(占据16bit)用于记录包括ICMP 报文数据部分在内的整个ICMP 数据报的校验和,以检验报文在传输过程中是否出现了差错,其计算方法与在我们介绍IP 数据包首部中的校验和计算方法是一样的。

剩下的4 个字节部分在讲解报文类型的时候详细讲解,因为不同类型的报文都有不一样的定义,并且数据部分的长度也存在差异。

3. ICMP 报文类型

ICMP 报文有两大类型,可以划分为差错报告报文和查询报文,差错报告报文主要是用来向IP 数据报源主机返回一个差错报告信息,而这个差错报告信息产生的原因是路由器或者主机不能对当前数据报进行正常的处理,简单来说就是源主机发送的数据报没法到目标主机中,或者到达了目标主机而无法递交给上层协议。

查询报文是用于一台主机向另一台主机发起一个请求,如果目标主机收到这个查询的请求后,就会按照查询报文的格式向源主机做出应答,比如我们使用的ping 命令,它的本质就是一个ICMP 查询报文。

 虽然ICMP 报文很多,但是它并不能纠正错误,它只是借助IP 协议简单报告差错,差错报文是被返回源主机的,因为出现差错了,数据报中唯一可用的就是目标IP 地址与源IP地址,源主机收到ICMP 差错报告后,传递给上层协议,要怎么样处理就不是ICMP 协议的事情了。

3.1 ICMP 差错报告报文

3.1.1 目的不可达

在日常生活中,邮寄包裹会经过多个传递环节,任意一环如果无法传下去,都会返回给寄件人,并附上无法邮寄的原因。同理,当路由器收到一个无法传递下去的IP 数据报时,那么路由器就会丢弃这个数据报,然后返回一个ICMP 目的不可达差错报告报文(类型为3)给IP 报文的源发送方,产生差错的原因有很多,如网络不可达、主机不可达、协议不可达、端口不可达等,在ICMP 报文中的代码字段(Code)就用于记录引起差错的原因。

同时ICMP 目的不可达报文首部剩下的4 字节全部未用,而ICMP 报文数据区域则装载IP 数据报首部及IP 数据报的数据区域前8 字节,为什么需要装载IP 数据报的数据区域中前8 个字节的数据呢?因为IP 数据报的数据区域前8 个字节刚好覆盖了传输层协议中的端口号字段,而IP 数据报首部就拥有目标IP 地址与源IP 地址,当源主机收到这样子的ICMP 报文后,它能根据ICMP 报文的数据区域判断出是哪个数据包出现问题,并且IP 层能够根据端口号将报文传递给对应的上层协议处理,ICMP 目的不可达报文的格式。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值