TCP-IP详解卷1:协议读书笔记_6

ICMP: Internet控制报文协议

ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层协议(TCP或UDP)使用。一些ICMP报文把差错报文返回给用户进程。
ICMP报文是在IP数据报内部被传输的,如图:

IP数据包传输ICMP数据

ICMP报文格式如下图所示,所有报文前4个字节都是一样的,但是剩下的其他字节则互不相同。


ICMP报文结构

ICMP的类型字段可以有15个不同的值,以描述特定类型的ICMP报文。某些ICMP报文还使用代码字段的值来进一步描述不同的条件。
校验和字段覆盖整个ICMP报文。使用的算法和之前介绍的IP首部校验和算法相同,ICMP的校验和是必需的。

ICMP报文的类型

ICMP不同类型由类型字段和代码字段共同决定。
途中的最后两类表明ICMP报文是一份查询报文还是一份差错报文。因为ICMP差错报文有时需要作特殊处理,因此我们需要对它们进行区分。例如:在对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文。(否则会对差错报文生成新的差错报文,无休止的循环下去)
当发送一份ICMP差错报文时,报文始终包含IP地址的首部和产生ICMP差错报文的IP数据报的前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号来判断)联系起来。

ICMP报文类型

以下各种情况都不会产生ICMP差错报文:
1)ICMP差错报文(但是ICMP查询报文会产生ICMP差错报文)
2)目的地址是广播地址或多播地址的IP数据报
3)作为链路层广播的数据报
4)源地址不是单个主机的数据报。这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
这些规则是为了防止过去允许ICMP差错报文对广播分组相应所带来的广播风暴。

ICMP地址掩码请求与应答

ICMP地址掩码请求、应答结构

ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。系统广播它的ICMP请求报文(这一过程与无盘系统在引导过程中用RARP获取IP地址是类似的)。无盘系统获取子网掩码的另一个方法是BOOTP协议。

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

RFC规定,除非系统时地址掩码的授权代理,否则它不能发送地址掩码应答(为了成为授权代理,它必须进行特殊的配置,以发送这些应答)。

ICMP时间戳请求与应答

ICMP时间戳请求、应答结构

ICMP时间戳请求允许系统向另一个系统查询当前的时间。返回的建议值是自午夜开始计算的毫秒数,协调的同一时间。这种ICMP报文的好处是它提供了毫秒级的分辨率,而利用其他方法从别的主机上获取的时间只能提供秒级的分辨率。由于返回的时间是从午夜开始计算的,因此调用者必须通过其他方法获知当时的日期,这是它的一个缺陷。

请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。但是,实际上,大多数的实现把后面两个字段都设成相同的值(提供三个字段的原因是可以让发送方分别计算发送请求的时间和发送应答的时间)。

我们还能计算出往返时间(RTT),它的值时收到应答的时间值减去发送请求的时间值。difference的值时接收时间戳值减去发起时间戳值。它们之间的关系如下图。


RTT时间结构

如果我们相信RTT的值,并且相信RTT的一半用于请求报文的传输,另一半用于应答报文的传输,那么为了 使本机时钟与查询主机时钟一致,本机时钟需要进行调整,调整值是difference减去RTT的一半。

另一个问题是向路由器发送时间戳请求。当系统返回一个非标准时间戳值时(不是自午夜开始计算的毫秒级),它就用32bit时间戳中的高位来表示。

另一种获得时间的方法

1)日期服务程序和时间服务程序。前者可以通过ASCII字符返回当前的时间和日期;后者返回的是一个32bit的二进制数值,表示自UTC,1900年1月1日午夜起的秒数。这个程序时以秒为单位的日期和时间。
2)严格的计时器使用网络时间协议(NTP),该协议在RFC1305中给出秒数。这个协议采用先进的技术来保证LAN或WAN上的一组系统的时间误差在毫秒级。
3)开发软件基金会的分布式计算环境定义了分布式时间服务(DTS)。它也提供计算机之间的时钟同步。
4)伯克利大学的Unix系统提供守护程序timed,来同步局域网上的系统时钟,不同于NTP和DTS,timed不在广域网范围内工作。

ICMP端口不可达差错

UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。可以用TFTP强制生成一个端口不可达报文。

在UDP数据报发送到svr4之前,要先发送一份ARP请求来确定它的硬件地址。接着返回ARP应答,然后才开始发送UDP数据报。

ICMP请求文字示意图

ICMP请求图像示意图

一个ICMP端口不可达差错是立刻返回的。但是TFTP客户程序看上去似乎忽略了这个ICMP报文,而在5秒后又发送了另一份UDP数据报。在客户程序放弃之前发了三次。
注意,ICMP报文是在主机之间交换的,而不用目的端口号,而每个20字节的UDP数据报则是从一个特定端口(2924)发送到另一个特定端口(8888)。
我们可以看到ICMP端口不可达报文的完整长度。这里的长度是70字节,各字段的分配如下图。

ICMP不可达错误

ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部(包含任何选项),还必须至少包括跟在该IP首部后面的前8个字节。
一个重要的事实是包含在UDP首部中的内容是源端口号和目的端口号。就是由于目的端口号(8888)才导致产生了ICMP端口不可达的差错b报文。接收ICMP的系统可以根据源端口号(2924)来把差错报文与某个特定的用户进程相关联。

导致差错的数据报中的IP首部要被送回的原因是因为IP首部中包含了协议字段,使得ICMP可以知道如何解释后面的8个字节(在本例中是UDP首部)。

当ICMP报文返回时,为什么TFTP客户程序还要继续重发请求呢?这是由于网络编程中的一个因素,即BSD系统不把从插口(socket)接收到的ICMP报文中的UDP数据通知用户进程,除非该进程已经发送了一个connect命令给该插口。

ICMP报文的4.4BSD处理

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


ICMP报文处理

如果最后一列标明是“内核”,那么ICMP就由内核来处理。如果最后一列指明是“用户进程”,那么报文就被传送到所有在内核中登记的用户进程,以读取收到的ICMP报文。如果不存在任何这样的用户进程,那么报文就悄悄地被丢弃(这些用户进程还会收到所有其他类型的ICMP报文的拷贝,虽然它们应该由内核来处理,当然用户进程只有在内核处理以后才能收到这些报文)。有一些报文完全被忽略。最后,如果最后一列标明的是引号内的一串字符,那么它就是对应的Unix差错。

小结

我们详细讨论了ICMP地址掩码请求和应答以及时间戳请求和应答。这些是典型的请求—应答报文。二者在ICMP报文中都有标识符和序列号。发送端应用程序在标识字段内存入一个唯一的数值,以区别于其他进程的应答。序列号字段使得客户程序可以在应答和请求之间进行匹配。

我们还讨论了ICMP端口不可达差错,一种常见的ICMP差错。对返回的ICMP差错信息进行了分析:导致差错的IP数据报的首部及后续8个字节。这个信息对于ICMP差错的接收方来说是必要的,可以更多地了解导致差错的原因。这是因为TCP和UDP都在它们的首部前8个字节中存入源端口号和目的端口号。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容

  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,052评论 0 8
  • 6.1 引言 ICMP经常被认为是IP层的一个组成部分。它传递差错报文以及其他需要注意的信息。ICMP报文通常被I...
    张芳涛阅读 1,649评论 0 2
  • ICMP的正式规范参见RFC 792ICMP它传递差错报文以及其他需要注意的信息。ICMP报文通常被IP层或更高层...
    gg大宇阅读 1,273评论 0 3
  • 协议基础 协议就是计算机之间通过网络实现通信时实现所达成的一种“约定”,这种约定使得那些由不同厂商的设备,不同的C...
    d9fc24a0c9a9阅读 2,358评论 0 6
  • 为什么要做直播平台百科或平台史记,简单的说就是要进一步将观众主播和平台绑在一起,同时营造一种平台文化和品牌。让观众...
    missly117阅读 138评论 0 0