【lwip】10-ICMP协议&源码分析

目录

  • 前言
  • 10.1 ICMP简介
  • 10.2 ICMP报文
    • 10.2.1 ICMP报文格式
    • 10.2.2 ICMP报文类型
    • 10.2.3 ICMP报文固定首部字段意义
  • 10.3 ICMP差错报告报文
    • 10.3.1 目的不可达
    • 10.3.2 源站抑制
    • 10.3.3 重定向(改变路由)
    • 10.3.4 超时
    • 10.3.5 参数错误
  • 10.4 ICMP查询报文
    • 10.4.1 回显
  • 10.5 ICMP数据结构
    • 10.5.1 ICMP数据报数据结构
    • 10.5.2 ICMP类型字段
    • 10.5.3 目的不可达代码字段
    • 10.5.4 超时代码字段
  • 10.6 发送ICMP差错报告
    • 10.6.1 发送ICMP差错报文基函数
    • 10.6.2 icmp_dest_unreach()目的不可达差错报告
    • 10.6.3 icmp_time_exceeded()超时差错报告
  • 10.7 接收ICMP报文处理
前言参考:RFC 792
原文:李柱明博客:https://www.cnblogs.com/lizhuming/p/16861945.html
10.1 ICMP简介IP 协议是一种不可靠、无连接的协议,只在各个主机间交付数据,但是对于数据的到达与否,IP 协议并不关心 。
但是有些源主机希望能得到当数据没能发送到目标的时候有个回应,不然目标主机都不知道发的数据到了哪里 。
所以 IP 协议并不完美,这就出现的 ICMP 。
ICMP 是“Internet Control Message Protocol”(网际报文控制协议)的缩写 。
ICMP协议用于在IP主机、路由器之间传递控制消息,包括数据包错误信息、网络状况信息和主机状况信息等 。
ICMP属于网络层 。
虽然从报文上看ICMP报文是基于IP报文的,但是ICMP从协议和功能上看是属于网络层的,因为ICMP报文的目的不是目的主机的某个应用程序,不为应用程序提供传输服务,而是是IP协议的辅助协议 。
所以其报文主要分两大类:ICMP差错报告报文和ICMP查询报文 。
10.2 ICMP报文10.2.1 ICMP报文格式IPCM报文封装在IP数据区中,如图:
【lwip】10-ICMP协议&源码分析

文章插图
其ICMP报文格式如下图:
【lwip】10-ICMP协议&源码分析

文章插图
ICMP报文由8字节首部和可变长度的数据部分组成 。
不同类型的ICMP报文,ICMP 报文首部的格式也会有点差异,但是首部的前 4 个字节都是通用的:
  • 类型(type)字段:占用1字节 。表示产生这种类型 ICMP 报文的原因 。
  • 代码(code)字段:占用1字节 。进一步描述了产生这种类型 ICMP 报文的具体原因 。
  • 校验和字段:占用2字节 。记录包括 ICMP 报文数据部分在内的整个 ICMP 数据报的校验和 。其计算方法和IP首部校验和一样 。
参考RFC 792
  • 根据各种ICMP报文类型来定义剩余非固定的报文格式 。
  • 也可以参考该协议找到各个字段的意义 。
10.2.2 ICMP报文类型ICMP 报文有两大类型:ICMP差错报告报文和ICMP查询报文 。
ICMP差错报告报文主要是用来向 IP 数据报源主机返回一个差错报告信息,而这个差错报告信息产生的原因是路由器或者主机不能对当前数据报进行正常的处理 。
简单来说就是源主机发送的数据报没法到目标主机中,或者到达了目标主机而无法递交给上层协议 。便会产生ICMP差错报告报文返回给源主机 。
ICMP查询报文用于一台主机向另一台主机发起一个请求,如果目标主机收到这个查询的请求后,就会按照查询报文的格式向源主机做出应答 。如ping 。
结合ICMP报文类型字段的表格:
ICMP报文类型具体类型描述差错报告报文3目的不可达4源站抑制5重定向11超时12参数错误报文查询报文0或8回显请求或回显应答9或10路由器询问或通告13或14时间戳请求或应答15或16信息请求或信息应答17或18掩码请求或应答10.2.3 ICMP报文固定首部字段意义参考

经验总结扩展阅读