当前位置: 首页 > news >正文

【博客633】linux vxlan设备工作原理

linux vxlan设备工作原理

vxlan处理包的原理:以k8s cni flannel组件创建的vxlan设备为例

1、k8s cni组件创建flannel设备flannel.1,且这个设备为vxlan类型的设备

root@10.10.10.12:/home/ubuntu#  ethtool -i flannel.1
driver: vxlan
version: 0.1
firmware-version:
expansion-rom-version:
bus-info:
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

2、vxlan设备创建的时候是有绑带其vtep通信的设备,比如:eth0

root@10.10.10.12:/home/ubuntu# ip -d link show flannel.1
6: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN mode DEFAULT group defaultlink/ether 7e:b8:27:c7:4b:76 brd ff:ff:ff:ff:ff:ff promiscuity 0 minmtu 68 maxmtu 65535vxlan id 1 local 10.10.10.12 dev eth0 srcport 0 0 dstport 8472 nolearning ttl auto ageing 300 udpcsum noudp6zerocsumtx noudp6zerocsumrx addrgenmode eui64 numtxqueues 1 numrxqueues 1 gso_max_size 65536 gso_max_segs 65535

3、flannel的agent会维护fdb表,查看flannel.1设备的fdb表

root@10-234-68-12:/home/ubuntu# bridge fdb show dev flannel.1
3e:5f:25:8e:e0:cd dst 10.10.10.12 self permanent
16:1d:36:f4:ab:26 dst 10.10.10.13 self permanent
a6:a0:56:1f:aa:4c dst 10.10.10.14 self permanent
76:50:cc:8d:7a:67 dst 10.10.10.15 self permanent

4、每个vxlan设备创建的时候会绑定一个udp socket,此时会有udp的vxlan端口的在监听,从而接收udp隧道包进行处理

# vxaln监听着8472的vxlan默认udp端口:
ubuntu@10.10.10.12:~$ netstat -uanv
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
udp        0      0 0.0.0.0:53851           0.0.0.0:*                          
udp        0      0 127.0.0.53:53           0.0.0.0:*                          
udp        0      0 0.0.0.0:111             0.0.0.0:*                          
udp        0      0 0.0.0.0:2049            0.0.0.0:*                          
udp        0      0 0.0.0.0:37543           0.0.0.0:*                          
udp        0      0 0.0.0.0:37554           0.0.0.0:*                          
udp        0      0 0.0.0.0:39762           0.0.0.0:*                          
udp        0      0 0.0.0.0:8472            0.0.0.0:*                          
udp6       0      0 :::52508                :::*                               
udp6       0      0 :::54535                :::*                               
udp6       0      0 :::59285                :::*                               
udp6       0      0 :::111                  :::*                               
udp6       0      0 :::2049                 :::*                               
udp6       0      0 :::40104                :::* 

细节剖析

1、vxlan模块回调函数在哪里设置:在vxlan 模块初始化中做:vxlan_init_module

1、register_pernet_device内部执行init函数rc = register_pernet_device(&vxlan_net_ops);
static struct pernet_operations vxlan_net_ops = {.init = vxlan_init_net,.exit = vxlan_exit_net,.id   = &vxlan_net_id,.size = sizeof(struct vxlan_net),
};2、设置收包的vxlan回调函数/* Disable multicast loopback */
inet_sk(sk)->mc_loop = 0;/* Mark socket as an encapsulation socket. */
udp_sk(sk)->encap_type = 1;
udp_sk(sk)->encap_rcv = vxlan_udp_encap_recv;

2、包如何来到vxlan的回调处理函数

已经知道vxlan是 MAC IN UDP中的封装,因此,在解封装之前,一切按照原有流程走

2-1、从网卡收到包来到协议栈开始:__netif_receive_skb_core**

/*type,二层封装内的协议,IP为 0x0800*/
type = skb->protocol;
/*获取协议注册的入口函数,ip为 ip_rcv,声明的变量为 ip_packet_type*/
list_for_each_entry_rcu(ptype,&ptype_base[ntohs(type) & PTYPE_HASH_MASK], list) {if (ptype->type == type &&(ptype->dev == null_or_dev || ptype->dev == skb->dev ||ptype->dev == orig_dev)) {if (pt_prev)ret = deliver_skb(skb, pt_prev, orig_dev);pt_prev = ptype;}
}

2-2、ip_rcv

此函数只是对报文进行可靠性验证,最后到 钩子函数 ‘NF_HOOK’。
钩子函数中就是配置的netfilter,通过验证就会直接进入函数 ‘ip_rcv_finish’。

2-3、ip_rcv_finish

/*sysctl_ip_early_demux 是二进制值,该值用于对发往本地数据包的优化。
当前仅对建立连接的套接字起作用。*/
if (sysctl_ip_early_demux && !skb_dst(skb) && skb->sk == NULL) {const struct net_protocol *ipprot;int protocol = iph->protocol;ipprot = rcu_dereference(inet_protos[protocol]);if (ipprot && ipprot->early_demux) {ipprot->early_demux(skb);/* must reload iph, skb->head might have changed */iph = ip_hdr(skb);}}
/*这一部分时查找路由,判断是local in还是 forwarding。本次分析按照 local in分析*/
if (!skb_dst(skb)) {int err = ip_route_input_noref(skb, iph->daddr, iph->saddr,iph->tos, skb->dev);if (unlikely(err)) {if (err == -EXDEV)NET_INC_STATS_BH(dev_net(skb->dev),LINUX_MIB_IPRPFILTER);goto drop;}}
……/*按照local in分析,则此处相当于调用 ip_local_deliver(可深入 查找路由函数,里面有函数指针赋值)*/return dst_input(skb);

2-4、ip_local_deliver

钩子函数检测,不深入,直接到最后。

2-5、ip_local_deliver_finish

ipprot = rcu_dereference(inet_protos[protocol]);
……ret = ipprot->handler(skb);
……			
到了传输层注册的入口函数。UDP入口函数为 ‘udp_rcv’。

2-6、__udp4_lib_rcv

/*根据源目端口号及IP查找 插口*/
sk = __udp4_lib_lookup_skb(skb, uh->source, uh->dest, udptable);
……/*进入udp队列收包流程*/int ret = udp_queue_rcv_skb(sk, skb);
……

2-7、udp_queue_rcv_skb

/*插口如果是封装类型,vxlan等,则进入封装处理入口,下面开始分析vxlan部分代码*/
encap_rcv = ACCESS_ONCE(up->encap_rcv);
if (skb->len > sizeof(struct udphdr) && encap_rcv != NULL) {int ret;ret = encap_rcv(sk, skb);if (ret <= 0) {UDP_INC_STATS_BH(sock_net(sk),UDP_MIB_INDATAGRAMS,is_udplite);return -ret;}
}

3、vxlan的udp并不会上送到udp socket监听的进程,与传统用户态监听udp socket不同

vxlan的udp并不会上送到udp socket监听的进程,因为没有这个进程,vxlan设备是为udp socket注册了回调,让协议栈调这个回调来处理这个包,而不是上送到用户进程。这个回调函数进行包的拆解后把原包再经过协议栈,然后上送用户态进程

UDP有两条处理路径:

  • 1、放到sk的接收队列,通知等待进程
  • 2、调用udp_sock的encap_rcv函数,类似vxlan的实现,可以直接在内核中进行处理

如果udp_sock定义了encap_rcv函数,将会把报文交给该函数处理,而不是传统的保存到sock队列,唤醒进程收包。

总结:linux对vxlan包的处理过程

  • 创建vxlan设备的时候会创建udp socket来向内核注册对udp包的处理,这个udp socket还绑定了vxlan处理的回调函数
  • 当udp包来了,内核发现有相应的udp socket在监听,就将包给这个udp socket指定的回调来处理,如果有设置回调的话,vxlan的udp socker设置的vxlan包回调处理函数就会在这里调用,
    从而有机会处理vxlan udp隧道包。
  • 包到了之后通过udp socket指定的vxlan回调处理函数进行包的拆解然后才是把里面的原包上送协议栈,从而送到用户态进程
  • vxlan的收包和发包是从另外的设备那里拿和发到那个设备的,这个设备在创建vxlan设备的时候,用dev参数指定的
  • vxlan设备创建的时候没有指定remote端vetp的信息就会去查转发表,此时就可以通过自己的agent来维护转发表,从而实现自己的大三层网络拓扑

相关文章:

【博客633】linux vxlan设备工作原理

linux vxlan设备工作原理 vxlan处理包的原理&#xff1a;以k8s cni flannel组件创建的vxlan设备为例 1、k8s cni组件创建flannel设备flannel.1&#xff0c;且这个设备为vxlan类型的设备 root10.10.10.12:/home/ubuntu# ethtool -i flannel.1 driver: vxlan version: 0.1 fi…...

3.12学习周报

文章目录前言文献阅读摘要简介方法介绍讨论结论相关性分析总结前言 本周阅读文献《Streamflow and rainfall forecasting by two long short-term memory-based models》&#xff0c;文献主要提出两种基于长短时记忆网络的混合模型用于对水流量和降雨量进行预测。小波-LSTM&am…...

电力电子中逐波限流控制以及dsp实现

逐波限流是指在电力系统运行中&#xff0c;对电力设备进行电流保护的一种措施。它的实现方式是通过对电力系统的电流进行逐波监测和控制&#xff0c;每一波电流都可以独立地进行限制&#xff0c;从而保护电力系统设备不受过载损坏或短路故障的影响。 逐波限流的作用是提高电力…...

【数据结构】 顺序表

文章目录1 线性表2 顺序表2.1 概念及结构2.2 接口实现2.3 数组相关面试题2.4 顺序表的问题与思考1 线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序…...

Elasticsearch 集群规划- 单台机器核心数计算公式

在做集群规划的时候&#xff0c;到底需要给集群的每个节点多少个核心数&#xff1f;这个问题一直困扰了我很久。最近一段时间做千亿数据&#xff0c;PB存储量集群规划的时候&#xff0c;突然想明白了这件事&#xff0c;大致可以用一个公式来计算&#xff01;我觉得这是一个非常…...

Tesla都使用什么编程语言?

作者 | 初光 出品 | 车端 备注 | 转载请阅读文中版权声明 知圈 | 进“汽车电子与AutoSAR开发”群&#xff0c;请加微“cloud2sunshine” 总目录链接>> AutoSAR入门和实战系列总目录 带着对更美好未来的愿景&#xff0c;特斯拉不仅成为有史以来最有价值的汽车公司&…...

1143. 最长公共子序列——【Leetcode每日刷题】

1143. 最长公共子序列 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对顺序的情况下删除某些…...

【并发基础】线程的通知与等待:obj.wait()、obj.notify()、obj.notifyAll()详解

目录 〇、先总结一下这三个方法带来的Java线程状态变化 一、obj.wait() 1.1 作用 1.2 使用前需要持有线程共享对象的锁 1.3 使用技巧 二、obj.notify(All)() 1.1 notify() 方法 1.1.1 调用notify()或notifyAll()不会释放线程的锁 1.2 notifyAll() 方法 1.3 使用技巧 三、使用实…...

css黏性定位-实现商城的分类滚动的标题吸附

传统的黏性定位是使用js通过计算高度来实现的&#xff0c;当元素滚动到一定位置时吸附在当前位置。下面我们通过css来实现黏性定位功能。 黏性定位 黏性定位目前主流的浏览器已经全部支持&#xff0c;顾名思义&#xff0c;黏性定位具有吸附的效果&#xff0c;其实它是positio…...

@Component和@bean注解在容器中创建实例区别

Component和Bean的区别 在Spring Boot中&#xff0c;Component注解和Bean注解都可以用于创建bean。它们的主要区别在于它们的作用范围和创建方式。 Component注解是一种通用的注解&#xff0c;可以用于标注任何类。被标注的类将被Spring容器自动扫描并创建为一个bean。这个bea…...

不写注释就是垃圾

最近Linux6.2出来了增加了很多新的东西&#xff0c;有看点的是&#xff0c;Linux确实要可以在Apple M1上面运行了&#xff0c;这应该是一个很大的新闻&#xff0c;如果有这么稳定的硬件支持&#xff0c;那对于Linux来说相当于又打下了一大片的江山。其中关于Linux6.2的特性罗列…...

深信服一面

1.C变量存储在哪里&#xff0c;生命周期是怎样的 2.静态成员变量和成员函数的特性&#xff0c;在哪里用过吗 3.new和delete是什么&#xff0c;和malloc和free对比有啥优势 4.new能不能重载&#xff0c;重载new有什么用 5.多态是怎么实现的&#xff0c;有什么优势和目的 6.…...

【C语言】深度理解指针(中)

前言✈上回说到&#xff0c;我们学习了一些与指针相关的数据类型&#xff0c;如指针数组&#xff0c;数组指针&#xff0c;函数指针等等&#xff0c;我们还学习了转移表的基本概念&#xff0c;学会了如何利用转移表来实现一个简易计算器。详情请点击传送门&#xff1a;【C语言】…...

步进电机运动八大算法

引导一种模块化(Module)设计思想&#xff0c;将传统步进电机的控制器(controller)、驱动器(Driver)、运动算法(Arithmetic)三合一。 对比国内外步进电机驱动原理和已有工作&#xff0c;结合各种硬件特性&#xff0c;改进或实现了可实际移植并用于步进电机控制八大算法。本产品…...

如果你持续大量的教坏ChatGPT,它确实会变坏

你输出的很多数据是经过人工标注吗&#xff0c;以确保可以正常对外展示出来&#xff0c;而不是有性别歧视、种族歧视或者其它意识形态为多数人所不认同的内容产生&#xff1f; 作为AI语言模型&#xff0c;我并不直接处理或输出任何数据&#xff0c;我的任务是通过对输入的自然语…...

opencv学习(二)图像阈值和平滑处理

图像阈值ret, dst cv2.threshold(src, thresh, maxval, type)src&#xff1a; 输入图&#xff0c;只能输入单通道图像&#xff0c;通常来说为灰度图dst&#xff1a; 输出图thresh&#xff1a; 阈值maxval&#xff1a; 当像素值超过了阈值&#xff08;或者小于阈值&#xff0c;…...

【含源码】用python做游戏有多简单好玩

有很多同学问我还有其他什么小游戏吗&#xff0c;游戏是怎么做的&#xff0c;难不难。我就用两篇文章来介绍一下&#xff0c;如何使用Python做游戏。 兔子与灌 俄罗斯方块 休闲五子棋 走迷宫 推箱子 消消乐 超多小游戏玩转不停↓ 更多小游戏可以评论区讨论哦&#xff0c;喜欢…...

C++常用函数

std::sort std::sort 函数用于对数组或容器进行排序&#xff0c;可以按照默认的升序排序或指定比较函数进行排序。 语法如下&#xff1a; template <class RandomAccessIterator> void sort(RandomAccessIterator first, RandomAccessIterator last);template <clas…...

Android Framework基础到深入篇

Android Framework基础到深入篇 KernelSU Android上基于内核的Root方案 Android系统源码下载/编译篇...

【Go进阶训练营】聊一下go的gc原理

背景 正好周末时间&#xff0c;就打算梳理以下自己对go gc的理解。跳出语言层面来说&#xff0c;gc分为两种&#xff0c;一种是手动创建&#xff0c;手动销毁。另一种就是由自动分配自动销毁&#xff0c;前者就是c,c的代表&#xff0c;后者就是java&#xff0c;go。 而整个流程…...

英飞凌Tricore原理及应用介绍05_中断处理之中断路由(IR)模块详解

目录 1.概述1.1相关缩写2 TC3xx中IR特性介绍3.SRN(中断服务请求优先级)3.1 寄存器中的各Bit位讲解3.2 如何改变SRN配置4. 实际应用介绍4.1 如何利用SRC寄存器检查OS中断配置是否正确?1.概述 在Tricore架构中允许有多个中断源包括片上外设及外部中断世间产生的中断请求,以打…...

微搭问答002-移动端上传的文件如何在PC端下载

遇到一个问题&#xff0c;就是上传的图片&#xff0c;在手机上可以下载了&#xff0c;但在电脑上怎么下载到电脑 里&#xff0c;包括上传的文件 点击查看页面就可以吧&#xff0c;在企业工作台里 我做了查看页面&#xff0c;小程序可以&#xff0c;但H5和电脑页面不行 你创建一…...

初识JVM

目录 引言 JVM是什么&#xff1f; JVM和java有什么联系&#xff1f; JDK、JRE、JVM有什么区别 为什么学习JVM&#xff1f; JVM——从内存管理开始 运行时数据区域 分区讲解 堆 方法区 程序计数器 本地技术栈 虚拟机栈 对象的创建 指针碰撞&#xff1a; 空闲列表…...

实践分享:Vue 项目如何迁移小程序

最近我们小组刚经历了将成熟的 HTML5 项目转换成小程序&#xff0c;并在app中运行的操作&#xff01;记录下来分享给各位。 项目&#xff1a;将已有的 Vue 项目转为小程序&#xff0c; 在集成了FinClip SDK 的 App 中运行。 技术&#xff1a;uni-app、FinClip 两个注意事项&…...

JavaScript学习笔记(6.0)

JavaScript类 使用关键字class创建类。 始终添加constructor()方法 class ClassName{constructor(){...} } calss Car{constructor(name,year){this.namename;this.yearyear; } } 创建了一个名为Car的类&#xff0c;并且拥有两个初始属性name和year。 JavaScript类不是对…...

某小公司面试记录

记录一次面试过程&#xff0c;还有一些笔试题&#xff0c;挺简单的&#xff0c;排序&#xff0c;去重&#xff0c;this指向&#xff0c;深浅拷贝&#xff0c;微任务的执行顺序&#xff0c;变量提升等。 ES6数组新增的方法 Array.from&#xff1a; 将两类对象转为真正的数组&am…...

SPI读写SD卡速度有多快?

SD卡是一个嵌入式中非常常用的外设&#xff0c;可以用于存储一些大容量的数据。但用单片机读写SD卡速度一般都有限&#xff08;对于高速SD卡&#xff0c;主要是受限于单片机本身的接口速度&#xff09;&#xff0c;在高速、实时数据存储时可能会有影响。但具体速度可以达到多少…...

MySQL:索引与事物

目录 简单了解索引的底层数据结构 索引的概念&#xff1a; 索引存在的意义&#xff1a; 索引的使用&#xff1a; 索引实现的数据结构 B树 B 树 B 树的特点 B 树的优势 事物 事物的概念 事物的使用 事物的四大特性 并发可能引起的问题 脏读问题 不可重复读 幻读…...

mybatis实战

目录配置自动下划线驼峰MyBatis解析的SQL和实际传参不符的问题传参是整型&#xff0c;结果是false日期比较入参是字符串入参是Date父子递归查询上下级查询方法一方法二传参数组inmapper中接口注解映射配置 自动下划线驼峰 使用mybatis的自动下划线驼峰转换 mybatis有一个选项…...

【UEFI实战】BIOS与IPMI

KCS KCS全称是Keyboard Controller Style&#xff0c;关于这个名称不用过多的追究&#xff0c;只需要知道它是系统&#xff08;BIOS和OS&#xff09;和BMC通信的一种基本方式即可。本文将介绍BIOS下的KCS接口&#xff0c;包括接口使用方式和数据。内容参考自《ipmi-second-gen…...

做后台网站/上海seo优化公司kinglink

在Python中&#xff0c;只有模块&#xff08;module&#xff09;&#xff0c;类&#xff08;class&#xff09;以及函数&#xff08;def、lambda&#xff09;才会引入新的作用域 作用域&#xff08;LEGB原则&#xff09; &#xff08;1&#xff09;变量查找顺序&#xff1a;LEG…...

pexels免费素材网站/长沙做优化的公司

为了在接下来的篇章中讲解用Java实现文件的归档和解归档&#xff0c;需要先了解一下Java中int型与byte型数组之间的相互转换。 首先&#xff0c;我们先来看看int型转换成byte型数组。 我们知道&#xff0c;Java中&#xff0c;一个int型占用4个字节&#xff0c;一个byte型占用…...

wordpress 爱主题/千锋教育课程

手机自带的无线投屏总说找不到设备&#xff1f;“爱奇艺的视频可以投屏到电视。但手机自带的无线投屏总说找不到设备&#xff1f;”这是一位网友在知乎上的咨询。经过详细了解&#xff0c;它的电视是海信液晶电视&#xff0c;手机是魅族的&#xff1b;平时能够通过爱奇艺、腾讯…...

云南网站建设方法/外贸营销渠道

SpringCloud Function作为SpringCloud家族成员最早在2017年提出&#xff0c;项目主要负责人为Mark Fisher&#xff0c;目前已经来到了3.0版本。SpringCloud Function的出现旨在为快速发展的Serverless市场提供一个Spring的接入路径&#xff0c;使用SpringCloud Function进行无服…...

服装网站建设优点与缺点/站长工具天美传媒

BZOJ 1054题解 BFS暴力求解 1054: [HAOI2008]移动玩具 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1884 Solved: 1033[Submit][Status][Discuss]Description 在一个4*4的方框内摆放了若干个相同的玩具&#xff0c;某人想将这些玩具重新摆放成为他心中理想的状态&#x…...

邢台视频优化/重庆网站优化

http://semantic-ui.com/introduction/getting-started.html...