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

ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_IN

文章目录

  • ip_vs hook 后
    • NF_INET_LOCAL_IN

本章重点:
k8s 如何利用 ip_vs 实现源 IP 会话亲和性。

ip_vs hook 后

NF_INET_LOCAL_IN

根据优先级依次是 ip_vs_reply4,ip_vs_remote_request4

ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb)| -- ip_vs_fill_iph_skb  // 解析 IP 头| -- ip_vs_out_icmp // 如果是 icmp| -- cp = pp->conn_out_get // 如果没有 conn 链接,直接 ACCEPT| -- handle_response_icmp // 回复 icmp| -- ip_vs_nat_icmp // 做 nat| -- ip_vs_update_conntrack // 更新 nf_ct| -- __ip_vs_conn_put // 更新 ipvs conn 引用计数| -- ip_vs_proto_data_get // 通过 协议找到 ipvs 链表| -- pp->conn_out_get // 查找是否有 conn,属于一个存在的 out 连接| -- handle_response // 查到连接,回复做 snat 处理--- 没有连接的特殊情况| -- 进来的报文根据源 ip 和 源 port 也就是 ipvs 的 rs 的 ip 和端口进行查询,如果有且是 UDP 或 TCP&!RESET 的情况,发送 icmp_dest_unreach/icmp_port_unreach,drop。

全是查 conn_out_get,没有再 ACCEPT; 说明,这个 hook 是处理回复的 ip_vs,然后全是 nat 模式的 ipvs。即处理 realserver 回复报文时的处理。
conn_out_get 对应对应协议的连接查询,如 tcp/udp/sctp 为 ip_vs_conn_out_get_proto;
像 k8s 的 service 需要重点关注,这是后端 pod 回复到 client 所在节点后的处理流程。

ip_vs_remote_request4

ip_vs_remote_request4
| -- ip_vs_in| -- (skb->pkt_type != PACKET_HOST && hooknum != NF_INET_LOCAL_OUT) 不是本地包,ipvs 不处理| -- ip_vs_fill_iph_skb  // 解析 IP 头| -- pd = ip_vs_proto_data_get(ipvs, iph.protocol);| -- pp = pd->pp;| -- cp = pp->conn_in_get(ipvs, af, skb, &iph);    // 根据报文协议,找到对应的 conn 表,查询报文是否属于已存在的 连接| -- (conn_reuse_mode && !iph.fragoffs && is_new_conn(skb, &iph) && cp) // 判断 内核开启 reuse_mode,不是分片,新连接(tcp syn),查到 连接 (连接 reuse)| -- tcp 连接的状态是否允许 reuse (TIME_WAIT,CLOSE...)| -- 没有 连接和可 reuse 的连接| -- ip_vs_try_to_schedule| -- conn_schedule 对应协议的 conn_schedule  // tcp 的 tcp_conn_schedule| -- tcp_conn_schedule    根据报文查询 ipvs 的 service| -- ip_vs_schedule    ipvs 主要函数,调度去获取真实的后端| -- 检查是否已存在连接,只调度未存在连接的情况| -- 有连接| -- 对 连接 加计数| -- 没有连接| -- ip_vs_sched_persist   // 持久属性的 svc,详细内容见下一块| -- sched->schedule // 通过 svc 的调度器调度处 dest| -- ip_vs_conn_new 创建连接| -- ip_vs_bind_xmit,根据 svc 的模式绑定发包规则(包括 nat/tunnel/dr/bypass,k8s service 为 ip_vs_nat_xmit)| -- cp->packet_xmit 用 绑定的方法处理报文

关于 conn_reuse,是在考虑 ip_vs 的优雅关闭后端和 高并发下 端口重用的兼容问题。大致意思:在连接尚未结束时,还是会将数据发到准备去掉的 rs,端口重用会丢掉第一个 syn 包导致重传;所以在 k8s 场景下不建议两个全开,ps 我们不开 reuse。

ip_vs_sched_persist
在 k8s 环境中通常是 sessionAffinity: ClientIP 属性的 service 配置的。设置源 IP 亲和性,同一个 clientIP 调度到同一个 real server。

| -- ip_vs_sched_persist    根据模版创建连接,如果没有创建模板,支持 TCP/UDP,通常 sip 模式使用;| -- ip_vs_conn_fill_param_persist 填充 param 并查找对应的 template,填充如果是 persist 的svc,还需要调用 对应调度器的 fill_param 函数| -- ip_vs_ct_in_get   根据 param 查找 ct template| -- ip_vs_check_template 如果有 模板,进行判断,如果有后端,后端是否正常,如果不正常,将 ct 目的端口,svc 端口改为 65535,然后更新| -- dest = sched->schedule 如果没找到模板 或者 ct 后端无效,进行此方法调度,调度为创建 svc 的方法,前文已介绍| --  ip_vs_conn_new 用新调度到的后端创建连接模板 即 ip_vs 的 ct,ct 的 timeout 由 svc 的 timeout 获取。
| -- 查到 template ct| -- dest = ct->dest; 直接获取 ct 的 dest| -- 修改 目的 port 从 svc 的 port 到 dest 的 port| -- ip_vs_conn_new 根据 template 创建连接| -- ip_vs_control_add 将连接的 controller 改为 模板| -- ip_vs_conn_put 将模板的计时重置| -- ip_vs_conn_stats 更新计数等

可以大致清楚 k8s service 的会话亲和性是如何利用 ip_vs 的 sip 来实现的 ,ip_vs sip 实际上开始是为了支持 SIP 协议(会话初始协议),pe 的数据主要是存储 SIP 协议中的 callid,通过 pe 的匹配来保证会话亲和性。
会话亲和性,主要实现是先生成一个根据源 IP 创建的 template 连接,然后在根据模板连接生成真实连接,生成后会更新模板的有效时间。模板连接的特征是源端口为 0,且当生成的模板后端 rs 失效时,会重新生成,并把原模板更新为不可用(具体为设置 源端口为0,service 端口和目的端口为 65535)

相关文章:

ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_IN

文章目录 ip_vs hook 后NF_INET_LOCAL_IN 本章重点: k8s 如何利用 ip_vs 实现源 IP 会话亲和性。 ip_vs hook 后 NF_INET_LOCAL_IN 根据优先级依次是 ip_vs_reply4,ip_vs_remote_request4 ip_vs_reply4| -- ip_vs_out| -- skb_to_full_sk(skb&#xf…...

分布式之CAP理论与BASE理论

CAP理论 CAP:一致性(consistency)、可用性(Availability)、分区容错(partition-tolerance)。CAP定律说的是在一个分布式计算机系统中,一致性,可用性和分区容错性这三种保证无法同时…...

Java之初始化顺序实践

功能概述 在创建Java对象时,需要将对象中的成员变量进行初始化后,才能调用对象的构造方法创建对象。本文中将会讲解初始化时父类与子类对应的顺序。 功能实践 场景1:父类、子类的初始化顺序 用例代码 Test public void test_init_order(…...

静态库与动态链接库,第三方库集成到VS

目录 介绍静态库与动态链接库静态库动态链接库 如何将第三方库集成到VS上VS属性管理器配置静态库配置动态链接库属性管理器其他的内容MKL库的安装boost库的安装 介绍 众所周知,.c文件或者.cpp文件变成.exe文件需要经历四个过程 分别是预处理,编译&#…...

生态经济学领域里的R语言机器学(数据的收集与清洗、综合建模评价、数据的分析与可视化、数据的空间效应、因果推断等)

近年来,人工智能领域已经取得突破性进展,对经济社会各个领域都产生了重大影响,结合了统计学、数据科学和计算机科学的机器学习是人工智能的主流方向之一,目前也在飞快的融入计量经济学研究。表面上机器学习通常使用大数据&#xf…...

【ROS】自定义消息方面的bug总结(1)

根据需要创建功能包 一类引用ros库函数的一类是自己定义的消息类型 库函数中有的可以直接在创建功能包的时候添加依赖,也可以在CMakeLists.txt中手动添加 catkin_create_pkg crepes roscpp rospy std_msgs nav_msgs sensor_msgs geometry_msgs创建文件夹msg&#xf…...

CTF-XXE(持续更新,欢迎分享更多相关知识点的题目)

知识 实例 BUU [PHP]XXE 进来看到 然后一起看 Write BUU XXE COURSE 1 进来看到 一起看 write NSS [NCTF2019]Fake XML cookbook 反正是XXE 直接整 write [NCTF 2019]True XML cookbook 不整花里胡哨,解题在最下面 write 与博主不同,我通过…...

Python工具箱系列(四十一)

使用zip批量压缩文件 前文的代码示例了使用gzip对单个文件进行压缩。本文示例使用更通用的zipfile来批量压缩文件。zipfile也是python内置的库,使用起来非常方便。废话不说,直接上代码示例。 import dbm import glob import zipfile# 保存压缩计划的库名…...

Bigemap在路桥行业是怎么应用的?

选择Bigemap的原因: 奥维下架了,后来了解到的bigemap,于是测试了这款软件 使用场景: 下载影像、矢量路网做前期策划,下载完数据后导出cad ,做一些标注,最终出图下载等高线,作为前期选址依据 …...

代码随想录算法训练营Day48 || ● 198.打家劫舍 ● 213.打家劫舍II ● 337.打家劫舍III

问题1:198. 打家劫舍 - 力扣(LeetCode) 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上…...

高通面临难题,Oryon核心存在问题,高通8cx Gen 4芯片将推迟发布

"高通公司面临难题,可能会导致骁龙8cx Gen 4的发布时间推迟",关于骁龙8cx Gen 4处理器,还有一些其他值得关注的特点和功能。首先,据悉,骁龙8cx Gen 4采用了高通自家研发的Oryon核心架构,这是一项…...

安卓手机如何使用邮箱客户端收发邮件

安卓手机品牌较多,设置界面都不太相同,部分手机常见的如vivo、小米手机都是直接填写邮箱用户名和密码,软件自动设置,即可登录邮箱,其他安卓手机或者第三方安卓手机软件有时候需要手动设置,此处以安卓手机的…...

对java中的List进行深拷贝,并进行删除测试

List<String> list new ArrayList<>(); // 需要拷贝的原始List list.add("aaa"); list.add("bbb"); list.add("ccc"); List<String> listNew new ArrayList<>(); // 新List // 将原始List的值赋值给新List Co…...

springboot服务注册到Eureka,端口总是默认8080,自己配置端口不生效

这段时间接手了一个公司的老项目&#xff0c;用的是SpringCloud&#xff0c;在我用的时候突然发现有一个服务&#xff0c;注册到Eureka后&#xff0c;界面显示的端口和实际Ribbon调用的实例端口是不一致的&#xff0c;后来我自己写了个端口获取了一下所有的实例信息&#xff0c…...

LeetCode第11~15题解

CONTENTS LeetCode 11. 盛最多水的容器&#xff08;中等&#xff09;LeetCode 12. 整数转罗马数字&#xff08;中等&#xff09;LeetCode 13. 罗马数字转整数&#xff08;简单&#xff09; LeetCode 11. 盛最多水的容器&#xff08;中等&#xff09; 【题目描述】 给定一个长…...

如何编译打包OpenSSH 9.4并实现批量升级

1 介绍 openssh 9.4版本已于8月10号发布&#xff0c;安全团队又催着要赶紧升级环境里的ssh版本&#xff0c;本文主要介绍Centos5、Centos6、Centos7下openssh 9.4源码编译rpm包以及批量升级服务器openssh版本的方法。关注公众号后台回复ssh可获取本文相关源码文件。 https://w…...

AcWing 898. 数字三角形 (每日一题)

大家好 我是寸铁 希望这篇题解对你有用&#xff0c;麻烦动动手指点个赞或关注&#xff0c;感谢您的关注 注意 像数组下标出现i-1的&#xff0c;在循环的时候从i1开始。 关于0x3f3f3f3f和Integer.MAX_VALUE 0x3f3f3f3f:1061109567 Integer.MAX_VALUE:2147483647 在选用Integ…...

深度学习中,batchsize的大小对训练结果有什么影响,如何正确使用

一、影响&#xff1a; Batch size在深度学习训练中起着非常重要的作用&#xff0c;它对训练速度、模型性能、以及模型的泛化能力都有影响。以下是一些主要的影响&#xff1a; 训练速度&#xff1a;较大的batch size可以更充分地利用硬件并行性&#xff0c;从而加快单个epoch的…...

Squaretest 1.8.3 安装激活

1. 插件下载 2. 离线安装 3. 插件激活...

P21~22 第六章 储能元件——电容存储电场能,电感存储磁场能

1、电容元件 a定义 b线性时不变电容元件 c电容的电压与电流关系 i有限则u有限 注意理解面积 d电容的功率和储能 e例一 跃变就是指物体的物理量从有限值变为无限值的过程。 分析上图例题&#xff1a;对于电源波形要吃负无穷到正无穷去刻画。即时间轴要铺满。 有有图控制电…...

23-Oracle 23 ai 区块链表(Blockchain Table)

小伙伴有没有在金融强合规的领域中遇见&#xff0c;必须要保持数据不可变&#xff0c;管理员都无法修改和留痕的要求。比如医疗的电子病历中&#xff0c;影像检查检验结果不可篡改行的&#xff0c;药品追溯过程中数据只可插入无法删除的特性需求&#xff1b;登录日志、修改日志…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具&#xff0c;专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑&#xff08;如DBC、LDF、ARXML、HEX等&#xff09;&#xff0c;并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

AWS vs 阿里云:功能、服务与性能对比指南

在云计算领域&#xff0c;Amazon Web Services (AWS) 和阿里云 (Alibaba Cloud) 是全球领先的提供商&#xff0c;各自在功能范围、服务生态系统、性能表现和适用场景上具有独特优势。基于提供的引用[1]-[5]&#xff0c;我将从功能、服务和性能三个方面进行结构化对比分析&#…...

基于Java项目的Karate API测试

Karate 实现了可以只编写Feature 文件进行测试,但是对于熟悉Java语言的开发或是测试人员,可以通过编程方式集成 Karate 丰富的自动化和数据断言功能。 本篇快速介绍在Java Maven项目中编写和运行测试的示例。 创建Maven项目 最简单的创建项目的方式就是创建一个目录,里面…...