《TCP/IP详解 卷一:协议》读书笔记 - 5 ICMP

本贴最后更新于 3325 天前,其中的信息可能已经事过境迁

#ICMP:Internet 控制报文协议

ICMP 是 IP 协议的附属协议。ICMP 主要传递差错报文及其他需要注意的信息。ICMP 报文通常被 IP 层及更高层协议(TCP 或 UDP)使用。ICMP 报文是在 IP 数据报内部被传输。

ICMP 报文


##ICMP 报文格式

ICMP 报文格式

ICMP 报文类型由报文头中的类型字段和代码字段共同决定。如表所示:

ICMP 报文类型


##ICMP 差错报文
ICMP 差错报文始终包含引起该差错的 IP 的首部 和 IP 数据报的前 8 个字节。这样接受到 ICMP 差错报文的模块就可以:根据 IP 数据报首部判断产生差错的协议,根据 IP 数据报的前 8 个字节判断产生差错的用户进程。

ICMP 差错报文的装配

为了防止过去允许 ICMP 差错报文对广播分组响应所带来的广播风暴。以下情况都不会产生 ICMP 差错报文:

  • ICMP 差错报文(防止无限循环)
  • 目的地址是广播或多播地址的 IP 数据报
  • 作为链路层广播的数据报
  • 不是 IP 分片的第一片
  • 源地址不是单个主机的数据报

下面我们以 ICMP 端口不可达差错为例子,对差错报文进行分析学习。

###ICMP 端口不可达差错
UDP 的规则之一是,如果收到一份 UDP 数据报而目的端口与某个正在使用的进程不相符,那么 UDP 返回一个 ICMP 端口不可达报文。报文格式如下:

ICMP 端口不可达差错报文

上面我们已经分析过 ICMP 差错报文的装配方法,下面我们结合具体场景进行分析。产生差错的数据报 IP 首部包含了协议字段,本例中是 UDP。如此,ICMP 才可以知道后续的 8 字节要以 UDP 报文解释。在 UDP 报文的前 8 个字节中,可以发现源端口和目的端口被包含其中,这样便可以把差错报文与某个特定的用户进程相关联。


##ICMP 请求报文

接下来我们学习两种 ICMP 请求报文。

###ICMP 地址掩码请求与应答
无盘机的 IP 地址是通过 RARP 获得,而地址掩码是通过 ICMP 地址掩码请求获得。

ICMP 地址掩码请求和应答报文格式如下:

ICMP 地址掩码请求和应答报文格式

ICMP 报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回。这样,发送端就可以把应答与请求进行匹配。

###ICMP 时间戳请求与应答

ICMP 时间戳请求允许系统向另外一个系统查询当前时间。返回的建议值是自午夜开始计算的毫秒数,协调的统一时间。ICMP 时间戳请求可以精确到毫秒级。

具体报文格式如下:

ICMP 时间戳请求与应答

请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值。


##ICMP 报文的 4.4BSD 处理
由于 ICMP 覆盖的范围很广,从致命差错到信息差错,因此即使在一个给定的系统实现中,对每个 ICMP 报文的处理都是不相同的。

ICMP 报文的 4.4BSD 处理


相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • ss via macOS

    啊,开始的时候也是看这本书,表示有些迷迷糊糊。后来网络配置多了,又看了《图解 TCP/IP》,回来看看这本书,恩,确实不错啊!好书~

推荐标签 标签

  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 119 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    498 引用 • 1395 回帖 • 249 关注
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖
  • JetBrains

    JetBrains 是一家捷克的软件开发公司,该公司位于捷克的布拉格,并在俄国的圣彼得堡及美国麻州波士顿都设有办公室,该公司最为人所熟知的产品是 Java 编程语言开发撰写时所用的集成开发环境:IntelliJ IDEA

    18 引用 • 54 回帖 • 4 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖 • 1 关注
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 649 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 652 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 227 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖 • 1 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 287 关注
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    133 引用 • 1124 回帖 • 115 关注
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 76 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖 • 7 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    948 引用 • 1460 回帖 • 2 关注
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    211 引用 • 358 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    693 引用 • 537 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖
  • JSON

    JSON (JavaScript Object Notation)是一种轻量级的数据交换格式。易于人类阅读和编写。同时也易于机器解析和生成。

    52 引用 • 190 回帖
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    76 引用 • 258 回帖 • 626 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖 • 2 关注
  • 电影

    这是一个不能说的秘密。

    122 引用 • 608 回帖
  • Word
    13 引用 • 40 回帖
  • 支付宝

    支付宝是全球领先的独立第三方支付平台,致力于为广大用户提供安全快速的电子支付/网上支付/安全支付/手机支付体验,及转账收款/水电煤缴费/信用卡还款/AA 收款等生活服务应用。

    29 引用 • 347 回帖 • 1 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 381 关注