1.ICMP(Internet控制报文协议):用来传送差错报文以及其他需要注意的信息,ICMP报文通常被IP层或者更高层协议(TCP或者UDP)使用,一些ICMP报文把差错报文返回给用户进程。同时,ICMP报文是在IP数据报内部被传送的。
2.ICMP报文的格式:(所有报文的前4个字节都是一样的,但是剩下的其他字节则互不相同)
类型字段(15个不同的值):以描述特定类型的ICMP报文。
检验和字段(覆盖整个ICMP报文),检验和是必须存在的?????(理解检验和算法,不会)
3.ICMP报文的类型(由类型字段和代码字段共同决定):
ICMP报文是查询报文还是差错报文。(当类型为17,代码为0时表示地址掩码请求;当地址为18,代码为0,表示地址掩码应答)
那些情况不会导致ICMP差错报文:(1)ICMP差错报文(2)目的地址时广播地址或者多播地址(3)作为链路层广播的数据报(4)不是IP分片的第一片(5)源地址不是单个主机的数据报。
4.ICMP地址掩码请求与应答:
ICMP地址掩码请求(用于无盘系统在引导过程中获取自己的子网掩码)
BOOTP协议(无盘系统获取子网掩码)
ICMP报文中的标识符和序列号字段由发送端任意选择设定,这些值在应答中将被返回,这样,发送端就可以把应答与请求进行匹配。(广播的特性:发送主机也能通过某种内部环回机制收到一份广播报文拷贝,必须包括发送主机在内)
ICMP地址掩码应答必须是收到请求接口的子网掩码(这是因为多接口有不同的子网掩码),地址掩码来自环回接口。
5.ICMP时间戳请求与应答
ICMP时间戳请求允许系统向另一个系统查询当前的时间。(这种ICMP报文的好处是它提供了毫秒级的分辨率而rdate只能提供秒级的分辨率),但是,调用者必须通过其他方法获知当时的日期(缺陷)。
请求端填写发起时间戳,然后发送报文。应答系统收到请求报文时填写接收时间戳,在发送应答时填写发送时间戳。
ICMP报文中:发起时间戳(orig),接收时间戳(recv)以及发送时间戳(xmit),往返时间(rtt)(往返时间的值时收到应答时间值减去发送请求时的时间值),difference的值是接收时间戳值减去发起时间戳值。
gateway(路由器)(当系统返回一个非标准时间戳值时,就用32bit时间戳中的高位来表示。)(不能计算发起时间戳和接收时间戳之间的时间差,单位不统一)
NTP(网络时间协议)
获取时间和日期的另一种方法:
(1)以可读的格式返回当前的时间和日期(telnet来验证)
(2)时间服务程序返回一个32bit的二进制数值,以秒为单位提供的日期和时间。
(3)NTP(网络时间协议)可以保证LAN或者WAN上的一组系统的时钟误差在毫秒级以内。
(4)分布式时间服务(DTS)
(5)Unix系统提供守护程序timed(8),来同步局域网上的系统时钟。
6.ICMP端口不可达差错(ICMP查询报文-地址掩码和时间戳查询及应答)
端口不可达报文(ICMP差错报文):
在UDP中,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符,那么UDP返回一个ICMP不可达报文。
eg:
在get命令后,一份UDP数据报就发送到主机svr4的8888端口。
在UDP数据报送到主机之前,要先发送一份ARP请求来确定它的硬件地址。接着返回ARP应答,然后才发送UDP数据报。
一个ICMP端口不可达差错是立刻返回的。但是,TFTP似乎忽略了这个ICMP报文,然后继续发送另一份UDP数据报。在客户放弃之前重发了三次。
注意:ICMP报文是在主机之间交换的,而不用目的端口号,而每个20字节的UDP数据报则是从一个特定端口(2924)发送到另一个特定端口(8888)。
ICMP的一个规则是:ICMP差错报文必须包含生成该差错报文的数据报IP收不,还必须至少跟该IP首部后面的8个字节。
UDP首部中的内容是源端口号和目的端口号。在此时(由于将目的端口号发生了改变才会导致产生了ICMP端口不可达的差错报文),接收ICMP的系统可以根据源端口号(2924)来将差错报文与某个特定的用户进程相关联。
TFTP客户程序所采用不太好的超时重传算法。(没有TCP的超时重传好用)
7.ICMP报文的4.4BSD处理
在各个系统中,ICMP处理的方式是不相同的。
类型17,代码0,描述:地址掩码请求,处理方法:内核产生应答(此时由内核进行处理)
类型18,代码0,描述:地址掩码应答,处理方法:用户进程(此时报文就被传送到所有在内核中登记的用户进程,以读取接收到的ICMP报文;当不存在任何这样的用户进程,那么报文就会被悄悄丢弃)