icmp和ping

ICMP

ICMP就是网际控制报文协议,它被IP数据报封装,但是通常认为它也在网络层。它主要是用来传递一些差错报文和请求应答服务。

ICMP报文的格式:所有报文的前四个字节都是一样的 —— 0-7 (8位类型编码)、8-15(8位代码)、16-31(16位校验和,校验和覆盖整个ICMP报文)

ICMP报文大致分成两种类型:ICMP差错报文、ICMP请求查询报文(时间戳应答和请求、地址掩码应答和请求)

不会产生ICMP差错报文的几种情况:

  1. ICMP差错报文
  2. 目的地址是广播地址或者多播地址的IP数据报
  3. 作为链路层广播的数据报
  4. 不是IP分片的第一片
  5. 源地址不是单个主机的数据报,即源地址不能为零地址,环回地址,广播地址或多播地址

ICMP可以用来发送地址掩码请求以及应答,即给定一个IP地址,可以发送一份ICMP地址掩码请求报文,然后在应答报文中将掩码填入;ICMP还可以用来发送时间戳请求和应答,该ICMP报文中有三个时间戳 —— 发起时间戳、接收时间戳、发送时间戳,通常将接收时间戳和发送时间戳设置成同一个值。查询请求ICMP报文的首部都包含2个字节的标识符(发送端应用程序在标识字段内存填入一个唯一的数值,以区别于其他进程的应答)和2个字节的序列号(该字段使得客户程序可以在应答和请求之间进行匹配)

ICMP端口不可达差错:这是一种常见的ICMP差错。通过发送UDP报文来判断端口是否可达,不可达则返回一个ICMP端口不可达差错报文。

当发生ICMP端口不可达差错时,返回的报文格式是 —— 14字节以太网首部 + 20字节IP首部 + 8字节ICMP首部 + 20字节产生差错的数据报IP首部 + 8字节UDP首部

其中ICMP报文格式:8字节首部 + IP首部(包括选项) + 原始IP数据报中数据的前8字节(TCP和UDP都在它们的前8个字节中填入了源端口号和目的端口号)

Ping程序

ping程序的主要功能就是用来判断两个主机之间是否可达。它的实现方式就是通过发送ICMP回显请求报文给主机,并等待返回ICMP回显应答。

如果不能ping到某台主机 —> 不能telnet或者FTP到那台主机。

ICMP回显请求和回显应答报文格式:和ICMP发送地址掩码请求以及应答报文的格式是一样的。 其中标识符字段设置成发送进程的ID号,这样即使在同一台主机上同时运行了多个ping程序实例,ping程序也可以识别出返回的信息; 序列号从0开始,每发送一次新的回显请求则+1.

ping 程序为用户提供了查看IP记录路由(RR)选项的机会,使用 -R 选项即可查看经过的路由,它会将经过的路由的IP地址填在IP数据报的首部的可选选项中,由于首部中的首部长度字段为4bit,因此整个IP首部最长只能包括15个32bit长的字(60个字节)。由于IP首部固定长度20个字节,RR选项用了3个字节,因此只有37个字节用来记录路由器IP,因此最多只能存储9个IP地址。

IP时间戳选项,IP时间戳选项与记录路由选项类似。在时间戳选项报文中有三个可选项 —— 0 只记录时间戳; 1 每台路由器记录它的IP地址和时间戳,因此只能存放四对地址和时间戳;发送端对选项列表进行初始化,存放了4个IP地址和4个取值为0的时间戳值。只有当列表中的下一个IP地址与当前路由器地址相匹配的时候,才记录时间戳。