互联网控制报文协议
1. 主要功能
- 确认IP包是否成功送达目的主机
- 报告发送过程中IP包被丢弃的原因和改善网络设置等
1.1 ICMP包头格式
- ICMP报文是封装在IP包里面的,它工作在网络层
1.2 类型字段
- 查询报文类型:用于用于诊断查询信息
- 0:回送应答
- 8:回送请求
- 差错报文类型:用于通知出错原因的错误消息
- 3:目标不可达
- 4:原点抑制
- 5:重定向或改变路由
- 11:超时
2. ping原理
- 其实就是应用的是ICMP的查询报文类型
- ping的时候,源主机向目标主机发送回送请求的消息(类型为8),如果成功接收到目标主机发来的回送应答消息(类型为0),则表示网络可达
- 这里是对原生的ICMP进行了一些封装,多了两个字段
- 标识号:用以区分是哪个应用发的ICMP包,用进程PID作为标识符
- 序号:从0开始,每次发送一个新的回送请求就会加1,可以确定网络包是否有丢失
- 选项数据中,ping还会存放发送请求的时间值,用来计算往返时间,说明路径的长短
3. 差错报文类型
3.1 目标不可达(类型为3)
5种常见的目标不可达类型的代码
- 网络不可达(代码为0):网络不通
- 主机不可达(代码为1):找不到对应的IP
- 协议不可达(代码为2):比如目标主机禁止TCP协议访问。则当主机使用TCP协议访问目标端口会返回该代码
- 端口不可达(代码为3):找不到这个端口,或者目标主机没有进程监听这个端口
- 需要分配但设置了不分片(代码为4):发送端主机发送的IP包超过了途中经过的路由器所能接受的MTU大小时,因为不进行分片,则会直接抛弃,此时会返回该代码
3.2 原定抑制信息(类型为4)
- 告诉发送主机放缓发送速率。
- 比如进过的路由器向低速线路发送数据时,其发送队列的缓存变为0而无法发送出去时,可以向ip包的源地址发送一个ICMP原定抑制信息。
3.3 重定向消息(类型为5)
- 告诉发送主机下一次发给另一个路由器
3.4 超时消息(类型为11)
- IP中有一个字段为TTL(为了防止IP包无休止在网络上转发),他的值每经历一个路由器都会减一,知道为0时该IP包会被丢弃
- 丢弃时,路由器会发送一个ICMP超时信息给发送端主机
4. traceroute原理
- 利用了差错报文类型
- 作用一:通过故意设置特殊的TTL,用来追踪去往目的ip时沿途经过的路由器
- 作用二:通过故意设置不分片,确定路径的MTU