opencontrail学习(一)
从某位大牛的微博上看到了对opencontrail的评价,引起了我的兴趣,点开有人为其翻译的中文文档学习了下,把之前一些零碎的东西,比较系统性地串起来了,感觉很爽,所以决定把src下下来八一八。
下载了contrail-vrouter的代码,因为刚好在做底层类似的东西,可以对比学习下,contrail-controller的代码,暂时没时间研究了,留着闲了再说。
1. 先从数据结构上分析, 它里面都是基于vr_packet来做,对于linux而言就是在skb->cb里面存了一个结构,并把skb->head等信息存进去,后面所以的处理都是基于packet,最后发送的时候再转成skb,跟我们的想法类似,我们直接就define skb xxxx,这样就很好滴解决网络包结构异构的问题。
2. 有比较完整的库,从写法上来看,是做了很多库封装的事情,跨各种平台(freebsd),各种协议(mpls,vxlan,gre),有点dpdk的感觉, 包括里面也自己对于内存分配进行了管理
3. 在dataplane上的一些处理,跟ovs类似,有flowtable,action,并且也是从用户态下发action。
4. 整个dataplane做的非常灵活,完全是基于决策来做事情的,比如所action= hold, 那么用户会把flow enqueue进去,等到用户态一个命令下来,就会flush flow,这样可以用在action invalid的时候,先hold再更新保证事务,还有arp的请求,可以用户配置成proxy模式,这样就会自动进行回复,还有下一条设置成mpls, vxlan等各种类型,这样包可以随时在mpls或者vxlan之间进行网络切换,可以用于网络的升级,正好可以解决我们现在面对的网络架构升级问题。
5. 代码主要分为几层,第一层host,这里面首先是一些通用的host上的操作(vr_host_interface_ops),具体的方法是调用freebsd和linux里面的实现,剩下的逻辑就是包在host上的处理,如把包从udp socket上收上来,传给dataplane(入口为vif_rx), 或者把内层包从udp socket发出去了。第二层就是dataplane,里面就是内层包的处理逻辑,根据nexthop,解封相应的隧道头,并把包发给相应的interface处理。 这里的nexthop的结构相比linux kernel要复杂很多,包括了各种flag, tunnel type 还有arp proxy,里面ip forward的查找是基于4层lpm计算的,arp的逻辑主要在vr_get_proxy_mac
6. 针对linux bridge, host上面的hook点在br_handle_frame_hook, openvswitch_handle_frame_hook,看来大家都想到一块去了。
7. 由于它有个做决策的用户态进程,所以复杂的业务逻辑都可以转交给上层进行解析处理,并下发决策,目前看它支持的trap类型有AGENT_TRAP_FLOW_MISS, AGENT_TRAP_ECMP_RESOLVE, AGENT_TRAP_SOURCE_MISMATCH,AGENT_TRAP_DIAG,AGENT_TRAP_HANDLE_DF,AGENT_TRAP_ARP
8. 它里面支持mirror,这个功能对于线上排查问题来说,非常好用啊。
收包路劲的分析
1.. 先从vm的入包流程分析,host.hif_udp_rx -> vm_rx->vr_virtual_input->先查表,vr_flow_forward 如果失败则 vr_bridge_input ->nh_output->nh_l2_rcv->如果是arp的包,vr_arp_input, ip的包则vr_l3_input
2.. 如果是arp的请求包,配置了arp proxy则构造一个reply包,用proxy的mac进行回复,又重新调用vr_bridge_input发送出去,如果是xconnect, 则调用bridge的vif tx发送,最终发给vm。
3.. 如果是arp的响应包,从外面收到的arp reply,先xconnected,通过bridge的vif tx发送到vm,并且必须trap到用户态的agent
4. 如果是ipv4包的话,vr_ip_input->先进行vr_flow_forward,如果失败则vr_forward->vr_inet_route_lookup 进行路由查找,找到下一跳和下一跳的dev,调用nh_output,把包发给相应的vm的收包函数
关于发包路径,及 multicast, ecmp, ipfragment, flow entry的细节还待研究
opencontrail学习(一)相关推荐
- [转]OpenContrail 体系架构文档
OpenContrail 体系架构文档 英文原文:http://opencontrail.org/opencontrail-architecture-documentation/ 翻译者:@KkBLu ...
- SDN学习四——必须强调,目前所写内容发行时间是2014年
目录 一.东西向接口协议--东西桥 EAST-WEST BRIDGE 二.SDN数据平面 2.1 数据平面架构 2.2 SDN芯片 2.3 SDN硬件交换机 2.4 SDN软件交换机 2.4.1 op ...
- OpenContrail 体系(一)
1 Overview of OpenContrail 本章节介绍OpenContrail系统-一个SDN的扩展平台 所有主要内容在本章中都有简略介绍,详细内容会在后续章节中继续描述 1.1 使用案例 ...
- java入门 慕路径,Java入门基础知识总结学习教程大全【必看经典】
类型的表达式,是循环条件,表达式3是党执行了一遍循环之后,修改控制循环的变量值. ??? for语句的执行过程是这样的:首先计算表达式1,完成必要的初始化工作:然后判断表达式2的值,如果表达式的值为t ...
- Java EE学习心得
–Java EE学习心得 1. 称为编程专家的秘诀是: 思考-----编程--------思考------编程--.. 编程不能一步到位,不能一上来就编,必须先思考如何写,怎样写?然后再编程 ...
- FastAI 2019课程学习笔记 lesson 2:自行获取数据并创建分类器
文章目录 数据获取 google_images_download 的安装和使用 挂载google 个人硬盘到Google colab中 删除不能打开文件 创建ImageDataBunch 训练模型 解 ...
- FastAI 课程学习笔记 lesson 1:宠物图片分类
文章目录 代码解析 神奇的"%" 导入fastAI 库 下载解压数据集 untar_data 获取帮助文档 help() ? ?? doc 设置路径 get_image_files ...
- 深度学习学习指南-工具篇
colab Colab是由Google提供的云计算服务,通过它可以让开发者很方便的使用google的免费资源(CPU.GPU.TPU)来训练自己的模型. 学习经验总结 如何使用命令行? 通过!+cmd ...
- Redis学习之路(一)--下载安装redis
redis学习之路--下载安装redis windows安装redis 1.下载redis 2.安装 3.查看是否安装成功 windows安装redis 1.下载redis 网址:https://gi ...
- python内置库之学习configparser库(一)
python内置库之学习configparser库(一) 1.引言 ini文件简介 [节] 键=值 注:节不能重复出现 2.自己封装了一个增删改查的类,可以参考一下 import configpars ...
最新文章
- onnx模型部署(一) ONNXRuntime
- android 骨架屏刷新动画,ios - 原生骨架屏,网络加载过渡动画的封装
- c语言strchr的用法,C 库函数 - strchr()
- org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI
- java生成pdf_JAVA 生成PDF 并导出
- 修改win10我的文档下载等移动别处
- NCRE四级网络工程师考题详解----三级索引结构
- Linux下通过 rm -f 删除大量文件时报错:Argument list too long
- 手动写一个上传图片的组件,不适用插件,包括限制图片大小,格式
- 计算机类核心期刊投稿的一些资料汇总
- [面试系列]牛客网前端社招面试
- mtk 软件下载过程
- 济宁市计算机技能大赛,【嘉职动态】2019年济宁市职业院校技能大赛嘉祥职业中专赛区圆满完成任务...
- Elasticsearch5.0 安装 以及 问题集锦
- LGWR waits for event ‘DLM cross inst call completion’ 故障排除
- 如何使用装饰设计模式读取指定路径下的纯文本文件的实现代码
- BlueHost独立服务器受站长欢迎的原因
- APICloud的特性
- 一款方便好用的免费截图神器
- 彩色复古装饰麻绳-----四色麻绳