TCP/IP协议详解卷一:Chapter6 笔记

Chapter 6 ICMP:Internet控制报文协议

ICMP = Internet Control Message Protocol = 因特网控制报文协议
ICMP经常被认为是IP层的一个组成部分,用于传递差错报文和其他需要注意的信息。
ICMP报文是被封装在IP数据报内部进行传输的。
ICMP报文都包括8位类型字段、8位代码字段、16位检验和字段。不同的类型和代码对应不同的报文内容。

6.2节 ICMP报文的类型

ICMP报文可以分为差错报文查询报文
类型字段有15个不同的值,每个类型还可以用代码字段进一步描述不同的条件。
在对ICMP差错报文进行响应时,永远不会生成另一份ICMP差错报文(避免无穷循环)。
ICMP差错报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节。根据IP数据报首部中的协议字段IP数据报前8个字节中的TCP或UDP报文首部中的TCP或UDP端口号,接收ICMP差错报文的模块可以将其与某个协议和用户进程联系起来。

下面各种情况都不会导致产生ICMP差错报文:

  1. ICMP差错报文(但是ICMP查询报文可能会产生差错报文);
  2. 目的地址是广播地址或多播地址的IP数据报;
  3. 作为链路层广播的数据报;
  4. 不是IP分片的第一片;
  5. 源地址不是单个主机的数据报(因此,源地址不要设为零地址、环回地址、广播地址、多播地址)。

6.3节 ICMP地址掩码请求与应答

ICMP地址掩码请求用于无盘系统在引导过程中获取自己的子网掩码。

ICMP地址掩码请求/应答报文 = 8位类型(请求=17,应答=18) + 8位代码(=0) + 16位检验和 + 16位标识符 + 16位序列号 + 32位子网掩码

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

6.4节 ICMP时间戳请求与应答

ICMP时间戳请求允许系统向另一个系统查询当前时间。返回的值是从午夜开始计算的毫秒数,协调的统一时间(Coordinated Universal Time, UTC)。

ICMP时间戳请求/应答 = 8位类型(请求=13,应答=14)+ 8位代码(=0)+ 16位检验和 + 16位标识符 + 16位序列号 + 32位发起时间戳 + 32位接收时间戳 + 32位传送时间戳

其中,接收时间戳和传送时间戳通常被设置成相同的值。

一个例子
在这里插入图片描述
其中,orig表示发起时间戳,recv表示接收时间戳,xmit表示发送时间戳。rtt表示往返时延round-trip time = RTT),其值等于发送端收到应答的时间值减去发送请求的时间值。difference的值是接受时间戳减去发起时间戳。
在这里插入图片描述如果发送端的本地时间与查询到的时间一致,则有difference=recvorig=0.5RTTdifference = recv - orig = 0.5*RTT如果 difference0.5RTT<0difference - 0.5*RTT < 0,则说明本地时钟比查询主机的时钟快(orig值过大),需要对本地时钟进行调整 。

上面的两行例子中接收端bsdi分别要比发送端sun慢7ms和8ms。即6ms0.52ms=7ms-6ms - 0.5*2ms=-7ms7ms0.52ms=8ms-7ms - 0.5*2ms = -8ms

其他或的时间和日期的方法还包括daytime时间服务程序、 网络时间协议(NTP = Network Time Protocol)、分布式时间服务(DTS)等。

6.5节 ICMP端口不可达差错

ICMP不可达报文格式:
ICMP不可达报文 = 1字节类型(=3)+1字节代码(0-15)+2字节检验和 + 4字节未用(必须为0)+ 产生差错的IP数据报首部(包含任何选项)+ 原始IP数据报中数据部分的前8字节

以UDP端口不可达返回的ICMP差错报文为例:
ICMP差错报文 = 8字节ICMP首部 + 20字节产生差错的IP数据报首部(包含任何选项)+ 8字节UDP首部

其中:UDP首部 = 16位源端口号 + 16位目的端口号 + 16位UDP长度 + 16位UDP检验和

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章