网络协议学习笔记-02


ICMP与ping

ICMP 协议的格式

  • ICMP
    • ICMP 全称 Internet Control Message Protocol
    • ICMP 报文是封装在 IP 包里面的。
    • ICMP 报文有很多的类型,不同的类型有不同的代码。最常用的类型是主动请求为 8,主动请求的应答为 0。

ping 是基于 ICMP 协议工作的。ICMP 全称 Internet Control Message Protocol,就是互联网控制报文协议。

  • 查询报文类型
    • ping 就是查询报文,是一种主动请求,并且获得主动应答的 ICMP 协议
    • ping 发的包也是符合 ICMP 协议格式的,只不过它在后面增加了自己的格式
    • ICMP ECHO REQUEST
      • 对 ping 的主动请求,进行网络抓包
    • ICMP ECHO REPLY
  • 差错报文类型
    • 针对出现异常情况
      • 比如:终点不可达为 3,源抑制为 4,超时为 11,重定向为 5
    • 差错报文返回代码分析
    • 终点不可达
      • 网络不可达:主公,找不到地方呀?主机不可达:主公,找到地方没这个人呀?
      • 协议不可达:主公,找到地方,找到人,口号没对上,人家天王盖地虎,我说 12345!
      • 端口不可达:主公,找到地方,找到人,对了口号,事儿没对上,我去送粮草,人家说他们在等救兵。
      • 需要进行分片但设置了不分片位:主公,走到一半,山路狭窄,想换小车,但是您的将令,严禁换小车,就没办法送到了。
    • 源站抑制
      • 也就是让源站放慢发送速度。小兵:报告主公,您粮草送的太多了吃不完。
    • 时间超时
      • 也就是超过网络包的生存时间还是没到。小兵:报告主公,送粮草的人,自己把粮草吃完了,还没找到地方,已经饿死啦。
    • 路由重定向
      • 也就是让下次发给另一个路由器。小兵:报告主公,上次送粮草的人本来只要走一站地铁,非得从五环绕,下次别这样了啊。
    • 差错报文的结构相对复杂一些。除了前面还是 IP,ICMP 的前 8 字节不变,后面则跟上出错的那个 IP 包的 IP 头和 IP 正文的前 8 个字节。
  • ping
    • ping 这个程序是使用了 ICMP 里面的 ECHO REQUEST 和 ECHO REPLY 类型的。
    • 使用的是查询报文
    • 查询类型的使用
      • ping的发送和接受过程

image-20220509173736747

  • Traceroute
    • 类型属于差错报文
    • 作用
  • 故意设置特殊的 TTL,来追踪去往目的地时沿途经过的路由器

Traceroute 的参数指向某个目的 IP 地址,它会发送一个 UDP 的数据包。将 TTL 设置成 1,也就是说一旦遇到一个路由器或者一个关卡,就表示它“牺牲”了。

  • 故意设置不分片,从而确定路径的 MTU[^1]

要做的工作首先是发送分组,并设置“不分片”标志。发送的第一个分组的长度正好与出口 MTU 相等。如果中间遇到窄的关口会被卡住,会发送 ICMP 网络差错包,类型为“需要进行分片但设置了不分片位”。

总结

  • ICMP 相当于网络世界的侦察兵。我讲了两种类型的 ICMP 报文,一种是主动探查的查询报文,一种异常报告的差错报文;
  • ping 使用查询报文,Traceroute 使用差错报文。

思考题

  • 当发送的报文出问题的时候,会发送一个 ICMP 的差错报文来报告错误,但是如果 ICMP 的差错报文也出问题了呢?
  • 这一节只说了一个局域网互相 ping 的情况。如果跨路由器、跨网关的过程会是什么样的呢?

[^1]: 【维基百科】MTU:最大传输单元 (Maximum transmission unit) ; 最大传输单元是指数据链路层上面所能通过的最大数据包大小。最大传输单元这个参数通常与通信接口有关。 因特网协议允许IP分片,这样就可以将数据报包分成足够小的片段以通过那些最大传输单元小于该数据报原始大小的链路了。这一分片过程发生在IP层,它使用的是将分组发送到链路上的网络接口的最大传输单元的值。


文章作者: rudy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 rudy !
  目录