TCP/IP详解——ICMP:Internet控制报文协议

2021-04-26  本文已影响0人  helinyu

主要: 地 址 掩 码 请 求 和 应答、时间戳请求和应答以及不可达端口。

1> ICMP 经常被认为是IP层的一个组成部分。「ICMP是ip协议的附属协议」 它传递差错报文以及其他需要注意的信息。
ICMP 报文通常被IP层或更高层(TCP或UDP)使用。 这些ICMP报文吧差错报文返回给用户进程。

2>ICMP 报文是在IP数据包内部被传输的
3>所有报文前4byte都是一样的,剩下的则互不相同;

(1)类型字段可以有15个不同的值, 以描述特定类型的ICMP报文。
(2)某些ICMP报文还使用代码字段的值进一步描述不同的条件
(3)检验和字段覆盖整个ICMP报文。 ICMP的检验和是必须的【这个检验过程和3.2 介绍是一样的】

6.2 ICMP报文的类型



1》不 同 类 型 由 报 文 中 的 类 型 字 段 和 代 码 字 段 来 共 同 决 定 。图中的最后两列表明 I C M P 报文是一份查询报文还是一份差错报文。因为对 I C M P 差错报文有时需要作特殊处理,因此我们需要对它们进行区分。

例如,在对 I C M P 差 错 报 文 进 行 响 应 时,永远不会生成另一份 I C M P 差 错 报 文 ( 如 果 没 有 这 个 限 制 规 则 , 可 能 会 遇 到 一 个 差 错 产 生 另一个差错的情况,而差错再产生差错,这样会无休止地循环下去)。

2》当发送一份 I C M P 差 错 报 文 时 , 报 文 始 终 包 含 I P 的 首 部 和 产 生 I C M P 差错报文的 I P 数据报的 前 8 个字节。这样,接收 I C M P 差错报文的模块就会把它与某个特定的协议(根据 I P 数据报首部 中 的 协 议 字 段 来 判 断 ) 和 用 户 进 程 ( 根 据 包 含 在 I P 数据报前 8 个 字 节 中 的 T C P 或 U D P 报文首 部中的 T C P 或 U D P 端 口 号 来 判 断 ) 联 系 起 来 。 (也就是知道了是什么协议的关联)

不会产生CIMP差错报文的情况:
1) ICMP差错报文 (ICMP询问报文就会产生)
2)目的地址是广播地址或多播地址的IP数据报
3)作为链路层广播的数据包
4)不是IP分辨的第一篇
5)元地主不是单个主机的数据包。【源地址不可以是零地址、换回地址、广播地址和多播地址】
——>防止过去允许ICMP差错报文对广播分组响应带来的广播风暴。 

6.3 ICMP地址掩码请求与应答



1)一个方法:ICMP 地址掩码请求无用于无盘系统在引导过程中获取自己的子网掩码; 系统广播它的ICMP请求报文。
2)另一个方法:无盘系统获取子网掩码的另一个方法是BOOTP协议。
3)Icmp报文中的标识符和系列号字段由发送端任意选择设定,这些值在应答中奖被返回。 —— 发送端应答和请求进行匹配。

6.4 ICMP时间戳请求与应答



1)I C M P 时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计 算的毫秒数,协调的统一时间(提供了毫秒级的)[缺陷: 午夜计算,需要获取当前的日期]
2)请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在 发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值。【提供三个字段的原因是可以让发送方分别计算发送请求的时间和发送应答的时间】

给某个主机发送ICMP时间戳请求, 并打印返回的应答:

发起时间戳 (orig)、接收时间戳 (recv)以、发送时间戳 (xmit)、往返时间rtt

1)计算出往返时间( r t t ),它的值是收到应答时的时间值减去发送请求时的时间值。
2)d i f f e r e n c e 的 值 是 接 收 时 间 戳 值 减 去 发 起 时 间 戳 值.
调整时间点额常用方法: difference的值减去RTT的一半
两个主机的时间不一致的,这个就需要进行处理了了; 如何进行校验Icmp的内容;

6.4.2 另一种方法
还有其他的四种方法,这个不是很重要;有时间再处理


6.5 ICMP端口不可达差错

I C M P 差错报文,即端口不可达报文,它是 I C M P 目 的 不 可 到 达 报 文 中 的 一 种 , 以 此 来 看 一 看 I C M P 差错报文中所附加的信息。

UDP 规则之一是:如果收到一份UDP数据报而目的端口与某个正在使用的进程不符合,那么UDP返回一个ICMP不可达报文。
UDP发送数据报时候,要先发送一份ARP请求来确定它的硬件地址,接着返回ARP应答,然后才发送UDP数据报。

可以用TFTP来强制生成一个端口不可达报文。

一个ICMP 端口不可达差错是立刻返回的,但是,tftp客户端程序看上去似乎忽略了这个Icmp报文,而在5s之后又发送了另一份UDP数据报。客户端在放弃之前重发了三次。

NOTE:I C M P 报 文 是 在 主 机 之 间 交 换 的 , 而 不 用 目 的 端 口 号 , 而 每 个 2 0 字节的 U D P 数据报
则 是 从 一 个 特 定 端 口 ( 2 9 2 4 ) 发 送 到 另 一 个 特 定 端 口 ( 8 8 8 8 )。

I C M P差错报文(参见图 6 - 3 的 最 后 一 列 ) 必 须 包 括 生 成 该 差 错 报 文 的 数 据 报 I P 首 部 ( 包 含 任 何 选 项 ), 还 必 须 至 少 包 括 跟 在 该 I P 首 部 后 面 的 前 8 个 字 节 。

一个重要的事实是包含在 U D P 首 部 中 的 内 容 是 源 端 口 号 和 目 的 端 口 号 。 就 是 由 于 目 的 端 口号( 8 8 8 8 )才导致产生了 I C M P 端口不可达的差错报文。接收 I C M P 的 系 统 可 以 根 据 源 端 口 号( 2 9 2 4 )来把差错报文与某个特定的用户进程相关联(在本例中是 T F T P 客户程序

导致差错的数据报中的 I P 首部要被送回的原因是因为 I P 首部中包含了协议字段,使得 I C M P 可 以 知 道 如 何 解 释 后 面 的 8 个 字 节 ( 在 本 例 中 是 U D P 首 部 )。 如 果 我 们 来 查 看 T C P 首部
(图 1 7 - 2 ) , 可以发现源端口和目的端口被包含在 T C P 首部的前 8 个字节中。



我们注意到有1 6 种不同类型的I C M P 不可达报文,代码分别从0到1 5。I C M P 端口 不可达差错代码是 3
尽管图6 - 1 0指出了在I C M P 报文中的第二个 3 2 b i t 字必须为0,但是当 代码为 4时(“需要分片但设置了不分片比特”),路径 M T U发现机制( 2 . 9节)却允许路由器把外出接口的MTU填在这个32 bit字的低16 bit中。
尽管ICMP规则允许系统返回多于8个字节的产生差错的IP数据报中的数据,但是大多 数 从 伯 克 利 派 生 出 来 的 系 统 只 返 回 8 个 字 节 。

当 I C M P 报文返回时,为什么 T F T P 客 户 程 序 还 要 继 续 重 发 请 求 呢 ? 这 是 由 于 网 络 编 程 中 的 一 个 因 素 , 即 B S D 系 统 不 把 从 插 口 ( s o c k e t ) 接收到的 I C M P 报文中的 U D P 数 据 通 知 用 户 进 程 , 除非该进程已经发送了一个 c o n n e c t 命令给该插口。标准的 B S D T F T P 客户程序并不发送 c o n n e c t 命令,因此它永远也不会收到 I C M P 差 错 报 文 的 通 知 。
这里需要注意的另一点是 T F T P 客户程序所采用的不太好的超时重传算法。它只是假定 5 秒 是 足 够 的 , 因 此 每 隔 5 秒 就 重 传 一 次 , 总 共 需 要 2 5 秒 钟 的 时 间 。 在 后 面 我 们 将 看 到 T C P 有一 个较好的超时重发算法。 —— 重传算法的设计 ;


6.6 ICMP报文的4.4BSD处理


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

如果 最 后 一 列 标 明 是 “ 内 核 ”,那么 I C M P 就 由 内 核 来 处 理 。 如 果 最 后 一 列 指 明 是 “ 用 户 进程”, 那 么 报 文 就 被 传 送 到 所 有 在 内 核 中 登 记 的 用 户 进 程 , 以 读 取 收 到 的 I C M P 报 文 。 如 果 不存在任何这样的用户进程,那么报文就悄悄地被丢弃。

我们详细讨论了 I C M P 地 址 掩 码 请 求 和 应 答 以 及 时 间 戳 请 求 和 应 答 。 这 些 是 典 型 的 请 求 — 应答报文。二者在 I C M P报 文 中 都 有 标 识 符 和 序 列 号 。 发 送 端 应 用 程 序 在 标 识 字 段 内 存 入 一 个 唯一的数值,以区别于其他进程的应答。序列号字段使得客户程序可以在应答和请求之间进 行匹配。
我们还讨论了 I C M P 端口不可达差错,一种常见的 I C M P 差错。对返回的 I C M P 差 错 信 息 进 行了分析:导致差错的 I P 数据报的首部及后续 8 个字节。这个信息对于 I C M P 差 错 的 接 收 方 来 说 是 必 要 的 , 可 以 更 多 地 了 解 导 致 差 错 的 原 因 。 这 是 因 为 T C P 和 U D P 都 在 它 们 的 首 部 前 8 个字 节中存入源端口号和目的端口号。
最 后 , 我 们 第 一 次 给 出 了 按 时 间 先 后 的 t cpdump 输 出 , 这 种 表 示 方 式 在 本 书 后 面 的 章 节 中会经常用到```










上一篇下一篇

猜你喜欢

热点阅读