大家好,又见面了,我是你们的朋友全栈君。
PING原理
PING是基于ICMP协议(网络层)工作的
ICMP:Internet Control Message Protocol,互联网控制报文协议
ICMP用于报告传输过程中出现的问题,比如确认IP包是否成功送达,或者发送过程中被废弃的原因
比如主机A向主机B发送消息,在途径某个路由器时,无法发现B的存在。路由器就会向A发送一个ICMP不可达的数据包,A解析ICMP的首部和数据段得知具体信息
- ICMP报文
封装在IP包里,从左到右依次是IP头、ICMP头、ICMP数据段,后两部分构成IP数据段。
ICMP是IP首部的“协议”字段来区分,不同ICMP以其首部的“类型”和“代码”来区分
类型字段
大致分为两类,一类是主动查询(回送),一类是通知差错
查询类是由主机主动发送的,差错类是由路由遭遇异常时发送的
内容 | 种类 |
---|---|
0回送应答 | 查询 |
3目标不可达 | 差错 |
4原点抑制 | 差错 |
5重定向或改变路由 | 差错 |
8回送请求 | 查询 |
11超时 | 差错 |
回送消息
PING命令就是根据回送消息来实现的,用于判断消息是否成功到达对端。其中,主动发送的叫回送请求,被动接收的叫回送应答
每发送一个消息,序号字段会自增1
目标不可达
当类型是目标不可达时,可以根据代码字段作进一步区分:
- 网络不可达:根本找不到目标IP网络
- 主机不可达:可以找到网络,但是找不到主机(可能未连接)
- 协议不可达:通过某种协议(比如TCP)访问目的主机时,防火墙禁止该协议访问
- 端口不可达:目的主机没有监听访问的端口
- 需要分片但设置了不分片
原点抑制
遇到网络拥堵/低速路线时,向源主机发送原点抑制消息,从而增大传输间隔(等)
重定向消息
路由器发现了一条更优的路由选择
超时消息
TTL减小到0时,IP包被丢弃,然后发送超时消息
- PING
执行ping指令时发生了什么 ( A → B ) (A\rightarrow B) (A→B),同一子网
- A构建ICMP回送请求消息(类型、序号、发送时间)
- 通过ICMP构建IP数据包(源IP、目的IP、协议)
- 添加MAC头(ARP映射表or发起ARP查询),获得数据帧(源MAC、目的MAC)
- B收到数据帧,检查目的MAC,检查目的IP
- 构建ICMP回送响应消息(类型、序号)
- A收到后计算RTT
TRACEROUTE原理
和PING类似,TRACEROUTE同样是利用ICMP实现,但是TRACEROUTE(基于UDP)使用的是差错报文类型
- 设置TTL,追踪途径的路由器
- 设置不分片,确定MTU
追踪路由
发送一连串的ICMP,TTL不断增大,使每次能比前一次多经过一个路由。每次能够获取一个ICMP超时消息,其中就包含了最新到达的路由IP
TRACEROUTE会给ICMP设置一个**“不可能”的端口号**,如果到达目的主机了,就会收到端口不可达
确定MTU
通过需要分片但设置了不分片的差错消息实现
当发送的ICMP不分片,且大小大于MTU时,会被路由丢弃,然后返回差错ICMP告知MTU大小
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162550.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...