网络协议-TCP/IP基础(5)
- ICMP经常被认为是IP层的一个组成部分,它传递差错报文以及其他需要注意的信息。
- ICMP报文通常被IP层或更高层的协议使用,一些ICMP报文把差错报文返回给用户进程。
- ICMP报文是在IP数据报内部被传输的。
类型字段可以有15个不同的值,以描述特定类型的ICMP报文,某些ICMP报文还使用代码字段的值来进一步描述不同的条件。
检验和字段覆盖整个ICMP报文,使用的算法与IP首部检验和算法相同,ICMP检验和是必需的。
ICMP报文类型
- 图中最后两列表表明ICMP报文是一份查询报文还是一份差错报文,因为对ICMP差错报文有时候需要进行特殊处理,因此需要进行区分。
- 例如,对ICMP差错报文进行响应时,永远不会产生另一份ICMP差错报文(如果没有这个限制,可能会遇到一个差错产生另一个差错的情况,而差错再产生差错,会无限循环)。
- 当发送一份ICMP差错报文时,报文始终包含IP首部和产生ICMP差错报文的IP数据报的前8个字节,这样接收ICMP差错报文的模块就会把它与某个特定的协议和用户进程联系起来。
下面各种情况都不会产生ICMP差错报文:
- ICMP差错报文
- 目的地址是广播地址或多播地址的IP数据报
- 作为链路层广播的数据报
- 不是IP分片的第一片
- 源地址不是单个主机的数据报,这就是说,源地址不能为零地址、环回地址、广播地址或多播地址。
ICMP重定向
当IP数据报应该被发送到另一个路由器时,收到数据报的路由器就要发送ICMP重定向差错报文给IP数据报的发送端,只有当主机可以选择路由器发送分组的情况下,才可能看到ICMP重定向报文。
假定主机发送一份IP数据报给R1。
R1收到数据报并检查它的路由表,发现R2是发送该数据报的下一站,当它把数据报发送给R2时,R1检测到它正在发送的接口和数据报到达的接口是相同的。
R1发送一份ICMP重定向差错报文给主机,告诉主机以后把数据报发送给R2而不是R1。
ICMP重定向报文的格式如下
ICMP重定向报文的接收者必须查看三个IP地址:
- 导致重定向的IP地址(即ICMP重定向报文的数据位于IP数据报的首部)
- 发送ICMP重定向数据报的路由器的IP地址(包含重定向信息的IP数据报中的源地址)
- 应该采用的路由器IP地址
ICMP重定向报文规则
- 重定向报文只能由路由器生成,而不能由主机生成。
- 重定向报文是为了主机使用的,而不是为了路由器使用。
一台主机收到ICMP重定向报文后,在修改路由表之前要做出一些检查,是为了防止路由器或主机的误操作,以及恶意用户的破坏,导致错误的修改路由表。
- 新的路由器必须直接与网络相连。
- 重定向报文必须来自到达当前目的地所选择的路由器。
- 重定向报文不能让主机本身作为路由器。
- 重新选择的路由器必须是间接路由。