TCP/IP IP差错控制协议

IP差错控制协议

ICMP-因特网控制报文协议
差错控制,是IP的补充

ICMP传输方法

1
2
通过IP来发送,封装在IP的数据区
发送的信息包括一些差错和控制信息

ICMP提供的功能

  • 属于报错的功能,只进行报错不进行纠错
  • 只将差错报告给原始的发送者(源节点)

ICMP报文传输

1
2
3
4
5
ICMP封装在IP数据区,但只是IP的补充非IP的上层协议
对ICMP报文的错误不再产生ICMP报文

IPv4:IP首部protocol字段,ICMP在其中占据了一个位置 |value -> 1|
IPv6:NEXT HEADER |value -> 58|

ICMP报文格式

  • TYPE :8bit ,报文的大的类别
  • CODE :8bit ,大类中的子类 (若没有子类,则为0)
  • CHECKSUM :16bit ,校验和 (算法与IP的首部校验和算法相同,求16位整数序列反码和的反码)

IPv4和IPv6的ICMP报文类型:

  • v6中包含很多简化的工作,(取消v4中的一些类型
          MLD : 组管理协议 -> 对应v4中的IGMP
    
  • v4中的常用类型:
          0 echo (request reply)
          3 目标不可达
          11 time Execced 超时
      (在v6中,很多都借用了ICMP的类型)
    

一些ICMP报文

  • ICMPv4报文类型

ICMPv4

  • ICMPv6报文类型

ICMPv6

Echo

(ping命令:测试IP地址是否响应和可达)
(ping中的ICMP -> echo request , echo reply)
(不同OS对ping的实现有差异)

Echo报文格式

Echo报文格式

  • Type
    IPv4
    8:请求 Echo request
    0:响应 Echo response
    
    IPv6
    128:请求
    129:响应
    
  • Code:可指定数据
  • Id,Seq:
    目标用于信息匹配的字段
    -> 与源站请求的一致,则匹配进行响应
  • Checksum (16bit):

IPv4:仅仅计算ICMP报文本身进行校验和计算(首部+携带的数据
IPv6:还需要加入一个 “伪首部(pseudo-header)”进行计算 (为了统一 TCP,UDP

IPv6伪首部格式:

IPv6伪首部格式

1
2
3
4
5
6
7
8
9
10
11
12
13
伪头部:
源地址IP
目的地址IP
报文长度(首部+数据 TCP,UDP,ICMP...
上层的协议号(对v6而言:nextheader字段,对v4而言:protocol字段)
32位长度,不足用0填充
TCP 7
UDP 19
ICMPv4-17 ICMPv6-58

使用伪首部的目的:
1 要与UDP和TCP校验和的算法表示一致
2 区分通信双方以及双方通信所使用的协议
  • Optional Data:
    所带数据长度是可变长度,用于给网络管理员测试

目标不可达

报文格式

DU报文格式

  • type
    IPv4:16种
    IPv6:8种

  • code

    DU报文类型

  • checksum

// 未使用的保留0
// 出问题的IPv6报文的前缀部分:首部头+前64bit(IPv4) ICMPv6的最大长度

Source Quench 报文

1
拥塞控制相关

Redirect 重定向

  • 发生背景:在通信时,路由器发现有另一条更优的路径,则会通知源端可以下一次路由走更优的一跳,发送一个 redirect ICMP报文

  • 缺点:不能结局所有的路由问题,因为ICMP报文只会发送给源端

  • ICMP重定向报文格式

    ICMP重定向报文格式

  • IPv6重定向报文格式

    IPv6重定向报文格式

Time Exceeded 超时

问题背景:

通信中可能出现路由环路,生命期或跳数耗尽,丢弃报文向源端发送超时报文

报文格式

ICMP超时报文格式

  • Type:
    IPv4 :11
    IPv6 :3
  • Code:
    0: 到达生命期
    1: 碎片重装超时

Parameter Problem 参数问题

  • IPv4:
    IPv4参数错误报文
  • IPv6:
    IPv6参数错误报文

例如:取值超范围,不可辨认下一个头部……

Timestamp Request 时间戳 (request reply)

用于主机间的时钟同步 (IPv4)

ICMP时间戳报文

1 源时间戳 (发送请求的站点填入)
2 接收时间戳 (接收者填入)
3 传输时间戳 (接收者填入)
(2,3 基本一致, 差异主要在1之间,还要将往返时间包括进去)


参考资料:

  • INTERNETWORKING WITH TCP/IP PRINCIPLES, PROTOCOLS, AND ARCHITECTURE Vol1 (6th Edition). DOUGLASE E. COMER