网络 ICMP协议应用.md
本文最后更新于:2024年5月10日 下午
ICMP协议应用
先回顾一下相关知识,ICMP协议是网际层使用的,但是它封装在了IP数据包的数据部分
ICMP报文格式:前4个字节是统一格式,共三个字段:类型、代码和检验和,后4个字节内容与具体的类型有关,最后是数据字段

ICMP报文分类:
- 差错报告报文
- 终点不可达
- 时间超时
- 参数问题
- 改变路由(重定向)
- 询问报文
- 回送请求和回答
- 时间戳请求和回答

询问报文例子
PING——分组网间探测(Packet InterNet Groper)用来测试两台主机之间的连通性,使用了ICMP回送请求和会送回答报文,PING是应用层直接使用网络层ICMP的一个例子,没有通过运输层的TCP或UDP
在cmd窗口中输入ping www.baidu.com
,回车就可以看到结果

流程:键入ping www.baidu.com
后,PC会一连发出四个ICMP回送请求报文,如果服务器baidu.com正常工作且响应了这个ICMP会送请求报文,那么它就会发送会送回答报文,往返的ICMP报文上有时间戳,可以得出往返时间,最后显示统计结果:发送到哪个IP地址,发送的、接受的、丢失的分组数,往返时间最小最大平均值
注:出现分组丢失时,ping指令并不会给出原因
路由重定向例子
traceroute(在Windows中是tracert):不断发送数据报来检测,找到故障的路由器
- 由源主机向目的主机发送一连串的IP数据报,数据包中封装的是无法交互的UDP用户数据报。第一个数据包P1生存时间TTL设为1,P1到达第一个路由器R1时接收完后被丢弃,并向源主机发送一个ICMP时间超过差错报告报文;
- 源主机再发送第二个数据包P2,TTL设置为2,同理到第二个路由器R2接收完丢弃,并向源主机发送一个ICMP时间超过差错报告报文;
- ······重复上面的操作,当最后一个数据报到达目的主机,数据包的TTL为1。由于数据包中封装的是无法交付的UDP数据报,因此目的主机向源主机发送ICMP终点不可达差错报告报文;
- 最后源主机就得知了想要的路由信息:从源主机IP出发到目的主机所经过的路由器的IP地址,以及每一所需要的往返时间
注:原则上经过路由器越多时间越长,但是实际上由于互联网的拥塞程度时一直变化的,也有可能出现经过更多路由器反而时间更少
网络 ICMP协议应用.md
https://61hhh-github-io.vercel.app/20200709/26507caa/