一、参考


TCP/IP详解 卷1:协议(英文版)

TCP/IP详解 卷1:协议

二、名词解释


ICMP: internet control message protocol 网络控制消息协议
rtt:round-trip time 往返时间
NTP:network time protocol 网络时间协议
UTC:coordinated Universal Time, 协调的统一时间
OSF: Open Software Foundation,开放软件基金会
DCE: Distributed Computing Environment,分布式计算环境
DTS: Distributed Time Service,分布式时间服务

三、内容


1. 概要

ICMP通常被认为是IP层的一部分,它传递差错报文和其他需要注意的信息,IMCP消息通常由IP层或者更高层(UDP、TCP)使用,某些ICMP报文把差错报文返回给用户进程
ICMP消息包含于IP数据报中

clipboard.png

报文格式如下所示:
clipboard.png
所有报文的前4个字节都是相同的,剩下的其他字节互不相同,
类型字段可以有15个不同的值,描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值进一步描述不同的条件,
检验和字段覆盖整个ICMP报文,检验和是必须的

2. 报文类型

clipboard.png
报文中的类型字段和代码字段共同标识一个类型,最后两列表示ICMP报文是一份查询报文还是一份差错报文,
因为差错报文需要特殊处理,例如:对ICMP差错报文进行响应时候,不会生成另一份差错报文,因为如果没有这个限制规则,可能会遇到一个差错产生另一个差错的情况,差错再产生差错,将无限循环

发送一份ICMP差错报文时候,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的前8个字节,这样,接收ICMP差错报文的模块会把它和某个特定的协议(根据IP数据报首部中的协议字段)和用户进程(根据包含再IP数据报的前8个字节的TCP或者UDP报文首部中的TCP或者UDP端口号)联系起来

下面的情况都不会导致ICMP差错报文:
(1)ICMP差错报文(ICMP查询报文可能导致差错报文)
(2)目的地址是广播地址或者多播地址的IP数据报
(3)作为链路层广播的数据报
(4)不是IP分片的第一片
(5)源地址不是单个主机的数据报(源地址不是零地址,环回地址,广播地址,多播地址)
这些规则,为了防止允许ICMP差错报文对广播分组响应带来的广播风暴

3. ICMP地址掩码请求和应答

如上图17、18行,
ICMP地址掩码请求用于无盘系统在引导程序中获取子网掩码,
系统广播ICMP请求报文(和无盘系统在引导过程中用RARP获取IP地址是类似的),
无盘系统获取子网掩码的另一个方式是BOOTP协议

广播的定义是局域网上的所有主机(包含发送主机在内),当以太网驱动程序识别出目的地址是广播地址后,就把分组送到网络上,同时传一份副本到环回接口

clipboard.png

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

4. ICMP时间戳请求和应答

4.1 ICMP时间戳

类型是13或者14

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

clipboard.png

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

clipboard.png

上面的程序打印出三个时间戳: 发起时间戳(orig), 接收时间戳(recv), 发送时间戳(xmit)
还可以计算出往返时间(rtt),值是收到应答时候的时间值减去发送请求时的时间值,
difference的值是接收时间戳值减去发起时间戳值

clipboard.png

假设,我们相信RTT的值,其一半用于请求报文的传输,另外一半用于应答报文的传输,则为了使得本机时钟和查询主机的始终一致,本机时钟需要进行调整,调整值是difference 减去RTT的一半

clipboard.png

4.2 另一种方式

还可以用另一种方式获得时间和日期

clipboard.png

daytime日期服务程序,以可读格式返回当前的时间和日期,是一行ASCII字符,
time时间服务程序,返回的是一个32位的二进制数值,表示自UTC,午夜开始计算的秒数

严格的计时器使用网络时间协议NTP,该协议采用先进技术保证局域网或是广域网上的一组系统的时钟误差在毫秒级别以内

开放软件基金会的分布式计算环境定义了分布式时间服务,也提供计算机之间的时钟同步
unix系统提供守护程序timed, 同步局域网中的系统时钟,不像NTP,DTS,timed服务不在广域网范围中工作

5.ICMP端口不可达差错

分析端口不可达报文,以此来看一下ICMP差错报文中的附加信息
UDP的规则之一是,如果收到一份UDP数据报,而目的端口与某个正在使用的进程不相符合,那么UDP返回一个ICMP不可达报文,可以用TFTP来强制生成一个端口不可达报文

clipboard.png

clipboard.png

UDP数据报发送到svr4服务器之前,需要发送一份ARP请求来确定svr4的硬件地址,
接着ARP应答,然后发送UDP数据报
一个ICMP端口不可达差错是立刻返回的,但是TFTP客户端似乎忽略了这个ICMP差错报文,5秒中后,又发送了一份UDP数据报,在客户端放弃UDP数据报之前重发了3次

ICMP报文是在主机之间交换的,并未指明端口号,每个20字节的UDP数据报则从一个特定端口(2924)发送到另一个特定端口(8888)
跟在每个UDP后面的数字20表示UDP数据报中的数据长度(20字节包含了TFTP的2个字节操作代码,9个字节以空字符结束的文件名temp.foo,9个字节以空字符结束的字符串netascii)

clipboard.png

由上图,ICMP的一个规则是,ICMP差错报文必须包括生成该差错报文的数据报IP首部,还必须包含跟在该IP首部后面的前8个字节

包含在UDP首部中的内容是源端口号和目的端口号,由于目的端口号(8888)导致产生了ICMP端口不可达的差错报文,接收ICMP的系统可以根据源端口号(2924)把差错报文与某个特定的用户进程相互关联

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

clipboard.png

ICMP报文不可达类型值为3,有16种不同类型的ICMP不可达报文,在ICMP报文中的第二个32位必须为0,

clipboard.png

6.ICMP报文的处理

clipboard.png

如果最后一列标识内核,标识ICMP由内核来处理
如果标识用户进程,则报文被传送到所有在内核中登记的用户进程,读取收到的ICMP报文,如果不存在任何这样的用户进程,则报文被丢弃


一曲广陵散
76 声望23 粉丝

柴米油盐酱醋茶