Tengine 的HTTP3,如何适配四层负载的udp健康检查?

HTTP3为什么要适配udp健康检查?

不同于HTTP2和HTTP1.1以及之前的HTTP协议,HTTP3最大的不同就是其传输层协议由TCP改成了基于UDP实现的QUIC协议。QUIC 协议实现在用户态,建立在内核态的 UDP 的基础之上,集成了 TCP 的可靠传输特性,集成了 TLS1.3 协议,保证了用户数据传输的安全。不过HTTP3具体的特性不是本文的重点,我们在适配HTTP3的过程中遇到了许多问题,本文主要介绍关于UDP健康检查的部分。

Tengine作为Nginx的一个重要分支,在应用中常作为7层负载均衡使用。但在实际的生产中,7层负载均衡服务之前往往还有lvs这种4层负载均衡服务。为了保证高可用,就少不了在lvs 和 Tengine之前需要做健康检查探测。

常见的健康检查模式

TCP协议的健康检查一般通过TCP三次握手来检查,握手成功即代表服务可用。但是UDP的协议没有连接状态,默认不会回复任何内容,所以它的健康检查要麻烦一些。

目前比较常见的UDP健康检查主要有两种。

方法一

通过UDP报文加ICMP协议进行UDP端口探测,比如nmap命令

sudo nmap -sU 127.0.0.1 -p 123

返回

PORT     STATE         SERVICE
123/udp open|filtered powerclientcsf

它的检查逻辑大致是向目标端口发送一个UDP报文,并且对对端IP进行一次ping探测,如果主机可达且未收到ICMP的port unreachable报错(端口未监听,类似于TCP协议会回复rst)则认为是服务正常,否则则为服务异常。

但这个探测逻辑有个缺陷,如果服务器能ping通,但是假死;或者有防火墙策略,drop了指定端口的UDP报文,这些情况下能通过健康检查探测,但服务其实是不可用的。

方法二

另一种就是偏应用层探测。向服务发送特定的UDP报文,服务需要在指定时间内回复相应的UDP报文,才会认为服务健康。但是这种健康检查需要服务测适配。

Tengine的 udp健康检查适配

Tengine是通过xquic实现的quic协议。xquic模块是可以通过方法2来实现被健康检查探测。在xquic的ngx_xquic_recv.h中,定义了3个宏:

#define NGX_XQUIC_HEALTH_CHECK  "Healthcheck"
#define NGX_XQUIC_HEALTH_CHECK_REQ  "UDPSTATUS"
#define NGX_XQUIC_HEALTH_CHECK_RSP  "UDPOK"

这三个宏的作用是,如果UDP 报文的payload中以NGX_XQUIC_HEALTH_CHECK 定义的字符串开头,则会认为是健康检查探测包,跳过后续流程。

如果UDP 报文的payload 为 NGX_XQUIC_HEALTH_CHECK_REQ 定义的字符串,则会返回payload为 NGX_XQUIC_HEALTH_CHECK_RSP 定义的字符串。通过这个配置即可自定义实现上面方法二的探测。

但是这个种方式定义的字符串有特定条件才能适配。因为xquic模块在进行健康检查报文检测之前会先做一个 quic头检测

    /* check QUIC magic bit */if (!NGX_XQUIC_CHECK_MAGIC_BIT(packet->buf)) {ngx_log_error(NGX_LOG_WARN, c->log, 0,"|xquic|invalid packet head|");return;}#define NGX_XQUIC_CHECK_MAGIC_BIT(pos) (((*(pos)) & 0x40) == 0x40)

这个校验逻辑很简单,检查UDPpayload里第一个字节第二位是否为1。但是这导致健康检查字符串的第一个字符也必须符合这个特点。比如a-zA-Z可以通过,但是数字不可以。具体可以查下ascii表。

如果已经约定好了UDP健康检查的字符串,通过修改 NGX_XQUIC_HEALTH_CHECK_REQ和NGX_XQUIC_HEALTH_CHECK_RSP “UDPOK” 重新编译一下就可以适配了。

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

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

相关文章

SpringCloud(21)之SpringCloud Alibaba Nacos实战应用

一、Nacos安装 1.1 Nacos概述 Nacos是Alibaba微服务生态组件中的重要组件之一,主要用它实现应用的动态服务发现、配置管理、 服务管理。Nacos discovery alibaba/spring-cloud-alibaba Wiki GitHub Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简…

Oracle.xs.dll‘ for module DBD::Oracle: load_file:找不到指定的模块

安装Ora2pg时,碰到 异常现象 D:\ProgramFiles\ora2pg>ora2pg -t show_report --estimate_cost -c ora2pg_conf.dist install_driver(Oracle) failed: Cant load D:/ProgramFiles/strawberry/perl/site/lib/auto/DBD/Oracle/Oracle.xs.dll for module DBD::Oracle: load_fil…

鸿蒙开发-UI-动画-组件内转场动画

鸿蒙开发-UI-组件3 鸿蒙开发-UI-气泡/菜单 鸿蒙开发-UI-页面路由 鸿蒙开发-UI-组件导航-Navigation 鸿蒙开发-UI-组件导航-Tabs 鸿蒙开发-UI-图形-图片 鸿蒙开发-UI-图形-绘制几何图形 鸿蒙开发-UI-图形-绘制自定义图形 鸿蒙开发-UI-图形-页面内动画 文章目录 前言 一、基本概…

vulhub靶场-matrix-breakout-2-morpheus

下载&部署 从官网中下载 https://www.vulnhub.com/entry/matrix-breakout-2-morpheus,757/ 下载完成后,在vmware中打开,选择刚刚下载的ova文件 vmware打开文件后需要将刚导入的机器重新启动 再检查下网卡是否是和kali在同一张网卡下就可以开始打靶了…

C++ set 容器

1.6 C set 容器 一般性的 Set 实现而言,是无序的,在 C 中,std::set 是有序的容器,它基于红黑树(Red-Black Tree)实现,并且会根据元素的键值进行排序。因此,std::set 中的元素总是按…

软件测试工程师职位笔试知识点细节(2)

一、软件测试分为哪几个阶段,生命周期? 软件测试一般分为单元测试、集成测试和系统测试。 需求分析→测试计划→测试设计、软件开发→测试执行→测试评估 二、一条软件缺陷(或者叫Bug)记录都包含了哪些内容? 一条Bug…

设计模式学习笔记 - 规范与重构 - 5.如何通过封装、抽象、模块化、中间层解耦代码?

前言 《规范与重构 - 1.什么情况下要重构?重构什么?又该如何重构?》讲过,重构可以分为大规模高层重构(简称 “大型重构”)和小规模低层次重构(简称 “小型重构”)。大型重构是对系统…

Redis运行原理及基本数据类型

Redis 是一个开源的、基于内存的数据存储系统,它通过键值对的方式存储数据。是单线程的内存数据库,采用事件驱动模型来处理并发请求。它使用非阻塞的 I/O 多路复用机制来实现高性能的并发访问。数据库通常会将数据存储在内存中,这样可以提高数…

系统架构设计基础

本博客地址:https://security.blog.csdn.net/article/details/136542641 一. 软件架构 1、软件架构或称软件体系结构,是指系统的一个或者多个结构,这些结构包括软件的构件(可能是程序模块、类或者是中间件)、构件的外…

谷粒商城【成神路】-【10】——缓存

目录 🧂1.引入缓存的优势 🥓2.哪些数据适合放入缓存 🌭3.使用redis作为缓存组件 🍿4.redis存在的问题 🧈5.添加本地锁 🥞6.添加分布式锁 🥚7.整合redisson作为分布式锁 &#x1f697…

学习大数据,所必需的java基础(完结篇)

文章目录 注解注解的介绍注解的定义以及属性的定义格式注解的使用注解解析的方法----AnnotatedElement接口(扩展) 元注解注解之在此注解 注解 注解的介绍 1.jdk1.5版本的新特性 — 一个引用数据类型 和类,接口,枚举是同一个层次…

【教程】使用小米换机来迁移数据

转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] 1、在新旧手机上都下载安装小米换机app:小米换机-小米应用商店 2、在新手机上,选择旧手机类型 3、授予权限 4、在旧手机上,授予权限 4、输入锁屏密码 5、选择发现的新手机 6、等…

EMC整改

EMC包括EMI和EMS,其中EMI由辐射干扰RE、传导干扰CE、谐波电流Harmonics、闪烁Flicker组成,EMS由静电抗扰度ESD、电快速瞬态脉冲群EFT、电压跌落DIP、传导抗扰度CS、辐射抗扰度RS、浪涌抗扰度surge、工频磁场抗扰度PMS。新产品生产出来但凡要做认证&#…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavDestination)

作为子页面的根容器,用于显示Navigation的内容区。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 该组件从API Version 11开始默认支持安全区避让特性(默认值为:expandSaf…

嘿!AI 编码新玩法上线!

随着 AI 智能浪潮到来,AI 编码助手成为越来越多开发者的必备工具,将开发者从繁重的编码工作中解放出来,极大地提高了编程效率,帮助开发者实现更快、更好的代码编写。 通义灵码正是这样一款基于阿里云通义代码大模型打造的智能编码…

Java学习笔记------拼图游戏

图形化界面GUI GUI:Graphical User Interface(图像用户接口),指采用图形化的方式显示操作界面 两套体系:AWT包中和Swing包中 组件 JFrame:最外层的窗体 JMenuBar:最上层菜单 JLaber&#…

【蓝桥杯】节省时间

一、对于string类型变量的连接,可以直接用“”或者“”来进行字符串的直接连接 string a"1"; string b"2"; string c; cab"12"; string操作符两边既可以都是string类型,也可是string与char类型 注意: (1)“”…

rj45网络变压器作用

WE-MIDC网络变压器是Wrth Elektronik公司生产的一种专业级别的网络变压器,也称为Wrth Elektronik网络变压器。它通常用于工业自动化、医疗保健、军事和航空航天等领域的网络通信应用。 WE-MIDC网络变压器具有以下特点: 电气隔离:WE-MIDC网络变…

一次压测经验过程的经验记录

开篇说明 如果在这里获得过启发和思考,希望点赞支持!对于内容有不同的看法欢迎来信交流。 技术栈 >> java 邮箱 >> 15673219519163.com 描述 通常对于QPS较高的web应用程序在开发完成后,除了功能测试之外还需要做一轮压力测试…

工厂模式~

1. 简单工厂 它的主要特点是需要在工厂类中做判断,从而创造相应的产品。当增加新的产品时,就需要修改工厂类。在简单工厂模式中,增加新的产品需要修改工厂类,这违反了开闭原则(对扩展开放,对修改封闭&#…