TCP-IP协议详解学习笔记-- ICMP

时间:2023-01-07 23:12:55

[TOC]

ICMP差错报文

下列情况不会导致产生ICMP差错报文:

  1. ICMP差错报文(但查询报文可能会产生差错报文),若没有这个规则,可能会导致一个差错报文产生另一个差错的情况,而差错又会导致差错
  2. 目的地址是广播地址或多播地址的IP数据报
  3. 作为链路层广播的数据报
  4. 不是IP分片的第一片(略拗口,我的理解是IP分片里除了第一片的其他分片)
  5. 源地址不是单个主机的数据报。(也就是说,源地址不能为零地址、环回地址、广播地址或多播地址

ICMP地址掩码请求与应答

  • 用于无盘系统在引导过程中获取自己的子网掩码
  • TCP-IP协议详解学习笔记-- ICMP
  • 虽然在RFC中规定系统只有成为地址掩码的授权代理,才能发送地址掩码应答,但大多数主机在收到请求时都会发送一个应答(甚至还发送差错的应答)

ICMP时间戳请求与应答

  • 允许系统向另一个系统查询当前时间,返回的建议值是自午夜开始计算的毫秒数。
  • 协调的统一时间(UTC,Coordinated Universal Time),为了方便,在不需要精确到秒的情况下,通常将GMT(格林尼治标准时)和UTC视为等同
  • TCP-IP协议详解学习笔记-- ICMP
  • 网络时间协议(NTP)

ICMP端口不可达差错

  • UDP的规则之一是,如果收到一份 UDP数据报而目的端口与某个正在使用的进程不相符, 那么UDP返回一个ICMP不可达报文。可以用TFTP来强制生成一个端口不可达报文。
  • TCP-IP协议详解学习笔记-- ICMP
  • 返回的ICMP差错信息为:导致差错的IP数据报的首部及后续8个字节。(因为TCP和UDP都在它们的首部钱8个字节中存入源端口号和目的端口号)

第6章习题

  1. 前文5种不发送ICMP差错报文的特殊条件。如果这些条件不满足 而我们又在局域网上向一个似乎不存在的端口号发送一份广播 UDP数据报,这时会发生什么样的情况?
    答:如果在局域网线上有一百个主机,每个都可能在同一时刻发送一个 ICMP端口不可达的报文。很多报文的传输都可能发生冲突(如果使用的是以太网),这将导致1秒或2秒的时间里网络不可用。
  2. 阅读RFC [Braden 1989a],注意生成一个ICMP端口不可达差错是否为“必须”,“应该” 或者“可能”。这些信息所在的页码和章节是多少?
    答:should
  3. 阅读RFC 1349 [Almquist 1992],看看IP的服务类型字段是如何被ICMP设置的?
    答:发送一个 ICMP差错总是将TOS置为0。发送一个ICMP查询请 求可以将TOS置为任何值,但是发送相应的应答必须将 TOS置为相同的值

Ping程序中的ICMP

  • 大多数的TCP/IP实现都在内核中直接支持ping(上文中的ICMP地址掩码和时间戳请求也是直接在内核中进行处理的)

ICMP回显骑牛和回显应答报文格式

TCP-IP协议详解学习笔记-- 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