- 博客(238)
- 资源 (3)
- 收藏
- 关注
原创 ovs/ovs-dpdk三级缓存和硬件卸载
1.数据包到达网卡 → 2. 网卡触发硬件中断通知CPU → 3. CPU 暂停当前任务,执行中断处理程序(ISR)→ 4. ISR 将数据包从网卡缓冲区DMA复制到内核内存(sk_buff) → 5. 唤醒协议栈处理线程(如软中断 softirq)→ 6. 协议栈处理数据包 → 7. 数据传递到上层应用。
2025-02-06 11:27:47
923
原创 ovs和openflow流表
OVS是OpenvSwitch简称,官方定义OVS是一个产品级质量的多层虚拟交换机。通过支持可编程扩展来实现大规模的网络自动化。为了方便管理和配置虚拟机网络,所以直接将ovs部署到硬件设备上作为控制层。OVS包含三个重要的组件:ovsdb-server、ovs-vswitchd、以及OVS内核模块.ovsdb-server:OVS持久化存储的数据库,用于记录的网桥、端口、QOS等网络配置信息。
2025-02-04 10:27:49
850
原创 ovs实现lb负载均衡
负载均衡器的实现原理是通过硬件或软件设备将客户端访问流量根据转发策略分发到多个服务器或设备上,以确保系统的负载均衡。二层负载均衡:使用虚拟MAC地址方式,根据OSI模型的二层进行负载均衡。四层负载均衡:基于IP+端口的负载均衡,主要分析IP层及TCP/UDP层,实现四层负载均衡。七层负载均衡:从应用层开始,根据虚拟的URL或IP、主机名接收请求,再转向相应的处理服务器。
2025-01-20 18:08:08
677
原创 ovn-kubenetes router流表解析
/ arp-request报文,reg9[2] 判断源mac是网关mac,reg9[3]修改目的mac为网关mac。// 匹配pod网段,将ttl-1后修改源mac,reg0=目的ip,reg1=网关ip,修改源mac,指定出接口。// 匹配目的ip,将ttl-1后修改源mac,reg0=目的ip,reg1=源ip,修改源mac,指定出接口。// 从pod网段过来的包,ttl-1,reg0=源ip,reg1=网关ip,修改源mac,指定出接口。
2025-01-17 11:04:52
676
1
原创 ovn-kubenetes switch流表解析
/ 执行reg0[6] =chk_lb_hairpin校验,校验lb后目的ip和源ip是否相同,reg0[12] = chk_lb_hairpin_reply校验harpin回包,源ip是endpoint的ip,目的ip是vip。//发出方向已建立的连接+est-rpl,ct_mark=0x1,可能是drop,可能需要commit到ct,标记reg0[7]和reg0[9]// 首包+new可能是drop,可能是需要commit的allow,标记reg0[7]和reg0[9]
2025-01-16 15:45:23
905
原创 OVS Vxlan一对一模式VS一对多模式
针对VXLAN隧道创建vtep口分为一对一模式和一对多模式,一个一模式是指local_ip和remore_ip都是明确的ipv4地址,而一对多模式local_ip是明确的ipv4地址,remore_ip=flow代表可以到达任何其他的vtep口,但是需要在流表里指定vxlan封装的外层ip,才能发送给对端vtep。
2023-04-06 21:51:29
1553
原创 OVS流表转发DNS流量
由于 IP 地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过域名解析协议(DNS,Domain Name System)来将域名和 IP 地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的 IP 地址数串。...
2022-08-06 16:51:56
765
原创 OVS流表转发DHCP流量
DHCP协议及报文动态主机配置协议(DHCP)是一种基于UDP协议且仅限于在局域网内部使用的网络协议,目的就是为了减轻TCP/IP网络的规划、管理和维护的负担,为局域网内部的设备分配IP地址、子网掩码、网关、DNS地址等网络信息。DHCP功能分为两个部份:一个是服务器端,端口号67 ,而另一个是客户端,端口号68DHCP的8种报文:①:DHCP DISCOVER:这是 DHCP 客户端首次登录网络时进行 DHCP 过程的第一个报文,用来寻找 DHCP 服务器。②:DHCP OFFER:DHCP服务
2022-03-19 15:29:34
4576
原创 OVS CT连接追踪实现NAT
OVS CT连接跟踪(connection tracking)CT连接跟踪中所说的“连接”,概念和 TCP/IP 协议中“面向连接”( connection oriented)的“连接”并不完全相同TCP/IP 协议中,连接是一个四层(Layer 4)的概念。TCP 是有连接的,或称面向连接的(connection oriented),发送出去的包都要求对端应答(ACK),并且有重传机制UDP 是无连接的,发送的包无需对端应答,也没有重传机制CT 中,一个元组(tuple)定义的一条数据流(flo
2022-03-12 10:27:18
9619
3
原创 OVS learn学习
OVS Learn流表学习交换机可以进行数据高效转发得益于mac地址表,每当有数据包经过交换机都会有个学习的过程,由于包里面有MAC,VLAN Tag,以及从哪个口进来的这个信息,交换机会记下数据包源mac地址,从交换机哪个口进入,所属vlan,维护了一个表格port –> MAC –> VLAN Tag,当然也会有老化时间,以备设备更新或下线这样以后如果有需要发给这个MAC的包,不用ARP,交换机知道应该发给哪个port,应该打什么VLAN Tag。OVS中的learn功能也是这个原理,
2022-01-23 13:22:35
1688
原创 OVS流表实现arp代答
物理拓扑1、PC封包:源ip:10.1.1.2,目的ip:20.1.1.2,源mac:fe:fe:fe:fe:fe:aa,目的mac:不知道,此时数据层将这个不完整的包缓存,发arp报文,注意,主机内核会检测到是跨网段访问,arp请求的是网关ip对应的mac2、ARP报文组成:数据层(源mac:fe:fe:fe:fe:fe:aa,目的mac:ff:ff:ff:ff:ff:ff)+ ARP头部(发送者ip:10.1.1.2,发送者mac:fe:fe:fe:fe:fe:aa,接收者ip:10.1.1.2(
2022-01-08 18:44:54
4161
2
原创 OVS Group组表
group作用1、存储多个动作:group匹配到一个合适的动作后可以执行多个动作,优化了流表一个匹配+一个动作的工作模式2、流量复制:group可将流量复制成多份,在广播、组播中广泛使用3、设置备用路径:group可对一条flow设置备份出接口,当识别主接口down,自动切换到备用出接口4、负载分流:group可以选择动作中的一个执行group组成Group Identifier:uint32,组表在交换机中的身份Group Type:组的类型Counters:数据包被组处理时跟新数值Ac
2022-01-02 11:00:13
2768
原创 resubmit和goto区别
一、resubmit和goto定义resubmit官方定义:goto官方定义:二、resubmit和goto区别根据官方文档定义我们可知,resubmit和goto都用作在流表间跳转,区别是goto只能跳转到当前table编号之后的流表,而resubmit没有限制三、resubmit和goto使用场合在一些场合下只能使用gotoovs-ofctl add-flow anet-br -O OpenFlow13 "table=5,priority=200,ip actions=write_me
2022-01-01 12:37:33
1474
原创 ovs流表实现icmp网关代答
ovs流表设计虚拟机 ping 任何ip前要发送arp广播请求目的mac,icmp报文对于同网段返回真实mac,对于其他网段返回的是网关的mac利用ovs流表将收到的icmp request报文,修改为icmp reply报文并原路返回cookie=0x0, duration=336.660s, table=17, n_packets=6, n_bytes=588, priority=24576,icmp,metadata=0xa/0xffffff,nw_dst=10.1.1.1,icmp_type=
2022-01-01 12:19:50
2077
4
原创 onos在公有云应用
公有云基本概念Region区域,机房所在物理位置AZ可用区,对region的细分,region下某个具体机房VPC私有网络Virtual Private Cloud (VPC)是对云上的网络空间进行隔离,用户在云上的资源可以托管在vpc,一个vpc内的虚拟机是互通的,计算节点使用onos实现不同宿主机之间互通,一个vpc只能属于一个regionSubnet子网,对vpc进行细分,每个subnet对应一个azTenant租户,可以购买云上网络资源,一个租户可购买多个vpc,但vpc直接彼此
2021-09-09 12:31:43
451
原创 K8s网络模型
Docker网络模型容器容器不是模拟一个完整的操作系统,而是对进程进行隔离,对容器里的进程来说它接触到的各种资源都是独享的,比虚拟机启动快、占用资源少。DockerDocker是对Linux底层容器技术的封装,提供容器使用接口,docker将应用程序和该程序的依赖打包在同一个文件,即Docker image,运行Docker image就会生成一个Docker容器,程序在容器里运行就像在物理机或者虚拟机一样。容器与虚拟机对比虚拟机要模拟整台机器的操作系统,包括硬件资源;容器和主机共享操作系统,容
2021-07-18 16:36:27
3201
2
原创 ETCD实现及原理分析
etcd的优点:高可用性:保存各个服务的部署,运行信息,若他出现故障可导致集群无法变更,业务瘫痪数据一致性:集群之间没有单点故障,多节点之间保障数据一致性低容量:通过内存树仅存储key版本数据,value数据存储在内存增删改查功能:还可以监听数据变化运维的可维护性:提供API变更节点,降低运维成本从高可用、数据一致性、增删改查功能角度,zookeeper也是满足需求的,但是zookeeper不支持通过API变更,运维成本比较高,其次zookeeper是java编写,部署繁琐,zookeer使
2021-04-29 21:44:08
3790
1
原创 Redis实现及原理分析
Redis 微秒级操作redis 保存在内存的好处是读写很快,毕竟内存的访问速度一般都在百 ns 级别。但是,潜在的风险是一旦掉电,所有的数据都会丢失。保存在外存,虽然可以避免数据丢失,但是受限于磁盘的慢速读写(通常在几 ms 级别),键值数据库的整体性能会被拉低。缓存场景下的数据需要能快速访问但允许丢失,Redis 属于内存键值数据库。通过网络框架以 Socket 通信的形式对外提供键值对操作,这种形式可以提供广泛的键值存储服务,当客户端发送PUT hello world命令后,该命令回封装在网络包中
2021-04-28 22:06:08
1849
2
原创 Linux网络虚拟化
一、network namespaceLinux的namespace作用是隔离内核资源,而network namespace作用是隔离Linux系统的设备,包括IP地址、端口、路由表、防火墙等资源,docker作为轻量级虚拟化容器,它的隔离能力来自Linux内核的namespa技术。从网络的角度看每个容器都有自己的虚拟设备,容器里的进程不必担心端口冲突,可使一个主机上同时运行多个服务监听相同端口。network namespace可以通过系统调用来创建,目前已集成到ip工具的netns子命令中1.
2021-04-12 21:43:06
1050
原创 Python基础 VS Golang基础
1、语言类型PythonGolangPython 是一种解释型语言(开发过程中不需要编译)Golang是静态类型语言(在程序运行前检查类型)Python 是交互式语言(可以在Python提示符 >>> 后直接执行代码)Golang核心思想是提高编程效率Python 是面向对象语言(代码封装在对象里)2、下载地址PythonGolanghttps://www.python.org/https://golang.org/dl
2021-03-07 15:00:43
753
1
原创 网络DHCP原理与配置
dhcp报文交互:dhcp discovery(广播):dhcp offer(单播):dhcp request(广播):dhcp ack(单播):注意事项:1、dhcp默认租期24h,当时间到12h发送renew报文给server请求续租,若server回复ack报文,此时PC的可用时间又更新为24h,若一直未收到server的回复,等到PC的可用时间还剩3h时触发rebinding报文给其他的server,若收到回复,则继续进入4种报文交重新互获取ip2、dhcp discover
2021-02-10 12:24:30
901
原创 基于underlay和overlay转换的四层负载均衡
四层负载均衡负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。四层负载均衡,也就是主要通过报文中的目标地址和端口,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。实现方式通过发布三层的 IP 地址(VIP),然后加四层的端口号,来决定哪些流量需要做负载均衡,对需要处理的流量进行 NAT 处理,转发至后台服务器,并记录下这个 TCP 或者 UDP 的流量是由哪台服务器处理的,后续这个连接
2021-01-16 10:10:44
834
原创 redis分布式锁校验网段重叠或重复
需求分析在一个网段内已经存在部分子网,新创建的子网需要先校验是否属于该网段,再校验是否与已存在的网段有包含关系,考虑到并发的问题,这个过程需要加锁package mainimport ( "context" "fmt" "math/big" "net" "time" "github.com/bsm/redislock" "github.com/go-redis/redis" "github.com/sirupsen/logrus")var locker *redislock.C
2020-12-19 09:31:12
724
1
原创 OpenVSwitch下发安全组流表
安全组1、安全组是一种虚拟防火墙,具备有状态的数据包过滤功能,用于设置云服务器、负载均衡、数据库等实例的网络访问控制,是重要的网络安全隔离手段。您可以通过配置安全组规则2、安全组是一个逻辑上的分组,可以将同一地域内具有相同网络安全隔离需求的基础网络云服务器或弹性网卡实例加到同一个安全组内,允许或禁止安全组内的实例对公网或私网的访问3、安全组策略可以对实例的出入流量进行安全过滤,实例可以是基础网络云服务器或弹性网卡实例 ,修改安全组的规则后新规则立即生效。安全组和网络ACL的区别安全组网
2020-11-30 23:11:48
1826
原创 redis缓存池使用
RedisRedis里存储的数据是key、value键值对的格式,如果我们同时有多个请求访问redis拿数据,但同时要保证数据不重复,这里我们采用set形式(value不重复,string类型的key值对应数组类型的value,数组里可放置多个string类型的数据)package ipv4poolimport ( "context" "fmt" "time" "amber/db" "github.com/go-redis/redis" "github.com/sirupsen/lo
2020-11-16 08:46:10
1004
原创 golang mysql对比db+事务tx
事务事务处理是数据的重要特性,对于一些支付系统,事务对业务逻辑会有重要影响。golang的mysql驱动也封装好了事务相关的操作,一般使用的是db对象的方法,事务则是使用另外一个对象,sql.Tx对象。使用db的Begin方法可以创建tx对象,用法和db的相关用法类似。一旦创建了tx对象,事务处理都依赖与tx对象,这个对象会从连接池中取出一个空闲的连接,接下来的sql执行都基于这个连接,直到commit或者rollback调用之后,才会把连接释放到连接池。在事务处理的时候,不能使用db的查询方法,虽然
2020-11-07 22:24:26
1198
原创 server和client通过grpc建立连接
一、文件结构server端和client端分布在两个不同的集群里,可以通过下发mq消息,或者grpc连接传递消息,这里介绍通过grpc建立连接,第一步是创建proto文件,要传递的方法和变量都在这里定义sendData/├── data.proto└── log二、创建data.proto文件注意,如果server端和client端不在同一集群,两边都要创建proto文件syntax = "proto3"; //指定protobuf的版本package sendDa
2020-10-26 09:02:53
2507
5
原创 Centos执行二进制文件报错: cannot execute binary file
在centos里执行二进制文件时报出错误:cannot execute binary file原因分析及解决办法1、文件没有权限:chmod 777 二进制文件名2、没有root权限:sudo root3、在本地window/mac系统下go build生成二进制文件后,拿到centos系统中去编译:env GOOS=linux GOARCH=amd64 go build...
2020-09-13 18:39:56
9707
原创 Golang 将map内容写入内存
大多情况下很多数据因为格式简单,不需要存储在数据库内,故而写入内存是最好的选择,同时也减少了读取数据库的耗时package mainimport ( "fmt" "os" "encoding/json" "io/ioutil")func main() { // os.Stat判断文件是否存在,若不存在便创建 fileinfo, err := os.Stat(`C:\Users\Desktop\amber.txt`) if err != nil {
2020-08-30 11:42:36
3420
原创 Golang 程序crash后生成的coredump文件
RLIMIT参数RLIMIT_CORE core文件的最大尺寸,如果为0说明不能创建core文件RLIMIT_CPU CPU时间的最大值(单位:秒)GOTRACEBACK配置GOTRACEBACK=none 只输出panic异常信息GOTRACEBACK=single 只输出被认为引发panic异常的那个goroutine的相关信息GOTRACEBACK=all 输出所有goroutines的相关信息,除去与go runtime相关的stack frames.GOTRACEBACK=syste
2020-08-23 21:29:53
4645
1
原创 Golang 微框架Gin实现etcd存储
Gin简介Gin是一个golang的微框架,封装比较优雅,API友好,源码注释比较明确,它和其他第三方 Golang 库一样用go get -u github.com/gin-gonic/gin 下载gin,然后import导入即可gin路由func init() { router := gin.Default() v1 := router.Group("/v1") { v1.POST("/login", login) v1.POST("/pu
2020-08-15 10:49:28
1350
1
原创 Go pprof性能调优
pprof文件作用从样本记录中分析出代码计算时间最长或者说最耗CPU资源的部分,可以通过以下代码启动对CPU使用情况的记录import "runtime/pprof"func startCPUProfile(cpuProfile string) { if cpuProfile != "" { f, err := os.Create(cpuProfile) if err != nil { fmt.Fprintf(os.Stderr, "C
2020-08-09 10:29:56
497
原创 golang Mutex锁和RWMutex锁
golang 中的 sync 包实现了两种锁:Mutex:互斥锁RWMutex:读写锁,RWMutex 基于 Mutex 实现Mutex(互斥锁)1、Mutex 为互斥锁,Lock() 加锁,Unlock() 解锁2、在一个 goroutine 获得 Mutex 后,其他 goroutine 只能等到这个 goroutine 释放该 Mutex3、使用 Lock() 加锁后,不能再继续对其加锁,直到 Unlock() 解锁后才能再加锁4、在 Lock() 之前使用 Unlock() 会导致
2020-08-02 14:52:25
1055
原创 golang 判断元素是否在数组内
背景众所周知,golang里没有像python的in来判断元素是否在list里存在,可替代的办法是将list放到map里,在map里判断元素是否存在// 已知list中元素"amber","jack"arr := [...]string{"amber","jack"}// 初始化mapvar set map[string]struct{}set = make(map[string]struct{})// 上面2部可替换为set := make(map[string]struct{})//
2020-07-12 10:21:20
26986
2
原创 golang 使用logrus传递ctx
logrus日志级别logrus日志一共7级别, 从高到低: panic, fatal, error, warn, info, debug, trace. logrus.SetLevel(logrus.InfoLevel) logrus.SetLevel(logrus.DebugLevel) ...logrus调用方式logrus总共提供两种方式调用:1、logrus.Info("hello logrus")2、logrus.WithField(logruns.Fields{"key":"
2020-07-11 23:30:16
1343
原创 golang etcd服务注册与发现
产生场景服务端架构最前面是 一台网关节点 ,网关后面是多台运行着一样的 服务的计算节点,客户端一般就是访问网关 ,然后 网关 就把流量 转发到 后面的计算节点上。如果后面的计算节点信息处理不过来的时候,我们需要加机器,最low的方法就是 加上一台服务器,然后 修改网关服务器的配置表 加上 新加的 服务器的IP 和端口,然后重启网关。但如果后面的机器一旦down 了,网关是不知道的,还会把流量转发到 down的机器上,造成服务的不可用,etcd可以避免硬件的单点故障或网络问题etcd注册etcd 是一个
2020-07-05 12:14:31
4711
2
原创 golang 大端匹配IP网段
字节序:大端序、小端序大端序:低地址端存放高位字节小端序:低地址端存放低位字节大端序,网段指定首末ipimport "net"func main () { ip, cidr, _ := net.ParseCIDR("10.1.0.0/16") // 10.1.0.0 fmt.Println(ip) Prefix := cidr.IP.String() // 10.1.0.0 fmt.Println(Prefix) m, _ :=
2020-06-26 21:29:57
3986
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人