[TOC]
ICMP差错报文
下列情况不会导致产生ICMP差错报文:
- ICMP差错报文(但查询报文可能会产生差错报文),若没有这个规则,可能会导致一个差错报文产生另一个差错的情况,而差错又会导致差错
- 目的地址是广播地址或多播地址的IP数据报
- 作为链路层广播的数据报
- 不是IP分片的第一片(略拗口,我的理解是IP分片里除了第一片的其他分片)
- 源地址不是单个主机的数据报。(也就是说,源地址不能为零地址、环回地址、广播地址或多播地址
ICMP地址掩码请求与应答
- 用于无盘系统在引导过程中获取自己的子网掩码
- 虽然在RFC中规定系统只有成为地址掩码的授权代理,才能发送地址掩码应答,但大多数主机在收到请求时都会发送一个应答(甚至还发送差错的应答)
ICMP时间戳请求与应答
- 允许系统向另一个系统查询当前时间,返回的建议值是自午夜开始计算的毫秒数。
- 协调的统一时间(UTC,Coordinated Universal Time),为了方便,在不需要精确到秒的情况下,通常将GMT(格林尼治标准时)和UTC视为等同
- 网络时间协议(NTP)
ICMP端口不可达差错
- UDP的规则之一是,如果收到一份 UDP数据报而目的端口与某个正在使用的进程不相符, 那么UDP返回一个ICMP不可达报文。可以用TFTP来强制生成一个端口不可达报文。
- 返回的ICMP差错信息为:导致差错的IP数据报的首部及后续8个字节。(因为TCP和UDP都在它们的首部钱8个字节中存入源端口号和目的端口号)
第6章习题
- 前文5种不发送ICMP差错报文的特殊条件。如果这些条件不满足 而我们又在局域网上向一个似乎不存在的端口号发送一份广播 UDP数据报,这时会发生什么样的情况?
答:如果在局域网线上有一百个主机,每个都可能在同一时刻发送一个 ICMP端口不可达的报文。很多报文的传输都可能发生冲突(如果使用的是以太网),这将导致1秒或2秒的时间里网络不可用。 - 阅读RFC [Braden 1989a],注意生成一个ICMP端口不可达差错是否为“必须”,“应该” 或者“可能”。这些信息所在的页码和章节是多少?
答:should - 阅读RFC 1349 [Almquist 1992],看看IP的服务类型字段是如何被ICMP设置的?
答:发送一个 ICMP差错总是将TOS置为0。发送一个ICMP查询请 求可以将TOS置为任何值,但是发送相应的应答必须将 TOS置为相同的值
Ping程序中的ICMP
- 大多数的TCP/IP实现都在内核中直接支持ping(上文中的ICMP地址掩码和时间戳请求也是直接在内核中进行处理的)
ICMP回显骑牛和回显应答报文格式
- 对于其他类型的ICMP查询报文,服务器(被ping的主机)必须响应标识符(identifier)和序列号(sequence)字段
- 客户(发送回显请求的ping程序)发送的选项数据(optional data)必须回显
- Unix系统在实现ping程序时是吧IMCP报文中的标识符字段置成发送进程的ID号,以便识别出返回的信息
- 用tcpdump查看ping程序的数据报相关信息
[root@localhost ~]# tcpdump -i eth0 icmp -v -n
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
00:40:29.964843 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.152.129 > 192.168.152.1: ICMP echo request, id 1892, seq 1, length 64
00:40:29.965151 IP (tos 0x0, ttl 64, id 19704, offset 0, flags [none], proto ICMP (1), length 84)
192.168.152.1 > 192.168.152.129: ICMP echo reply, id 1892, seq 1, length 64