ping命令
在自己的机器到目的机器之间执行ping命令时,一般对于状况良好的网络来说,你能看到它对应的loss丢包率为0%,也就是所谓的能ping通。如果看到丢包率100%,也就是ping不通。
那么问题来了,假设我能ping通某台机器,那这时候如果我改用TCP协议去发数据到目的机器,也一定能通吗?
答案是,不一定,走的网络路径还是有可能是不同的。
我们知道网络是分层的,每一层都有对应协议。
不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。
我们将数据包从本地网卡发出之后,会经过各种路由器(或者交换机),才能到达目的机器。由于路由器(或者交换机)数量众多,我们发送的数据包一般会选择最优的路径进行传输。要找到最优的路径,就需要使用到路由表了。
路由表
基于Dijkstra算法,封装出了一个新的协议,OSPF协议(Open Shortest Path First, 开放最短路径优先)。有了OSPF,路由器就得到了网络图里自己到其他点之间的最短距离,于是就知道了数据包要到某个点,该走哪条最优路径。将这些信息汇成一张表,也就是我们常说的路由表。路由表里记录了到什么IP需要走什么端口,以及走这条路径的成本(metric)。可以通过 route 命令查看到。
路径选择规则
为了提高数据传输效率,降低丢包率。数据开始传输之前,会先使用到五元组,通过函数转成hashkey之后到路由表选择一条最优的路径。
路径选择的策略主要有:
优先级,优先级越高也就是所谓的管理距离(AD,AdministrativeDistance)越小。比如说优先选手动配的静态(static)路由,次优选OSPF动态学习过来的表项。
度量值metrics,其实也就是路径成本cost,成本越小,越容易被选中
等价多路径,ECMP(Equal Cost MultiPath)
排查方法
当我们使用本机的IP向目的机器的IP和端口号发送数据时,如果发送失败,我们可以从报错信息中查看到发送端口。然后我们可以通过nc命令,更换本地的发送端口,尝试向目标机器发送请求
nc -p 6666 baidu.com 80
假设用了6666端口的五元组去连接总是失败,改用6667或其他端口却能成功, 那就本机网络环境存在问题。
评论区