网络层协议
- IP:网际协议 Internet Protocol
- ARP:地址解析协议
- ICMP:网际控制报文协议
- IGMP:网际组管理协议
文章目录
ICMP
IP协议本身并没有为终端设备提供直接的方法来发现发往目的地址失败的IP数据包,也不能进行问题诊断。为解决这些不足,将Internet控制报文协议(Internet Control Message Protocol,ICMP)与IP结合使用,以便提供与IP协议层配置和IP数据包处理相关的诊断和控制信息。ICMP是为了主机或者路由器报告差错情况或者提供有关异常情况的报告。ICMP封装在IP数据报中,作为其中的数据部分。
ICMP的头部长度为8字节,后面是ICMP报文的数据部分。ICMP报文实际上还是通过IP层传输,ICMP头部和ICMP数据部分组成完整的报文,然后再添加IP协议头部报文,形成完整的IP报文,然后再通过数据链路层生成以太网帧进行传输
ICMP工作流程
- 向目标发送IP数据包的时候出错,返回差错报告报文
- 向目标发送询问报文,收到回答报文
ICMP报文结构
头部结构
ICMP头部结构的前4个字节是统一的格式,分为类型,代码,校验和
后面4个字节取决于ICMP报文的类型,最后是数据字段
- 类型(Type):用于说明ICMP报文的作用及格式;
- 代码(Code):于详细说明某种ICMP报文的类型;
- 16位校验和(Checksum):涵盖了整个报文,其校验和的计算方法和IP协议校验和算法是一样的;
- 标识符(Identifier):如果是ICMP请求报文,该字段在Linux/macOS中用的是进程ID。如果是ICMP应答报文,则只需拷贝来自ICMP请求报文的标识符字段;
- 序列号(Sequence number):如果是ICMP请求报文,该字段在Linux/macOS中是从0递增的,每个进程独立。如果是ICMP应答报文,则只需拷贝来自ICMP请求报文的序列号字段
- 数据(Optional data):如果是ICMP请求报文,该字段包括时间戳以及一串填充数据。如果是ICMP应答报文,则只需拷贝来自ICMP请求报文的数据字段。
差错报告报文
差错报告报文需要将进行差错报告的IP数据报的首部和数据字段的前8个字节提取出来(TCP、UDP前八字节都含有源端口号,可以反馈给源主机。接收ICMP差错报文的模块就会把它与某个协议和用户进程联系起来),作为ICMP的数据字段