- ICMP 的全称是 Internet Control Message Protocol(互联网控制协议)
- 用于在IP主机、路由器之间发送控制消息
- 不用于传输用户数据
- 控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息
- ICMP 报文承载在 IP 包中
- 就和 TCP 与 UDP 报文段作为 IP 有效载荷被承载那样
- 但ICMP和IP协议是一层的,而不是和TCP、UDP协议一层
- 所以首部没有端口号字段
组成
分类
ICMP 超时消息(Type: 11)
- 在 IP 数据包中有一个叫做 TTL(Time To Live, 生存周期) ,指定IP包被路由器丢弃之前允许通过的最大路由节点数量
- 它的值在每经过路由器一跳之后都会减 1,减为 0 时IP 数据包会被丢弃,并返回错误
- 主要目的就是为了防止路由器控制遇到问题发生循环状况时,避免 IP 包无休止的在网络上转发
- IPv4报头的一个8 bit字段
- TTL的最大值是255,TTL的一个推荐值是64
- 它的值在每经过路由器一跳之后都会减 1,减为 0 时IP 数据包会被丢弃,并返回错误
- 此时路由器会发送一个 ICMP 超时消息(
Code=0
)发送给主机,通知该包已经被丢弃
ICMP 目标不可达(Type: 3)
- 路由器无法将 IP 数据报发送给目标地址时,会给发送端主机返回目标不可达的 ICMP 消息,并且用
Code
字段表示不可达的具体原因
ICMP 回送消息(Type: 0 和 Type: 8)
- 用于判断相互通信的主机之间是否连通,也就是判断所发送的数据包是否能够到达目标主机
Type=8
: 回送请求ICMP Echo Request MessageType=0
: 回送应答ICMP Echo Reply Message
ICMP 重定向消息(Type: 5)
- 路由器发现发送端主机使用了次优的路径发送数据,那么它会返回一个 ICMP 重定向的消息给这个主机
- 这个 ICMP 重定向消息包含了更合适的路由信息
- 好处:
- 优化数据在网络中的转发路径,使得流量更快到达目的地
- 降低网络资源利用率,例如带宽和路由器 CPU 负载
ICMP 原点抑制消息(Type: 4)
- 在使用低速率网络的情况下,在网络通信遇到网络拥堵的情况下,需要抑制 IP 数据报的发送
- 路由器的发送队列的残存数据报变为 0 从而无法发送时,向源地址发送该ICMP消息
- 不过这个 ICMP 消息可能会引起不公平的网络通信,一般不被使用
ICMPv6
- ICMPv6邻居探索协议
- 用于查询 IPv6 地址于 MAC 地址的对应关系
- 利用IPv6 的多播地址实现传输
- ipv6支持在没有 DHCP 服务器的环境下也能实现 IP 地址的自动获取
- 如果是一个没有路由器的网络,就使用 MAC 地址作为链路本地单播地址
- 在一个有路由器的网络环境中,可以从路由器获得 IPv6 地址的前面部分,后面部分使用 MAC 地址进行设置
Traceroute
-
Traceroute 的基本原理:向外发送带有逐次递增 TTL 的数据包从而获取的路径中每一跳的信息
-
Traceroute 的实现一共有三种方法:
- UDP: 向外发送的是一个 UDP 数据包,最终返回的是 ICMP Destination Unreachable
- ICMP:向外发送的是一个 ICMP Echo Request,最终返回的是 ICMP Echo Reply
- TCP: 向外发送的是一个 TCP SYN 数据包,最终返回的是 TCP RST
-
UDP实现
- 客户端使用一个大于30000的目标端口号发送UDP报文
- 这么大的端口号目的端一般未使用,所以会收到一个端口不可达信息
- 客户端使用一个大于30000的目标端口号发送UDP报文
-
ICMP实现
- 相比UDP,更容易穿透防火墙
- 很多应用服务器都不提供UDP服务(或者被防火墙挡掉),所以拿不到服务器的任何返回,实际用起来并不能达到想要的效果
- 而为了有利于troubeshooting,一般ICMP Echo request/reply是不会被封禁的
- 所以一般能ping通
- 运营商可能会封了大目的端口号的UDP包
- 因为UDP没有连接,常被用作网络攻击
- 运营商为了安全考虑,只允许白名单端口的UDP包通过
- 比如DNS、DHCP的
- 相比UDP,更容易穿透防火墙
-
TCP实现
- 穿透防火墙的几率更大,因为 TCP SYN 看起来是试图建立一个正常的 TCP 连接
-
为什么会出现中间节点为*,但是最终节点可以到达?
- 有些路由器会隐藏的自己的IP,不让ICMP TTL-Expired的返回消息通过,结果就是在那一跳上始终会显示星号
-
为什么会一个节点后所有的节点都没有数据?
- UDP或者ICMP请求被封禁了
-
Traceroute能保证每个分组都是走一样路由路径吗?
- 不能,只有在对称路由时才能给出准确的测量
- 一般多路径路由是在运营商或者目标主机前出现负载均衡
-
参考: