当前位置: 首页 > news >正文

【TCP/IP】6. 差错与控制报文协议

6. 差错与控制报文协议

  • 6. 差错与控制报文协议
    • 6.1 概述
    • 6.2 因特网控制报文协议(ICMP)
    • 6.3 ICMP 报文格式与类型
      • 6.3.1 报文基本格式
      • 6.3.2 报文类型分类
    • 6.4 ICMP 差错报告
      • 6.4.1 差错报告特点
      • 6.4.2 差错报告例外情况
      • 6.4.3 具体差错报告类型
    • 6.5 ICMP 控制报文
      • 6.5.1 源抑制报文(类型 = 4,代码 = 0)
      • 6.5.2 重定向报文(类型 = 5)
    • 6.6 ICMP 请求与应答报文对
      • 6.6.1 回应请求与应答报文(类型 = 8/0,代码 = 0)
      • 6.6.2 时间戳请求与应答报文(类型 = 13/14,代码 = 0)
      • 6.6.3 地址掩码请求与应答报文(类型 = 17/18,代码 = 0)
      • 6.6.4 路由器请求与通告报文(类型 = 10/9,代码 = 0)
    • 6.7 ICMP 报文封装
    • 本章要点

6. 差错与控制报文协议

6.1 概述

因特网控制报文协议(ICMP)是 IP 层的核心补充协议,主要用于实现 IP 层的差错报告拥塞控制路径控制网络设备信息获取

  • 与 IP 的关系:和 IP 同属网络层,ICMP 报文需封装在 IP 数据报的数据部分传输(IP 首部协议字段为 “1”)。
  • IP 层差错控制特点:
    1. 主要解决 “信宿不可达” 问题,因信宿无法直接参与控制,不采用端到端方式;
    2. 仅处理与路径和可达性相关的差错,不解决数据本身的差错;
    3. 差错与控制功能由 ICMP 独立完成,IP 协议不负责;
    4. 控制信息通过 “主动询问” 和 “被动接收报告” 两种方式获取。

6.2 因特网控制报文协议(ICMP)

  • 设计初衷:最初用于 IP 层差错报告,由路由器或信宿向信源一对一报告传输错误原因。
  • 扩展功能:随网络发展,新增检测和控制功能,目前可传输差错报告、控制报文及设备信息查询报文。
  • 核心作用:作为 IP 协议的补充,实现 IP 层的差错处理、拥塞 / 路径控制及路由器 / 主机信息获取。

6.3 ICMP 报文格式与类型

6.3.1 报文基本格式

ICMP 报文由首部(定长 8 字节)和数据段组成,格式如下:

字段长度(字节)含义
类型(TYPE)1指示 ICMP 报文的类型(如差错报告、控制、请求 / 应答等)。
代码(CODE)1进一步细化报文类型(如同一类型下的不同错误原因)。
校验和2对整个 ICMP 报文进行校验(计算方式与 IP 数据报一致)。
首部其他部分4随报文类型变化:差错报告报文多未使用(填 0);参数错报文用 1 字节作指针;请求 / 应答报文用于匹配请求与应答。
数据段可变差错报告时,携带原始出错数据报的首部及前 64 位数据(含关键信息,如上层协议首部);请求 / 应答时,携带相关额外信息。

6.3.2 报文类型分类

ICMP 报文分为三大类:

类别功能典型报文
差错报告向信源报告数据报传输中的错误信宿不可达、超时、参数错
控制报文实现拥塞控制和路径优化源抑制、重定向
请求与应答报文对主动查询设备信息并获取应答回应请求与应答、时间戳请求与应答等

6.4 ICMP 差错报告

ICMP 差错报告用于向信源通知数据报传输中的错误,仅报告错误不纠正,由发现错误的设备(路由器或信宿)向信源发送。

6.4.1 差错报告特点

  1. 只报告差错,纠错由上层协议处理;
  2. 仅向信源报告(不向中间路由器或信宿);
  3. 作为普通数据传输,无优先级和可靠性保障;
  4. 发送差错报告的同时,会丢弃出错的 IP 数据报。

6.4.2 差错报告例外情况

以下场景不产生 ICMP 差错报告:

  1. ICMP 差错报文本身(避免无限循环);
  2. 分片报文的非第一个分片;
  3. 组播地址报文;
  4. 特殊地址(127.0.0.0/8、0.0.0.0)的报文。

6.4.3 具体差错报告类型

  1. 信宿不可达报告(类型 = 3)

    • 触发场景:路由器无法转发数据报,或主机无法向上层协议 / 端口提交数据报。

    • 代码及含义(共 16 种,部分典型如下):

      代码描述产生者
      0网络不可达(路由表错误或目的地址无效)路由器
      1主机不可达(信宿未运行或不存在,网络可达)路由器 / 信宿
      2协议不可达(上层协议未运行,网络和主机可达)信宿
      3端口不可达(对应端口的应用未运行,网络、主机、协议可达)信宿
      4数据报无法分片(DF 位 = 1 且超过 MTU)路由器
    • 报文格式:数据段含出错数据报首部及前 64 位数据,类型 = 3,代码 = 对应错误编号。

  2. 数据报超时报告(类型 = 11)

    • 触发场景:
      • TTL 超时:路由器收到 TTL=0 的数据报(类型 = 11,代码 = 0);
      • 分片重组超时:信宿重组分片时定时器超时(类型 = 11,代码 = 1)。
    • 处理:丢弃数据报,向信源发送超时报告。
  3. 数据报参数错报告(类型 = 12)

    • 触发场景:数据报首部字段值无效或缺少必要选项参数。

    • 代码及含义:

      代码描述细节
      0IP 首部参数错首部某字段值无效,ICMP 首部指针指向出错字节
      1缺少选项所需参数首部选项不完整,无指针字段

6.5 ICMP 控制报文

ICMP 控制报文用于实现拥塞控制路径优化,主要包括源抑制报文和重定向报文。

6.5.1 源抑制报文(类型 = 4,代码 = 0)

  • 功能:解决无连接传输中因缺乏流量控制导致的拥塞(缓冲区溢出),通过减缓信源发送速率实现控制。
  • 工作阶段:
    1. 发现拥塞:路由器或信宿监测到缓冲区溢出,向信源发送源抑制报文(携带出错数据报首部信息);
    2. 解决拥塞:信源收到报文后,降低发往该信宿的数据报传输速率;
    3. 恢复阶段:拥塞解除后,信源逐渐恢复传输速率。
  • 注意事项:
    • 信源按自身时间段响应抑制,不逐报文处理;
    • 拥塞解除由信源通过 “是否继续收到抑制报文” 判断;
    • 多源并发拥塞时,抑制效果可能有限。

6.5.2 重定向报文(类型 = 5)

  • 功能:优化主机路由表,由路由器通知主机 “去往某信宿的最佳下一跳路由器”。

  • 触发场景:主机选择的下一跳路由器不是最佳路径,该路由器转发数据报的同时,向主机发送重定向报文。

  • 代码及含义

    代码描述
    0网络重定向(基于网络地址)
    1主机重定向(基于主机地址)
    2基于服务类型(TOS)的网络重定向
    3基于服务类型(TOS)的主机重定向
  • 报文格式:数据段含出错数据报首部及前 64 位数据,携带 “最佳下一跳路由器 IP 地址”。

  • 注意事项

    1. 不丢弃原数据报(仍转发);
    2. 仅由同一网络的路由器发送给主机;
    3. 源路由选项存在时,不产生重定向(源路由优先于最佳路径)。

6.6 ICMP 请求与应答报文对

此类报文通过 “请求 - 应答” 模式主动获取设备信息,用于网络检测和配置。

6.6.1 回应请求与应答报文(类型 = 8/0,代码 = 0)

  • 功能:测试主机或路由器的可达性,验证 IP 协议工作状态(对应 ping 命令)。
  • 报文格式:
    • 回应请求(类型 = 8):含 “标识符”(发起进程 ID)和 “序列号”(累加值,用于匹配请求与应答);
    • 回应应答(类型 = 0):复制请求报文的标识符和序列号,数据段与请求一致。
  • 工作流程:信源发送请求,信宿收到后返回应答,信源通过应答判断可达性。

6.6.2 时间戳请求与应答报文(类型 = 13/14,代码 = 0)

  • 功能:实现设备间时钟同步,计算时钟差异。

  • 报文格式:含 3 个 32 位时间戳字段(以毫秒为单位,从世界时间午夜 0 点计时):

    • 初始时间戳:请求方发送请求的时间(请求报文填写,应答报文复制);
    • 接收时间戳:应答方收到请求的时间(应答报文填写);
    • 发送时间戳:应答方发送应答的时间(应答报文填写)。
  • 时钟同步计算:

    • 往返延迟 = 当前时间(接收应答时) - 初始时间戳 -(发送时间戳 - 接收时间戳);
    • 单程时延 = 往返延迟 ÷ 2;
    • 时间差 = 接收时间戳 -(初始时间戳 + 单程时延)。
  • 示例:

    主机 A 初始时间戳 = 1000ms,主机 B 接收时间戳 = 1055ms,发送时间戳 = 1057ms,主机 A 接收应答时间 = 1030ms:

    • 往返延迟 = 1030-1000-(1057-1055)=28ms;
    • 单程时延 = 14ms;
    • 时间差 = 1055-(1000+14)=41ms(主机 B 时钟比 A 快 41ms)。

6.6.3 地址掩码请求与应答报文(类型 = 17/18,代码 = 0)

  • 功能:主机获取子网掩码(已被 DHCP 协议替代,RFC 6918 建议不再使用)。
  • 报文格式:
    • 请求(类型 = 17):地址掩码字段为 0;
    • 应答(类型 = 18):地址掩码字段填写子网掩码。

6.6.4 路由器请求与通告报文(类型 = 10/9,代码 = 0)

  • 功能:主机获取默认路由器 IP 地址,检测路由器活性(现扩展用于移动 IP 的代理发现)。
  • 工作流程:
    • 主机启动后广播 / 组播 “路由器请求”(类型 = 10);
    • 路由器以 “路由器通告”(类型 = 9)应答,定期主动广播 / 组播通告。
  • 通告报文格式:
    • 含 “地址数”(路由器 IP 地址数量)、“地址项大小”(每个地址项占 2 个 32 位字)、“生存期”(地址有效时间);
    • 数据段为多个地址项(路由器 IP 地址 + 优先级,优先级 0 为默认路由,0x80000000 不可作为默认路由)。

6.7 ICMP 报文封装

  • 向下封装:ICMP 报文作为数据部分封装在 IP 数据报中,IP 首部协议字段设为 “1”(标识 ICMP)。
  • 向上处理:IP 层接收含 ICMP 报文的 IP 数据报后,将其提交给 ICMP 模块处理(生成应答或交上层应用)。

本章要点

  • ICMP 是 IP 层的补充协议,用于差错报告、控制及信息获取,报文封装在 IP 数据报中(协议字段 = 1)。
  • 差错报告包括信宿不可达(类型 3)、超时(类型 11)、参数错(类型 12),仅向信源报告,不纠正错误。
  • 控制报文包括源抑制(拥塞控制,类型 4)和重定向(路径优化,类型 5),源抑制分发现、解决、恢复三阶段,重定向由路由器更新主机路由表。
  • 请求与应答报文对包括回应请求 / 应答(ping,类型 8/0)、时间戳请求 / 应答(时钟同步,类型 13/14)、地址掩码请求 / 应答(已被 DHCP 替代,类型 17/18)、路由器请求 / 通告(获取默认路由,类型 10/9)。
  • ICMP 报文格式固定为 8 字节首部 + 可变数据段,类型和代码字段区分报文功能。
http://www.dtcms.com/a/271908.html

相关文章:

  • Rust Web 全栈开发(四):构建 REST API
  • llvm, polly, 向量化测试,GEMM非常明显
  • ValueConverter转换器WPF
  • Leetcode力扣解题记录--第42题 接雨水(动规和分治法)
  • 开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储
  • [特殊字符] LLM(大型语言模型):智能时代的语言引擎与通用推理基座
  • 藏文识别技术的关键挑战与解决方案
  • 使用Visual Studio Code附加到Jetty进程调试Servlet
  • 小皮面板搭建pikachu靶场
  • 710 Mybatis实战
  • Go语言中map的零值是什么?对零值map进行读写操作会发生什么?如何正确初始化和使用map?
  • 力扣-73.矩阵置零
  • 【会员专享数据】2013-2024年我国省市县三级逐年SO₂数值数据(Shp/Excel格式)
  • 2025年材料应用与计算机科学国际会议(MACS 2025)
  • C++中的左值、右值与std::move()
  • 数据 + 模型 驱动 AI Native 应用发展
  • 利用DBeaver实现异构数据库数据定时任务同步
  • 计算机网络实验——以太网安全实验
  • Flutter 知识点总结
  • React虚拟DOM的进化之路
  • Vue.js 过渡 动画
  • 如何在Flutter开发中系统性减少知识盲区
  • 使用 FreeRTOS 实现简单多任务调度(初识 RTOS)
  • Excalidraw:一款轻量、高效、极具手感的在线白板工具
  • 【免费数据】2020年中国高精度耕地范围矢量数据
  • 解析几何几百年重大错误:将无穷多各异圆盘(球)误为同一点集
  • 语音转文字「本地化」新解!Whisper Web+cpolar实现零服务器部署与远程操作
  • 大数据在UI前端的应用创新:基于用户画像的精准广告投放系统
  • imx6ull-裸机学习实验17——SPI 实验
  • 《数据库》第一次作业:MySQL数据库账户及授权