ping可是个好东西啊!

程序员cxuan 2022-11-03 08:00

平时,我们想要知道,自己的机器到目的机器之间,网络通不通,一般会执行ping命令

一般对于状况良好的网络来说,你能看到它对应的loss丢包率为0%,也就是所谓的能ping通。如果看到丢包率100%,也就是ping不通

ping正常
ping不通

那么问题来了,假设我能ping通某台机器,那这时候如果我改用TCP协议去发数据到目的机器,也一定能通吗?

或者换个问法,ping和tcp协议走的网络路径是一样的吗?

这时候第一反应就是不一定,因为ping完之后中间链路里的某个路由器可能会挂了(断电了),再用TCP去连就会走别的路径。

也没错。但假设,中间链路没发生任何变化呢?

我先直接说答案。

不一定,走的网络路径还是有可能是不同的。

今天就来聊聊为什么。

我之前写过一篇《断网了,还能ping通 127.0.0.1 吗?》,里面提到过ping数据包和tcp数据包的区别

ping和TCP发消息的区别

我们知道网络是分层的,每一层都有对应协议。

五层网络协议对应的消息体变化分析

而这网络层就像搭积木一样,上层协议都是基于下层协议搭出来的。

不管是ping(用了ICMP协议)还是tcp本质上都是基于网络层IP协议的数据包,而到了物理层,都是二进制01串,都走网卡发出去了。

如果网络环境没发生变化,目的地又一样,那按道理说他们走的网络路径应该是一样的,什么情况下会不同呢?

我们就从路由这个话题聊起吧。

网络路径

在我们的想象中,当我们想在两台机器之间传输数据。本机和目的机器之间会建立一条连接,像一条管道一样,数据从这头到那头。这条管道其实是我们为了方便理解而抽象出来的概念。

实际上,我们将数据包从本地网卡发出之后,会经过各种路由器(或者交换机),才能到达目的机器。

这些路由器数量众多,相互之间可以互连,连起来之后就像是一张大网,所以叫"网络"可以说是非常的形象。

路由器构成的网络

考虑到交换机有的功能,路由器基本上都支持,所以我们这边只讨论路由器。

那么现在问题来了,路由器收到数据后,怎么知道应该走哪条路径,传给哪个路由器?

路径由什么决定?

在上面的那么大一张网络中,随便一个路由器都有可能走任何一个路径,将数据发到另外一个路由器上,

但路由和路由之间距离,带宽啥的可能都不同。

于是就很需要知道,两点之间走哪条路才是最优路径

于是问题就变成了这样一个图状结构。每条边都带有成本或权重,算这上面任意两点的最短距离

路由器和Dijkstra

这时候想必大家回忆压不住要上来了。

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

路由表的生成

基于Dijkstra算法,封装出了一个新的协议,OSPF协议Open Shortest Path First, 开放最短路径优先)。

有了OSPF,路由器就得到了网络图里自己到其他点之间的最短距离,于是就知道了数据包要到某个点,该走哪条最优路径

将这些信息汇成一张表,也就是我们常说的路由表

路由表里记录了到什么IP需要走什么端口,以及走这条路径的成本(metric)。

可以通过 route 命令查看到。

route表

路由表决定数据包路径

数据包在发送的过程中,会在网络层加入目标地址IP

路由器会根据这个IP路由表去做匹配。

然后路由表,会告诉路由器,什么样的消息该转发到什么端口。

举个例子。

通过路由表转发数据

假设A要发消息到D。也就是192.168.0.105/24要发消息到192.168.1.11/24

那么A会把消息经发到路由器。

路由器已知目的地IP192.168.1.11/24 ,去跟路由表做匹配,发现192.168.1.0/24, 就在e2端口,那么就会把消息从e2端口发出,(可能还会经过交换机)最后把消息打到目的机器。

当然,如果路由表里找不到,那就打到默认网关吧,也就是从e1口发出,发到IP192.0.2.1这个路由器的路由表不知道该去哪,说不定其他路由器知道

路由表的匹配规则

上面的例子里,是只匹配上了路由表里的一项,所以只能是它了。

但是,条条大路通罗马。实际上能到目的地的路径肯定有很多。

如果路由表里有很多项都被匹配上了,会怎么选?

如果多个路由项都能到目的地,那就优先选匹配长度更长的那个。比如,还是目的地192.168.1.11,发现路由表里的192.168.1.0/24192.168.0.0/16都能匹配上,但明显前者匹配长度更长,所以最后会走 192.168.1.0/24对应的转发端口。

但如果两个表项的匹配长度都一样呢?

那就会看生成这个路由表项的协议是啥,选优先级高的,优先级越高也就是所谓的管理距离ADAdministrativeDistance)越小。比如说优先选手动配的静态(static)路由,次优选OSPF动态学习过来的表项。

如果还是相同,就看度量值metrics,其实也就是路径成本cost,成本越小,越容易被选中。

路由器能选的路线有很多,但按道理,最优的只有"一条",所以到这里为止,我们都可以认为,对于同一个目的地,ping和TCP走的路径是相同的。

但是。

如果连路径成本都一样呢?也就是说有多条最优路径呢。

那就都用

这也就是所谓的等价多路径,ECMPEqual Cost MultiPath)。

我们可以通过traceroute看下链路是否存在等价多路径的情况。

可以看到,中间某几行,有好几个IP,也就是说这一跳里同时可以选好几个目的机器,说明这段路径支持ECMP

ECMP有什么用

利用等价多路径,我们可以增加链路带宽

举个例子。

没有ECMP时只能选择某一条路径

从A点到B点,如果这两条路径成本不同,带宽都是1千兆。那数据包肯定就选成本低的那条路了,如果这条路出故障了,就走下面那条路。但不管怎么样,同一时间,只用到了一条路径。另外一条闲置就有些浪费了,有没有办法可以利用起来呢?

有,将它们两条路径的成本设置成一样,那它们就成了等价路由,然后中间的路由器开启ECMP特性,就可以同时利用这两条链路了。带宽就从原来的1千兆变成了2千兆。数据就可以在两条路径中随意选择了。

利用ECMP可以同时使用两条链路

但这也带来了另外一个问题。加剧了数据包乱序

原来我只使用一条网络路径,数据依次发出,如无意外,也是依次到达。

现在两个数据包走两条路径,先发的数据包可能后到。这就乱序了。

那么问题又又来了。

乱序会有什么问题?

对于我们最最最常使用的TCP协议来说,它是个可靠性网络的协议,这里提到的可靠,不仅是保证数据要能送到目的地,还要保证数据顺序要跟原来发送端的一样。

实现也很简单,TCP为每个数据包(segment)做上编号。数据到了接收端后,根据数据包编号发现是乱序数据包,就会扔到乱序队列中对数据包进行排序。如果前面的数据包还没到,哪怕后面的数据包先到了,也得在乱序队列中一直等,到齐后才能被上层拿到。

举个例子,发送端发出三个数据包,编号1,2,3,假设在传输层2和3先到了,1还没到。那此时应用层是没办法拿到2和3的数据包的,必须得等1来了之后,应用层才能一次性拿到这三个包。因为这三个包原来可能表示的是一个完整的消息,少了1, 那么消息就不完整,应用层拿到了也毫无意义。

像这种,由于前面的数据丢失导致后面的数据没办法及时给到应用层的现象,就是我们常说的TCP队头阻塞

乱序队列等待数据包的到来

乱序发生时2和3需要待在乱序队列中,而乱序队列其实用的也是接收缓冲区的内存,而接收缓冲区是有大小限制的。通过下面的命令可以看到接收缓冲区的大小。

# 查看接收缓冲区
$ sysctl net.ipv4.tcp_rmem
net.ipv4.tcp_rmem = 4096(min)    87380(default)  6291456(max)
# 缓冲区会在min和max之间动态调整

乱序的情况越多,接收缓冲区的内存就被占用的越多,对应的接收窗口就会变小,那正常能收的数据就变少了,网络吞吐就变差了,也就是性能变差了。

因此,我们需要尽量保证所有同一个TCP连接下的所有TCP包都走相同路径,这样才能最大程度避免丢包

ECMP的路径选择策略

当初开启ECMP就是为了提升性能,现在反而加重了乱序,降低了TCP传输性能。

这怎么能忍。

为了解决这个问题,我们需要有一个合理的路径选择策略。为了避免同一个连接里的数据包乱序,我们需要保证同一个连接里的数据包,都走同样的路径。

这好办。我们可以通过连接的五元组(发送方的IP端口,接收方的IP端口,以及通信协议)信息定位到唯一一条连接。

五元组

然后对五元组信息生成哈希键,让同一个哈希键的数据走同一条路径,问题就完美解决了。

五元组映射成hash键
根据五元组选择ECMP路径

TCP和Ping走的网络路径一样吗

现在我们回到文章开头的问题。

对于同样的发送端和接收端,TCP和Ping走的网络路径一样吗?

不一定一样,因为五元组里的信息里有一项是通信协议。ping用的是ICMP协议,跟TCP协议不同,并且ping不需要用到端口,所以五元组不同,生成的哈希键不同,通过ECMP选择到的路径也可能不同。

TCP和ping的五元组差异

同样都用TCP协议,数据包走的网络路径一样吗

还是同样的发送端和接收端,同样是TCP协议,不同TCP连接走的网络路径是一样的吗?

跟上面的问题一样,其实还是五元组的问题,同样都是TCP协议,对于同样的发送端和接收端,他们的IP和接收端的端口肯定是一样的,但发送方的端口是可以随时变化的,因此通过ECMP走的路径也可能不同。

不同TCP连接的五元组差异


但问题又来了。

我知道这个有什么用呢?我做业务开发,又没有设置网络路由的权限。

利用这个知识点排查问题

对于业务开发,这绝对不是个没用的知识点。

如果某天,你发现,你能ping通目的机器,但用TCP去连,却偶尔连不上目的机器。而且两端机器都挺空闲,没什么性能上的瓶颈。实在走投无路了。

你就可以想想,会不会是网络中用到了ECMP,其中一条链路有问题导致的。

ping能成功但部分TCP连接失败

排查方法也很简单。

你是知道本机的IP以及目的机器的IP和端口号的,也知道自己用的是TCP连接。

只要你在报错的时候打印下错误信息,你就知道了发送端的端口号了。

这样五元组是啥你就知道了。

下一步就是指定发送端的端口号重新发起TCP请求,同样的五元组,走同样的路径,按理说如果链路有问题,就肯定会复现。

如果不想改自己的代码,你可以用nc命令指定客户端端口看下能不能正常建立TCP连接。

nc -p 6666 baidu.com 80

-p 6666是指定发出请求的客户端端口是6666,后面跟着的是连接的域名80端口

通过nc成功建立tcp连接

假设用了6666端口的五元组去连接总是失败,改用6667或其他端口却能成功,你可以带着这个信息去找找负责网络的同事。

总结

  • 路由器可以通过OSPF协议生成路由表,利用数据包里的IP地址去跟路由表做匹配,选择最优路径后进行转发。

  • 当路由表一个都匹配不上时会走默认网关。当匹配上多个的时候,会先看匹配长度,如果一样就看管理距离,还一样就看路径成本。如果连路径成本都一样,那等价路径。如果路由开启了ECMP,那就可以同时利用这几条路径做传输。

  • ECMP可以提高链路带宽,同时利用五元组做哈希键进行路径选择,保证了同一条连接的数据包走同一条路径,减少了乱序的情况。

  • 可以通过traceroute命令查看到链路上是否有用到ECMP的情况。

  • 开启了ECMP的网络链路中,TCP和ping命令可能走的路径不同,甚至同样是TCP,不同连接之间,走的路径也不同,因此出现了连接时好时坏的问题,实在是走投无路了,可以考虑下是不是跟ECMP有关。

  • 当然,遇到问题多怀疑自己,要相信绝大部分时候真的跟ECMP无关


参考资料

《网络排查案例课》 ——极客时间

程序员cxuan cxuan 写的文章还不错。会分享计算机底层、计算机网络、操作系统,Java基础、框架、源码等文章。
评论
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 71浏览
  • 我的一台很多年前人家不要了的九十年代SONY台式组合音响,接手时只有CD功能不行了,因为不需要,也就没修,只使用收音机、磁带机和外接信号功能就够了。最近五年在外地,就断电闲置,没使用了。今年9月回到家里,就一个劲儿地忙着收拾家当,忙了一个多月,太多事啦!修了电气,清理了闲置不用了的电器和电子,就是一个劲儿地扔扔扔!几十年的“工匠式”收留收藏,只能断舍离,拆解不过来的了。一天,忽然感觉室内有股臭味,用鼻子的嗅觉功能朝着臭味重的方向寻找,觉得应该就是这台组合音响?怎么会呢?这无机物的东西不会腐臭吧?
    自做自受 2024-12-10 16:34 141浏览
  • 概述 通过前面的研究学习,已经可以在CycloneVGX器件中成功实现完整的TDC(或者说完整的TDL,即延时线),测试结果也比较满足,解决了超大BIN尺寸以及大量0尺寸BIN的问题,但是还是存在一些之前系列器件还未遇到的问题,这些问题将在本文中进行详细描述介绍。 在五代Cyclone器件内部系统时钟受限的情况下,意味着大量逻辑资源将被浪费在于实现较大长度的TDL上面。是否可以找到方法可以对此前TDL的长度进行优化呢?本文还将探讨这个问题。TDC前段BIN颗粒堵塞问题分析 将延时链在逻辑中实现后
    coyoo 2024-12-10 13:28 102浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 50浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 83浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 79浏览
  • 【萤火工场CEM5826-M11测评】OLED显示雷达数据本文结合之前关于串口打印雷达监测数据的研究,进一步扩展至 OLED 屏幕显示。该项目整体分为两部分: 一、框架显示; 二、数据采集与填充显示。为了减小 MCU 负担,采用 局部刷新 的方案。1. 显示框架所需库函数 Wire.h 、Adafruit_GFX.h 、Adafruit_SSD1306.h . 代码#include #include #include #include "logo_128x64.h"#include "logo_
    无垠的广袤 2024-12-10 14:03 71浏览
  • 近日,搭载紫光展锐W517芯片平台的INMO GO2由影目科技正式推出。作为全球首款专为商务场景设计的智能翻译眼镜,INMO GO2 以“快、准、稳”三大核心优势,突破传统翻译产品局限,为全球商务人士带来高效、自然、稳定的跨语言交流体验。 INMO GO2内置的W517芯片,是紫光展锐4G旗舰级智能穿戴平台,采用四核处理器,具有高性能、低功耗的优势,内置超微高集成技术,采用先进工艺,计算能力相比同档位竞品提升4倍,强大的性能提供更加多样化的应用场景。【视频见P盘链接】 依托“
    紫光展锐 2024-12-11 11:50 51浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-10 16:13 109浏览
  • 全球知名半导体制造商ROHM Co., Ltd.(以下简称“罗姆”)宣布与Taiwan Semiconductor Manufacturing Company Limited(以下简称“台积公司”)就车载氮化镓功率器件的开发和量产事宜建立战略合作伙伴关系。通过该合作关系,双方将致力于将罗姆的氮化镓器件开发技术与台积公司业界先进的GaN-on-Silicon工艺技术优势结合起来,满足市场对高耐压和高频特性优异的功率元器件日益增长的需求。氮化镓功率器件目前主要被用于AC适配器和服务器电源等消费电子和
    电子资讯报 2024-12-10 17:09 88浏览
  • 智能汽车可替换LED前照灯控制运行的原理涉及多个方面,包括自适应前照灯系统(AFS)的工作原理、传感器的应用、步进电机的控制以及模糊控制策略等。当下时代的智能汽车灯光控制系统通过车载网关控制单元集中控制,表现特殊点的有特斯拉,仅通过前车身控制器,整个系统就包括了灯光旋转开关、车灯变光开关、左LED前照灯总成、右LED前照灯总成、转向柱电子控制单元、CAN数据总线接口、组合仪表控制单元、车载网关控制单元等器件。变光开关、转向开关和辅助操作系统一般连为一体,开关之间通过内部线束和转向柱装置连接为多,
    lauguo2013 2024-12-10 15:53 85浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦