c语言 判断一个图是否全连通_基于云平台的全链路大规模网络连通性检测系统详解...

虚拟网络排查问题困难,传统的traceroute等工具很难起到太大作用,大部分情况下都需要到宿主机、混合云网关上抓包来troubleshooting,耗时又费力。有些场景中包的传送路径比较长(如跨域、混合云等),可能丢包的地方比较多,更增加了故障排查的难度。

为此,我们设计了一款支持全链路大规模的网络连通性内部检测系统BigBrother。基于TCP报文的染色可将检测报文和用户流量区分开,能支持物理云和跨地域的复杂场景,还打造了完整的检测框架,帮助运维同事直接定位故障点,或一键判断虚拟网络是否存在问题。BigBrother上线后即用于云主机迁移前后的连通性验证,保证出现异常后可以及时告警回滚。从8月初至今历时两个月,共迁移2000多台主机,及时发现迁移异常近10起。

1c3711e244ebe3d1013bd57767236217.png

一、第一代网络连通性工具的不足在设计BigBrother这前,我们也有第一代的网络连通性检查工具,原理就是通过SSH跳转到目标宿主机上,利用ovs的packet out命令将构造的报文发出去,最后在对端的宿主机上tcpdump该报文,从而验证两端的连通性。但是从它的原理就不难看出,这种检测方式有着很大的缺点:
  • 检测效率低下,无论是ssh、packet out,还是tcpdump都无法支持大规模的快速检查;

  • 适应的场景有限,对于部分dpdk、p4网关类产品,无法通过tcpdump进行抓包判断。

因此做一款支持全链路大规模的连通性检测系统是非常有必要的,我们的目标就是让运维、NOC的同学能够迅速发现并解决网络不通的问题,同时为我们的虚拟网络服务变更保驾护航。二、BigBrother的实现原理BigBrother(下文简称BB)可以将全网资源连通情况都实时监控起来,整个BB检测系统由若干个组件配合完成,mafia提供console进行创建及展示task的结果,minitrue用于将用户传入的参数转化为注包的范围,telescreen用于构造报文及收发报文。1

Entrypoint和Endpoint

 在具体介绍BB的原理前,我们先来看两个概念。在我们的虚拟网络中,每个实例(uhost、umem、udb等)都是通过接入点来接入虚拟网络,接入点由两部分组成:
  • Entrypoint: inbound/outbound报文都是经由Entrypoint进行接受和发送的。

  • Endpoint:连接实例的端点,Endpoint为最接近实例的网元。

例如在公有云场景中,entrypoint和endpoint都是openvswitch,而在物理云场景中,entrypoint是我们的物理云转发网关(vpcgw、hybridgw),endpoint则是物理云主机的上联ToR。

场景

Entrypoint

Endpoint

公有云

ovs

ovs

物理云

vpcgw、hybridgw

ToR

托管云

hcgw、cloudgw

PE

跨域网关

sdngw

ovs

公共服务

ovs

ovs

CNAT

ovs

ovs

托管云(UXR)

UXR

PE

跨域网关(UXR)

UXR

ovs

CNAT(UXR)

UXR

ovs

以上就是各种场景中的接入点说明,之所以要明确这两个概念,是因为在BB系统中,我们将Entrypoint作为注包点,向其发送GRE探测报文,同时将Endpoint作为采样点,Endpoint会识别并镜像特殊的探测报文至BB。

2检测流程检测方案如图所示,可分为两部分组成,在图中的流向分为橙色和紫色。

cf8c45664d875ec1b30277758d68c381.png

以橙色流向部分为例(SRC->DST):1)BigBrother模拟DST向Endpoint发送探测报文;2)SRC端Entrypoint收到该探测报文后转发给Endpoint;3)Endpoint将该报文镜像至BigBrother;4)Endpoint将报文正常转发至实例;5)实例回复报文给Endpoint;6)Endpoint收到该回复报文后进行GRE封装,然后镜像至BigBrother;7)Endpoint将报文正常转发至Entrypoint;8)SRC Entrypoint将回复报文发送至DST Entrypoint;9)DST Entrypoint收到回复报文后发送给Endpoint;10)DST Endpoint将回复报文镜像至Bigbrother。至此,单边的检测结束。在检测过程中,BigBrother发送了1个探测报文,共收到了3个采样报文,通过分析这3个采样点可以确认SRC->DST方向是否通信正常。反之亦然,紫色部分原理相同。全部检测结束后,BigBrother共可以收到6个探测报文,如果6个报文均收到则表示连通性正常。3探测报文设计 上文中介绍了BB的检测流程,下面我们再来看下探测报文及转发面的设计实现。公有云和混合云的设计存在很多不同。公有云转发面需要在全局hook点(table_1),分别hook探测报文的request和response,然后进行染色、镜像至BB等步骤。而混合云转发面则需要ToR、PE交换机开启ERSPAN功能,将染色的报文镜像至BB即可。整体数据包交互如下图所示:

58b04eaaad362c4fac3ea56767cdd9c3.png

而一个合格的探测报文首先应该具备以下特征:
  • 染色信息与主机、OS无关;

  • ovs2.3、ovs2.6版本(现网主要版本)可以识别并处理此种染色信息。

因此我们详细比较了如下两种候选方案。1)icmp + tos方案第一种方案以icmp报文为载体,使用tos对icmp_request进行染色,采集时将此tos的icmp报文镜像至BB即可。
cookie=0x20008,table=1,priority=40000,metadata=0x1,icmp,icmp_type=8,icmp_code=0,nw_tos=0x40 actions=Send_BB(),Learn(),Back_0()
对于hook icmp_request的flow可以简化为如下逻辑:action部分主要由三部分组成:
  • Send_BB() 将报文镜像给BB;

  • Learn() 通过icmp_request报文学习到一条用于匹配icmp_reply报文的flow,该条flow的主要动作包括:染色、镜像至BB;

# 1. ??REG3 ?64200# (global hook) reg3 load:64200->NXM_NX_REG3[], # 2. learn action learn(table=31,idle_timeout=2,hard_timeout=4,priority=30000,dl_type=0x0800,ip_proto=1,icmp_type=0,icmp_code=0,NXM_OF_IP_SRC[]=NXM_OF_IP_DST[],NXM_OF_IP_DST[ ]=NXM_OF_IP_SRC[],Stain(),Send_BB()),# 3. REG3 0load:0->NXM_NX_REG3[] 
  • Back_0() 将该报文送回table_0,进行常规的转发操作。

对于hook icmp_reply的flow可以简化为如下逻辑:
cookie=0x20008,table=1,priority=40000,metadata=0x1,icmp,icmp_type=0,icmp_code=0,nw_tos=0x40
action部分主要由四部分组成:•Save(in_port, tun_src) 将报文中的in_port和tun_src保存下来;•Resubmit(table=31) 跳转至table31,匹配icmp_request learn生成的flow;•Restore(in_port, tun_src) 恢复in_port和tun_src;•Back_0() 将该报文送回table_0,进行常规的转发操作。以上讨论的是公有云侧ovs的染色及镜像方法,而混合云侧就需要交换机ERSPAN来进行支持,为了使ERSPAN规则可以镜像tos染色报文,需要GRE外层Ip Header中的tos继承overlay Ip Header中标记的tos,所以需要全网对GRE隧道设置继承内层tos的隧道属性,执行命令如下:
ovs-vsctl set in  options:tos=inherit
此种方案虽然可以实现染色及镜像的功能,但是hook点预埋的flow过于复杂,不容易维护,最关键的一点在于,混合云网络中,该方案无法支持 learn flow,所以无法对反向的流量进行染色。2)tcp方案第二种方案以tcp报文为载体,使用特定的端口作为染色条件,采集时将此源目端口的tcp报文镜像至BB即可。
cookie=0x20008,table=1,priority=40000,tcp,metadata=0x1,tp_src=[port],tp_dst=[port] actions=Send_BB(),Back_0()
对于hook tcp_request的flow可以简化为如下逻辑:action部分主要由两部分组成:•Send_BB() 将报文镜像给BB;•Back_0() 将该报文送回table_0,进行常规的转发操作。

以上两种方案进行对比不难看出,第一种方案依赖较多并且适用场景受限,所以BB采用的是第二种方案。但是tcp方案也有一定的缺陷,如何选择染色的port并且要与用户的流量区分开来,这是一个难点。经过我们几次踩坑后分析,最后决定使用tcp源目port=11来进行染色(目前已告知用户会使用TCP 端口11进行扫描,详见文档),报文如下图所示。

fe16ca2fc0d0754f4fc534a019acfa23.png

4各场景下探测报文的生命周期BB被设计为支持多种网络场景,能应对物理云和跨域互通的网络复杂性。这章节我们以探测物理云和跨域为例,详细分析下BB探测报文的生命周期。
  • 物理云

公有云互通物理云场景下,探测报文生命周期如下:

公有云—> 物理云

9b99d7657c7a4c08903774d3cf90bca1.png

1)BigBrother向公有云宿主机发送探测报文

2)ovs收到报文后镜像至BigBrother3)ovs将报文送至实例4)实例回应报文5)ovs将回应报文镜像至BigBrother6)物理云核心交换机收到报文,并发送给汇聚交换机7)8)9)10)物理云汇聚交换机发送报文给vpcgw,vpcgw处理报文后回送至汇聚交换机11)在物理云汇聚交换机配置ERSPAN,将报文镜像至BigBrother。物理云—> 公有云

1b45adaee5183bcc04506b58ce3ef230.png

1)BigBrother向vpcgw发送探测报文2)3)vpcgw处理报文后回送至汇聚交换机4)在物理云汇聚交换机配置ERSPAN,将报文镜像至BigBrother5)汇聚交换机将报文送至phost的上联Tor6)Tor将报文送至phost7)phost回应报文8)在phost的上联Tor配置ERSPAN,将报文镜像至BigBrother9)报文送至公有云宿主机ovs10)ovs收到报文后镜像至BigBrother
  • 跨域网关

公有云跨域互通场景下,探测报文生命周期如下:

本地域—> 地域B

c819adfd2553f136179102c31fc9f6e6.png

1)BigBrother 向本域主机发送探测报文

2)ovs收到报文后镜像至BigBrother3)ovs将报文送至实例4)实例回应报文5)ovs将回应报文镜像至BigBrother6)ovs将报文送至sdngw7)sdngw将报文镜像至BigBrother地域B—> 本地域

4625500351080283c87cb35d4a12c6cc.png

1)BigBrother 向本域sdngw发送探测报文2)sdngw收到报文后镜像至BigBrother3)sdngw将报文送至对端sdngw进行转发4)本域sdngw收到对端回应报文5)sdngw将回应报文镜像至BigBrother6)sdngw将报文送至本地域宿主机7)ovs将报文镜像至BigBrother三、Bigbrother服务框架整个BB检测系统由若干个组件配合完成,minitrue用于将用户传入的参数转化为注包的范围,telescreen用于构造报文及收发报文。

a60bc025302bb74c11bc3e130a46508b.png

1服务框架图API:FE服务对外提供的HTTP接口,用于创建任务和查询任务进度;Logic:业务处理层,⽤于分析⼊参并将其转换为若干源⽬主机对放入Disruptor中;Disruptor:此组件为开源高性能队列;Sender:将Disruptor中pop的数据组装成GRE packet,并发送给EntryPoint;Receiver:接收从EndPoint上报的GRE packet;Analysis:将接收的报⽂存入内存中,同时对报文进⾏分析。2Task的执行及结果分析 1)task上文中我们详细介绍了BB探测报文的设计和生命周期,但是我们还有一个问题需要解决:提高BB的并发能力。按照上文的介绍,每次BB只能执行一次探测,顺序执行才能保证检测结果的准确性,所以我们设计利用TCP报头中的序列号来提高并发。以下是一个TCP报文的首部结构:

2f37d927c51af969312213ea9b6ee53f.png

其中32位的Seq序列号就是我们要利用的,在BB探测过程中每个Seq序列号都唯⼀标识⼀个pair对,然后我们将Seq序列号分成了两部分:

e2b4f12aa9f082bfe6a33db0261d2e30.png

  • Task_id:⽤于标识一个Task,由于仅有5位,所以每次同时进⾏的Task不能超过32个 ;

  • Pair_id:用于标识在一个Task内,待检测的一个pair对。

因此,我们可以将BB并发的任务数提高到了32个,而每个任务支持最大的检测pair对数可以达到2的27次方,相当于每个任务都可以支持一个容量为10000台云主机的VPC进行Full Mesh检测,足以覆盖现有用户的网络规模。2)task的执行当运维同学在mafia(任务控制台)上点击创建一个BB task进行连通性检查时,会经历以下几个过程:

fa8021ef1206941a9e6a03df5dde9e69.png

•请求发送给minitrue服务,根据输入的参数来确定探测范围;•minitrue将计算得到的探测范围以源、目节点列表的形式发送给telescreen服务;•telescreen构建Gre报文,并放入高性能队列中进行发包;同时,telescreen会监听网卡获取镜像报文回来的报文并存入内存;•minitrue的分析程序定时获取telescreen的收包结果并进行分析;•最后运维同学可以在mafia上看到最终的探测结果。

daa348db32d15be2fe5a7dcf2990d3c2.png

3)task的结果分析task执行结束后,运维同学可以在mafia查看到最后的检测报告,包括发送的总pair数、收到的pair数、成功以及失败的数量。同时,检测失败的源目详细信息也会展示出来,最终以bitmap的方式呈现出来,0表示没有收到报文,1表示收到报文。我们以下图的结果为例,解释其含义。图中是检测ip pair(10.9.88.16010.8.17.169)的双向连通性。

9c2ea3a20358fb18d6ebeb879cfb07a4.png

我们再回顾下第二章中BigBrother检测的流程图,首先BigBrother会模拟10.9.88.160向10.8.17.169的宿主机上发送探测报文,报文的内容为。如果10.8.17.169 —>10.9.88.160 单向连通性正常的话,BigBrother最终会收到3个报文:

(1)

nw_dst=10.8.17.169>

(2)

nw_dst=10.9.88.160>

(3)

nw_dst=10.9.88.160>

f95b7297a0461f818f893e48e0d42a83.png

上图bitmap后三位的结果为111,表示这3个报文都收到了,即10.8.17.169 —>10.9.88.160 单向的连通性正常。

反之亦然,前三位则表示10.9.88.160 —> 10.8.17.169单向的连通性情况,结果为100,(2)(3)报文没有收到,即表示 10.9.88.160 —> 10.8.17.169单向的连通性异常,虚机10.9.88.160没有回复报文,可以断定虚机内部异常或虚机内部存在iptables规则将探测报文过滤。3基于活跃flow的连通性检查上文我们提到,运维同学可以在mafia上创建BB task来进行连通性的检查,通过传入mac、子网id、VPC id来确定检测的范围,进而进行全量验证。但是大多数场景中,我们不需要进行全互联检查,这样不仅浪费时间而且还会对控制面造成一定的压力。我们仅需要针对指定范围内的活跃flow验证连通性即可,所以我们又引入了活跃flow检测的服务——river。river是虚拟网络亿级别活跃流的分析系统,借助这个系统BB可以拿到用户的活跃通信源目,类似于缓存里的热点数据,这样可以让BB快速精准验证变更。

7acd0301d7270c9e184d4a80a0e05f88.png

与上文全量BB探测的区别在于,minitrue无须自己计算源、目节点列表,只需指定范围后向river获取活跃列表,然后通过常规的检测流程将列表传送给telescreen进行发包即可。四、投入使用和未来计划BigBrother上线后就参与到了资源整合项目中,用于云主机迁移前后的连通性验证,保证出现异常后可以及时告警回滚。从8月初至今历时两个月,共迁移2000多台主机,及时发现迁移异常近10起。同时,我们对BigBrother后续版本也有着一定的规划,例如:
  • 除了对连通性的检测外,还需要有平均时延,最大时延对、丢包率的检测;

  • 打算基于BigBrother构建针对指定用户的内网全天候监控。

来源:本文转自公众号 Ucloud 技术。

64b9e91fc68eb2aeeadb2348395423da.gif更多云实践和技术干货,欢迎关注“UCloud技术”d4e6697286708b007772c33a7831f678.png

3b41f1f4582bbe2303bb61a9561223ca.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java对接华为推送服务_华为HMS Core 4.0版本即将来袭:包含新推送服务

据官方消息,在12月27日的HUAWEI Developer Groups(简称HDG)大连活动上,华为消费者云服务HMS运营经理透露HMS Core 4.0版本即将上线,由原来的14项增加至24项核心开放功能,近日即将开放新版本众测,不久之后开发者们将会体…

python xml etree_python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用...

1、解析速度:ElementTree在 Python 标准库中有两种实现。一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.cElementTree 。你要记住: 尽量使用 C 语言实现的那种,因为它速度更快,而…

CISSP的成长之路(二十一):用户持有凭证

在51CTO安全频道特别策划的CISSP的成长之路系列的上一篇文章《讲解身份验证过程》里,J0ker给大家介绍了用户验证时所依赖的三种验证要素、密码和密码短语及其安全使用原则。作为技术实施难度和成本最低的用户验证方案,基于密码的用户验证方案广泛应用于我们的日常生…

独家:Havok 发布新的 AI 中间件

独家:Havok 发布新的 AI 中间件 March 23rd, 2009 Alex J. Champandard 2009-3-23,赖勇浩(http://blog.csdn.net/lanphaday)译 原文地址:http://aigamedev.com/middleware/havok-ai-announced 在20日(上周五…

mysql查询入门_Mysql入门(四)查询

我们继续查询~条件查询及逻辑运算符条件查询如果我只想查询&#xff0c;年级小于30的&#xff0c;可以加个where条件关键字~条件查询敲黑板select * from yingxiong where y_age<30where 表示条件(条件关键字)&#xff0c;在where之后跟过滤的条件注意&#xff1a;逻辑运算符…

maven provided_Maven 教程之 pom.xml 详解

点击上方“Java知音”&#xff0c;选择“置顶公众号”技术文章第一时间送达&#xff01;作者&#xff1a;dunwuhttps://github.com/dunwu/blog推荐阅读(点击即可跳转阅读)1. SpringBoot内容聚合2. 面试题内容聚合3. 设计模式内容聚合4. Mybatis内容聚合5. 多线程内容聚合简介什…

python将一个列表里面的某类元素取出来_03|Python列表常见操作

欢迎关注pythoner派微信公众号及头条号Python常见的数据结构我们在上一节中已经讲过再阅读文章前&#xff0c;请打开PythonIDE列表&#xff1a;1.定义一个列表现在我们有3瓶不同类型的啤酒&#xff0c;现在我们将其放入列表之中beer [粉象,白熊,橙色炸弹]2.向列表中追加元素现…

使用SDL打造游戏世界之入门篇 - 2

VC6下SDL的安装和初步使用首先&#xff0c;我们为所有的工程创建一个文件夹tutorial,将下载的开发库SDL-devel-1.2.8-VC6.zip拷贝到tutorial下并解压&#xff0c;并保证如下的文件夹层次&#xff08;图2&#xff09;如下&#xff1a;图2下面我们打开Visual Studio6.0&#xff0…

python虚拟环境管理工具_Python虚拟环境和包管理工具Pipenv的使用详解--看完这一篇就够了...

前言Python虚拟环境是一个虚拟化&#xff0c;从电脑独立开辟出来的环境。在这个虚拟环境中&#xff0c;我们可以pip安装各个项目不同的依赖包&#xff0c;从全局中隔离出来&#xff0c;利于管理。 传统的Python虚拟环境有virtualenv&#xff0c;使用pip freeze → requirements…

centos 6.8安装git_RPM包的卸载与安装,包含依赖包卸载

一、 rpm包的管理介绍&#xff1a;一种用于互联网下载包的打包及安装工具&#xff0c;它包含在某些Linux分发版中&#xff0c;它生成具有RPM扩展名的文件&#xff0c;RPM是RedHat Package Manager&#xff08;RedHat软件包管理工具&#xff09;的缩写&#xff0c;类似windows的…

anaconda matplotlib 输出动画_Python+Matplotlib 制作排序算法的动画

1 、算法的魅力深刻研究排序算法是入门算法较为好的一种方法&#xff0c;现在还记得4年前手动实现常见8种排序算法&#xff0c;通过随机生成一些数据&#xff0c;逐个校验代码实现的排序过程是否与预期的一致&#xff0c;越做越有劲&#xff0c;越有劲越想去研究&#xff0c;公…

如何在centos中找到安装mysql_centos上如何安装mysql

centos可以使用yum安装mysql 但是版本很低&#xff0c;且不灵活。本文将介绍如何使用安装包安装mysql将下载文件放在/opt/mysoft文件夹中解压文件tar -xf MySQL-5.6.22-1.linux_glibc2.5.x86_64.rpm-bundle.tar这里我们要安装mysql的服务端和客服端&#xff0c;所以使用下面两个…

html选择器_css的9个常用选择器

1.类选择器&#xff08;通过类名进行选择&#xff09;<!DOCTYPE html> <html> <head><title></title> </head> <style type"text/css">.p1{color: #00ff00;}.p2{color: #0000ff;} </style> <body><p class…

Resharper4.5:增强你的.net开发

Resharper4.5:增强你的.net开发 介绍 无庸置疑&#xff0c;ReSharper是最智能化的微软Visual Studio插件。它包括一系列丰富的能大大增加C#和Visual Basic.net开发者生产力的特征。使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错…

mybatis collection_MyBatis之关联查询

前言我们进行数据库查询时往往需要的不止一张表的数据&#xff0c;需要将多张表的数据一起查询出来&#xff0c;大家学习过数据库的连接查询&#xff0c;那么在MyBatis中如何将有关系的多张表数据进行关联查询呢。表的结构商品和订单是典型的一对多关系&#xff0c;下面的案例我…

mysql如何优化性能优化_如何优化性能?MySQL实现批量插入以优化性能的实例详解...

这篇文章主要介绍了MySQL实现批量插入以优化性能的教程,文中给出了运行时间来表示性能优化后的对比,需要的朋友可以参考下对于一些数据量较大的系统&#xff0c;数据库面临的问题除了查询效率低下&#xff0c;还有就是数据入库时间长。特别像报表系统&#xff0c;每天花费在数据…

不支持对系统目录进行即席更新_「目录」让你的文档结构一目了然

很多时候&#xff0c;要求文档要有目录&#xff0c;比如书籍/杂志/论文/标书等等。目录可以让文档结构一目了然。如果不了解 Word &#xff08;包括 Microsoft Office 和 WPS Office 下的Word&#xff09;操作&#xff0c;目录的各标题及对应页码可能是手动一个一个码上去。其实…

合成/聚合原则: 桥接模式

假想场景&#xff1a;hp和apple是全球知名的电脑生产厂家&#xff0c;起初他们各自的电脑操作系统分别是linux和macintosh&#xff0c;microsoft是软件行业的龙头。为了吸引更多客户购买电脑&#xff0c;hp和apple请ms为他们开发两款最常用的软件&#xff0c;办公软件和及时通讯…

java查看jdk源码_Java-如何查看JDK源码

一、引言学习Java和使用Java的小伙伴都必须要看的懂Java的开发文档&#xff0c;然而&#xff0c;开发文档只是开发者对Java代码的功能做出简略的说明&#xff0c;它只是告诉你这个类能干嘛&#xff0c;并没告诉你这个类怎么干&#xff0c;所以&#xff0c;阅读Java源码是每个开…

arrays中copyof复制两个数组_数据结构与算法(3)数组

前言数组(Array)是一种线性表数据结构&#xff0c;利用一组连续的内存空间&#xff0c;存储一组具有相同类型的数据。概念介绍首先我们说一下什么是线性表&#xff0c;线性表就是数据排成一条线的数据结构&#xff0c;每个线性表最多只有前和后两个方向&#xff0c;数组、链表、…