能ping通但是网络不通,是它们在搞鬼

平时 , 我们想要知道 , 自己的机器到目的机器之间 , 网络通不通 , 一般会执行Ping命令 。
一般对于状况良好的网络来说 , 你能看到它对应的loss丢包率为0% , 也就是所谓的能ping通 。如果看到丢包率100% , 也就是ping不通 。

能ping通但是网络不通,是它们在搞鬼

文章插图
 
ping正常
能ping通但是网络不通,是它们在搞鬼

文章插图
 
ping不通
那么问题来了 , 假设我能ping通某台机器 , 那这时候如果我改用TCP协议去发数据到目的机器 , 也一定能通吗?
或者换个问法 , ping和tcp协议走的网络路径是一样的吗?
这时候第一反应就是不一定 , 因为ping完之后中间链路里的某个路由器可能会挂了(断电了) , 再用TCP去连就会走别的路径 。
也没错 。但假设 , 中间链路没发生任何变化呢?
我先直接说答案 。
不一定 , 走的网络路径还是有可能是不同的 。
今天就来聊聊为什么 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
ping和TCP发消息的区别
我们知道网络是分层的 , 每一层都有对应协议 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
五层网络协议对应的消息体变化分析
而这网络层就像搭积木一样 , 上层协议都是基于下层协议搭出来的 。
不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包 , 而到了物理层 , 都是二进制01串 , 都走网卡发出去了 。
如果网络环境没发生变化 , 目的地又一样 , 那按道理说他们走的网络路径应该是一样的 , 什么情况下会不同呢?
我们就从路由这个话题聊起吧 。
网络路径
在我们的想象中 , 当我们想在两台机器之间传输数据 。本机和目的机器之间会建立一条连接 , 像一条管道一样 , 数据从这头到那头 。这条管道其实是我们为了方便理解而抽象出来的概念 。
实际上 , 我们将数据包从本地网卡发出之后 , 会经过各种路由器(或者交换机) , 才能到达目的机器 。
这些路由器数量众多 , 相互之间可以互连 , 连起来之后就像是一张大网 , 所以叫"网络"可以说是非常的形象 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
路由器构成的网络
 
考虑到交换机有的功能 , 路由器基本上都支持 , 所以我们这边只讨论路由器 。
 
那么现在问题来了 , 路由器收到数据后 , 怎么知道应该走哪条路径 , 传给哪个路由器?
路径由什么决定?
【能ping通但是网络不通,是它们在搞鬼】在上面的那么大一张网络中 , 随便一个路由器都有可能走任何一个路径 , 将数据发到另外一个路由器上 , 
但路由和路由之间距离 , 带宽啥的可能都不同 。
于是就很需要知道 , 两点之间走哪条路才是最优路径 。
于是问题就变成了这样一个图状结构 。每条边都带有成本或权重 , 算这上面任意两点的最短距离 。
能ping通但是网络不通,是它们在搞鬼

文章插图
 
路由器和Dijkstra
这时候想必大家回忆压不住要上来了 。
这题我熟 , 这就是大学时候刷的Dijkstra算法 。菊花厂的OJ笔试题集里也经常出现 , 现在终于明白为什么他们家的笔试题里图类题目比别的大厂貌似要多一些了吧 , 因为菊花厂就是搞通信的 , 做路由器的老玩家了 。


推荐阅读