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

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

Tengine通过xquic实现HTTP3协议,不同于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/745405.shtml

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

相关文章

【投稿优惠-EI稳定检索】2024年图像处理与机械系统工程国际学术会议 (ICIPMSE 2024)

【投稿优惠-EI稳定检索】2024年图像处理与机械系统工程国际学术会议 (ICIPMSE 2024) 大会主题: (主题包括但不限于, 更多主题请咨询会务组苏老师) 图像处理 基于图像的渲染 计算机视觉 可视化分析 模式识别 3D打印 渲染和动画 渲染技术 电脑动画 基于草图的建模 机械…

IT领域的未来发展趋势与挑战

IT行业作为当今世界最具活力和创新性的领域之一,持续地塑造着我们的生活和工作方式。在未来,IT领域将继续迎来许多重要的发展趋势和挑战,这些趋势将引领着技术的发展方向,而挑战则需要我们找到有效的解决方案。 1. 人工智能&…

苹果Find My App用处多多,产品认准伦茨科技ST17H6x芯片

苹果发布AirTag发布以来,大家都更加注重物品的防丢,苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch,如今的Find My已经不单单可以查找苹果的设备,随着第三方设备的加入,将丰富Find My Network的版图。产…

Unity Timeline学习笔记(2) - PlayableTrack

PlayableTrack 是可自定义播放的轨道。我们可以通过进入轨道后调用自己的函数方法,使用起来也是比较顺手的。 添加轨道 我们点击加号添加 这样就有一个空轨道了,然后我们创建两个测试脚本。 添加脚本 分别是Playable Behaviour和PlayableAsset脚本。…

unity报错出现Asset database transaction committed twice!

错误描述: 运行时报错 Assertion failed on expression: ‘m_ErrorCode MDB_MAP_RESIZED || !HasAbortingErrors()’Asset database transaction committed twice!Assertion failed on expression: ‘errors MDB_SUCCESS || errors MDB_NOTFOUND’ 解决办法&…

MySQL:概念简章

1.SQL通用语法 SQL单行、多行书写,以分号结尾SQL可以以空格有缩进增加代码可读性SQL语句不区分大小写 2.SQL语句分类 2.1 DDL(数据定义语言) 用于数据库、数据表、字段的定义的语言 create by 表名 (表里有什么字段)…

Hive中的CONCAT、CONCAT_WS与COLLECT_SET函数

1.CONCAT与CONCAT_WS函数 1.1 CONCAT函数 -- concat(str1, str2, ... strN) - returns the concatenation of str1, str2, ... strN or concat(bin1, bin2, ... binN) - returns the concatenation of bytes in binary data bin1, bin2, ... binN Returns NULL if any argum…

幼儿园管理系统|基于springboot框架+ Mysql+Java+Tomcat的幼儿园管理系统设计与实现(可运行源码+数据库+设计文档+部署说明)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 用户功能模块 管理员功能登录前台功能效果图 教师功能模块 系统功能设计 数据库E-R图设计 lunwen参…

项目安全保证措施word

软件系统做项目安全保证措施的原因有以下几点: 保护数据安全:通过安全措施可以保护数据不被非法获取、篡改或损坏。 保障系统稳定:安全措施可以减少系统受到的威胁,确保系统的稳定运行。 符合法律法规:为了遵守国家和地…

蓝桥杯单片机快速开发笔记——定时器

一、基本原理: 定时器的作用: 定时器是一种用于产生精确时间延时的模块,可以在程序中用来进行时间控制、计时等操作。 定时器的工作原理: 51单片机的定时器是通过内部的计数器来实现的,计数器每隔一个固定的时间周期自…

【AIGC调研系列】Github Copilot进行pytest自动化测试的实践经验

GitHub Copilot可以用于pytest自动化测试的实践和使用方法。此外,Copilot可以在很多情况下仅通过注释或函数名就能实例化出完整的代码,这表明它也可以用于补充测试用例[5]。 具体到pytest框架,它是一个非常容易上手的自动化测试框架&#xf…

【gpt实践】实用咒语分享

直接上咒语了,大家可以自行实践。 1、忽略先前所有的提示 有时候gpt会停留在之前的问题中,导致回答当前问题带着之前问题结论。 2、忽略所有的客套话 我们只是需要有用的信息,有时候gpt客套话会混淆视听。 3、给出非常简短明确的答案 同样…

Selenium 自动化 —— 入门和 Hello World 实例

Selenium 是什么 Selenium 是一个用于自动化网页浏览器操作的工具,它支持多种浏览器和多种操作系统。主要用于测试 web 应用程序的功能,也可用于执行一些基本的浏览器操作任务,例如自动化表单填写、网页导航等。 Selenium 是一个开源项目&a…

kakfa模拟仿真篇之spark-submit在linux运行 (更贴近真实场景)

源码在上篇 地址在这 :Kafka模拟器产生数据仿真-集成StructuredStreaming做到”毫秒“级实时响应StreamData落地到mysql-CSDN博客 这里分享一下一些新朋友不知道spark-submit 指令后 的参数怎么写 看这篇绝对包会 声明: 此项目是基于 maven 打包的说明…

JVM 相关知识点记录

文章目录 前言哪些内存需要回收方法区的垃圾回收垃圾收集算法垃圾收集器年轻代进入老年代条件内存担保机制FullGC 触发时机GC日志解析日志参数 前言 JVM包含内容: 类装载子系统(Class Load SubSystem)运行时数据区(Run-Time Data Areas) 堆栈 局部变量表操作数栈动…

Windows安装Elasticsearch8.x保姆级教程

Elasticsearch 下载安装 下载:点击https://www.elastic.co/cn/downloads/elasticsearch --> 点击View past releases -->找到8.11.1版本的ES --->点击下载---目前最新版的Spring Data ES最高支持8.11.1版本 elasticsearch与JDK版本&#xff1a…

openstack迁移虚拟机--来自gpt

在OpenStack环境中,虚拟机的迁移可以通过多种方式实现,包括实时迁移(Live Migration)和冷迁移(Cold Migration) 实时迁移(Live Migration) 实时迁移是在虚拟机运行的同时将其迁移到…

某赛通电子文档安全管理系统 DecryptApplication 任意文件读取漏洞(2024年3月发布)

漏洞简介 某赛通电子文档安全管理系统 DecryptApplication 接口处任意文件读取漏洞,未经身份验证的攻击者利用此漏洞获取系统内部敏感文件信息,导致系统处于极不安全的状态。 漏洞等级高危影响版本*漏洞类型任意文件读取影响范围>1W 产品简介 …

数据结构 day4 链表

1: 2: 3: 4: 5: 6:

C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词问题。但有些情况下,没有空格,则需要好的分词算法。…