美文网首页
TCP-IP详解卷1:协议读书笔记_6

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

作者: MR_Model | 来源:发表于2019-08-25 21:03 被阅读0次

    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个字节中存入源端口号和目的端口号。

    相关文章

      网友评论

          本文标题:TCP-IP详解卷1:协议读书笔记_6

          本文链接:https://www.haomeiwen.com/subject/dwvkectx.html