尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Fluent Bit 内置 nghttp2:nghttp2_session_get_stream_effective_local_window_size 流级本地接收窗口 API 解析
Fluent Bit 内置 nghttp2nghttp2_session_get_stream_effective_local_window_size 流级本地接收窗口 API 解析【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit本文以 Fluent Bit 仓库中内置的 nghttp2 1.65.0 库位于 lib/nghttp2-1.65.0为对象围绕其 API 文档 nghttp2_session_get_stream_effective_local_window_size.rst 展开讲清这个 HTTP/2 流控Flow ControlAPI 的函数签名、语义边界、返回值约定以及它与nghttp2_submit_window_update()、nghttp2_session_get_stream_local_window_size()等姊妹 API 之间的差异并结合 nghttp2 库源码、单元测试和 nghttp 命令行工具的调用点说明该 API 在流控监控与自动 WINDOW_UPDATE 决策中的真实用途。读完后你将能在基于 nghttp2 的 HTTP/2 客户端/服务端例如 Fluent Bit 的 HTTP/2 客户端 所依赖的同一套库中正确查询流级本地窗口大小并避免把窗口容量与当前可发送余量混为一谈。API 总览函数签名与文档语义原始 API 文档给出的原型如下与库头文件 nghttp2.h 中的声明一致#include nghttp2/nghttp2.h int32_t nghttp2_session_get_stream_effective_local_window_size( nghttp2_session *session, int32_t stream_id);文档的核心语义可以归纳为三点返回值含义返回流stream_id的本地receive接收方窗口大小即当前流允许远端在收到流级 WINDOW_UPDATE 之前还能发送多少字节 DATA 的名义上限。对nghttp2_submit_window_update()的响应本地窗口大小可以由nghttp2_submit_window_update()调整本函数会把这些调整纳入计算返回的是生效的effective窗口大小而不是初始值。明确的排除项本函数不计入已从远端接收到的数据量。如果你想知道远端此刻在不触发流级 WINDOW_UPDATE 的前提下还能发多少数据应改用nghttp2_session_get_stream_local_window_size()。同时文档提醒即使流级窗口充足每个流仍受连接级流控约束。失败约定查询失败时返回-1例如指定的流不存在。源码实现为什么effective只是读取一个字段查看 nghttp2 库的实现 nghttp2_session.c函数体非常简短int32_t nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session, int32_t stream_id) { nghttp2_stream *stream; stream nghttp2_session_get_stream(session, stream_id); if (stream NULL) { return -1; } return stream-local_window_size; }从源码结构看可以得出几个关键结论effective的体现不在这里而在写入侧。函数直接返回stream-local_window_size字段该字段的生效性是由nghttp2_submit_window_update()通过nghttp2_adjust_local_window_size()持续维护的——见 nghttp2_submit.c对非零stream_id增量increment会被直接应用到stream-local_window_size上只有正增量才会真正入队一个 WINDOW_UPDATE 帧负增量只收缩本地窗口、不发送帧。初始值来源新建流时stream-local_window_size被初始化为流级初始窗口见 nghttp2_stream.c该初始值由宏NGHTTP2_INITIAL_WINDOW_SIZE定义为(1 16) - 165535 字节HTTP/2 规范默认值定义位于 nghttp2.h连接级初始窗口则由NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE给出nghttp2_session.c 中初始化会话字段。窗口大小的硬上限是NGHTTP2_MAX_WINDOW_SIZE即(1U 31) - 1nghttp2.h。失败语义的唯一来源nghttp2_session_get_stream()返回 NULL流不存在时返回-1这与文档中returns -1 if it fails的约定一一对应。也就是说这个 API 是一个低成本的流控状态查询点不重新计算、不受已接收字节数影响反映的是当前窗口设定值本身。与nghttp2_session_get_stream_local_window_size()的关键区别这是使用者最容易混淆的一对 API。文档原文特别强调前者does not take into account the amount of received data from the remote endpoint。对照两者在 nghttp2_session.c 中的实现/* effective_local_window_size仅返回设定值 */ return stream-local_window_size; /* local_window_size设定值 - 已接收且未通过 WINDOW_UPDATE 确认的字节数 */ size stream-local_window_size - stream-recv_window_size; /* 若本地端收缩了 SETTINGS_INITIAL_WINDOW_SIZEsize 可能为负 */ if (size 0) { return 0; } return size;两者的语义差异可以这样理解API含义是否扣除已接收数据典型用途nghttp2_session_get_stream_effective_local_window_size()流级本地窗口设定值含submit_window_update调整否监控窗口被调整到多大、判断何时该扩大窗口nghttp2_session_get_stream_local_window_size()远端在不收流级 WINDOW_UPDATE 前还能发多少字节是且负值归零计算流级实际可发送余量头文件 nghttp2.h 中nghttp2_session_get_stream_local_window_size()的注释还指出实际可发送量是流级窗口与连接级窗口nghttp2_session_get_local_window_size()的较小值即 HTTP/2 双层流控取min。同族 API 还包括连接级的nghttp2_session_get_effective_local_window_size()nghttp2_session.c与用于统计已接收未确认字节数的nghttp2_session_get_stream_effective_recv_data_length()nghttp2_session.c四者构成完整的流控查询矩阵。调用链验证nghttp 工具如何用这对 API 决策 WINDOW_UPDATE库自带命令行工具nghttp的 C 前端展示了这对 API 的标准用法。在 http2.cc 中int32_t determine_window_update_transmission(nghttp2_session *session, int32_t stream_id) { int32_t recv_length, window_size; if (stream_id 0) { recv_length nghttp2_session_get_effective_recv_data_length(session); window_size nghttp2_session_get_effective_local_window_size(session); } else { recv_length nghttp2_session_get_stream_effective_recv_data_length(session, stream_id); window_size nghttp2_session_get_stream_effective_local_window_size( session, stream_id); } if (recv_length ! -1 window_size ! -1) { if (recv_length window_size / 2) { return recv_length; /* 达到半窗返回应恢复的增量 */ } } return -1; }这段逻辑印证了文档语义的实战含义effective 窗口大小与已接收字节数分开获取然后按半窗阈值recv_length window_size / 2决定是否发送 WINDOW_UPDATE 及其增量。若把两个 API 的语义搞混例如拿get_stream_local_window_size()的剩余量当分母半窗判断会失去一致性。返回值 -1 时流不存在也体现了调用方必须处理失败约定的要求。单元测试窗口收缩/扩张下 effective 值的变化轨迹nghttp2 的单元测试 nghttp2_session_test.c 中的test_nghttp2_session_get_effective_local_window_size()完整覆盖了文档描述的每个行为点是理解该 API 最可靠的活文档初始状态新建客户端会话并打开流 1 后get_stream_effective_local_window_size(session, 1)返回NGHTTP2_INITIAL_WINDOW_SIZE65535而get_stream_effective_recv_data_length()返回 0——此时窗口设定值与已接收量各自独立。扩张先人为令stream-recv_window_size 100模拟已接收 100 字节再nghttp2_submit_window_update(session, NGHTTP2_FLAG_NONE, 1, 1100)随后get_stream_effective_local_window_size()返回NGHTTP2_INITIAL_WINDOW_SIZE 10001100 增量中 100 用于覆盖已接收字节、1000 才是净扩张而get_stream_local_window_size()同样返回1000的余量——两者此时数值一致正是因为recv_window_size已被增量补偿。收缩提交负增量-50后recv_window_size变为 -50effective 窗口随之减小为950但此时get_stream_local_window_size()仍返回1000实现中负余量归零的边界在此体现。再次扩张recv_window_size归零后再提交100effective 值变为1050而get_stream_effective_recv_data_length()返回 50再次验证已接收量与窗口设定值是两条独立的账本。这套测试同时覆盖了连接级stream_id 0与流级的对称行为值得在自定义流控逻辑时作为回归参照。Fluent Bit 中的位置HTTP/2 客户端并未显式调用此 API在 Fluent Bit 主程序中HTTP/2 支持由 flb_http_client_http2.c 实现它通过nghttp2_session_client_new()创建会话、注册on_data_chunk_recv/on_frame_recv等回调、用nghttp2_session_mem_recv()喂入网络数据见 源码。在该文件中检索不到对nghttp2_submit_window_update或本查询 API 的直接调用——从源码结构看Fluent Bit 作为发送方为主的小型客户端依赖 nghttp2 库内部基于SETTINGS_INITIAL_WINDOW_SIZE的默认窗口65535 字节/流与库内建的流控处理来收发数据未做显式的窗口管理。这带来两点实用结论默认窗口足够小/流足够大时需注意nghttp2 库默认初始窗口为 65535 字节对于长连接、大响应的场景例如 Fluent Bit 通过 HTTP/2 后端发送大体积日志/指标负载时若需要提升吞吐应通过nghttp2_submit_settings()协商更大的SETTINGS_INITIAL_WINDOW_SIZE或在数据接收回调中配合nghttp2_submit_window_update()主动扩窗——这正是本文文档所描述的本地窗口可由nghttp2_submit_window_update()调整机制。查询类 API 的价值nghttp2_session_get_stream_effective_local_window_size()这类只读 API 不影响协议状态适合在诊断代码、指标采集或断言中读取流控水位例如判断窗口是否被压到了下限、半窗阈值是否已越过而无需自行维护窗口计数。使用要点与常见误区综合文档、头文件注释nghttp2.h与实现使用本 API 时的要点失败返回值是 -1在用它参与算术如半窗判断之前必须判断-1nghttp 工具的determine_window_update_transmission()即做了此防护。它是容量而非余量想知道剩余可发送字节用nghttp2_session_get_stream_local_window_size()想知道当前已接收未确认字节数用nghttp2_session_get_stream_effective_recv_data_length()想知道窗口设定值本身才用本 API。双层流控取小流级窗口余量再大实际可发送量仍受连接级窗口nghttp2_session_get_local_window_size()约束文档原文each stream is still subject to the connection level flow control与头文件注释均明确这一点。窗口上限任何调整含经nghttp2_session_set_local_window_size()设置的绝对值见 nghttp2.h不得超过NGHTTP2_MAX_WINDOW_SIZE2^31 - 1。负增量的副作用提交负的window_size_increment会收缩本地窗口且不发送 WINDOW_UPDATE 帧nghttp2_submit.c此时 effective 窗口随之变小但已接收量账本可能出现负值并触发余量归零逻辑——单元测试第 3 步正是这一行为的实证。小结nghttp2_session_get_stream_effective_local_window_size()是 nghttp2 流控 API 家族中负责读取流级本地窗口设定值的成员它通过直接返回stream-local_window_size字段实现nghttp2_session.c反映nghttp2_submit_window_update()的全部调整但不扣除已接收数据流不存在时返回 -1。理解它与get_stream_local_window_size()剩余量、get_stream_effective_recv_data_length()已接收量三者的分工配合单元测试中扩张/收缩/再扩张的完整轨迹nghttp2_session_test.c和 nghttp 工具的半窗决策逻辑http2.cc即可在 Fluent Bit 这类基于 nghttp2 构建 HTTP/2 传输的项目中正确实现流控监控与 WINDOW_UPDATE 策略。文中所有路径均相对于仓库根目录API 文档原始文件为 nghttp2_session_get_stream_effective_local_window_size.rst。【免费下载链接】fluent-bitFast and Lightweight Logs, Metrics and Traces processor for Linux, BSD, OSX and Windows项目地址: https://gitcode.com/GitHub_Trending/fl/fluent-bit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

Mac 下 uniapp 项目 esbuild 版本冲突排查与修复指南

Mac 下 uniapp 项目 esbuild 版本冲突排查与修复指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/17 4:25:50
PointNetLK复现实战:从数据预处理到5步推理,告别ICP初值敏感

PointNetLK复现实战:从数据预处理到5步推理,告别ICP初值敏感

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📅 2026/9/17 4:20:50
基于S7-200 PLC与MCGS触摸屏的八人抢答器设计与实现

基于S7-200 PLC与MCGS触摸屏的八人抢答器设计与实现

最近给一个单位做了一套知识竞赛用的八人抢答器,主控用的是手头现成的西门子S7-200 PLC,上位界面用MCGS 7.7组态触摸屏来实现。整套东西从需求梳理、PLC程序设计、MCGS画面组态到现场联调,前前后后折腾了将近一周。把这个项目完整记录下来&am…

📅 2026/9/17 4:20:50
MORE NEWS

更多资讯

📰

Pyrefly 忽略指令控制指南:深入解析 `permissive-ignores` 与 `enabled-ignores`

Pyrefly 忽略指令控制指南:深入解析 permissive-ignores 与 enabled-ignores 【免费下载链接】pyrefly A fast type checker and language server for Python 项目地址: https://gitcode.com/GitHub_Trending/py/pyrefly 在大型 Python 代码库中引入类型检查…

📰

OpenHarmony多端UI适配与性能优化实战

1. 项目背景与核心挑战OpenHarmony作为新一代分布式操作系统,其多设备适配能力一直是开发者关注的焦点。Kuikly框架作为OpenHarmony生态中的重要UI开发工具,在实际跨端适配过程中面临着三大核心挑战:布局适配困境:不同设备从手表到…

📰

长尾请求根因分析:利用 Jaeger 追踪定位数据库慢查询

长尾请求根因分析:利用 Jaeger 追踪定位数据库慢查询在大型企业级 RAG(检索增强生成)与分布式微服务架构中,一次端到端问答请求往往跨越了 API 网关、权限认证、Redis 语义缓存、Milvus 向量检索、PostgreSQL 关系型元数据库与大语…

📰

agent-plugins 配置实战:skills_lint.yaml 从全局规则到目录级覆盖完整指南

agent-plugins 配置实战:skills_lint.yaml 从全局规则到目录级覆盖完整指南 【免费下载链接】agent-plugins 项目地址: https://gitcode.com/GitHub_Trending/skills16/agent-plugins agent-plugins 是 Flutter 团队维护的一组 AI Agent 插件集合&#xff0…

📰

iOS应用上架App Store全流程与实战技巧

1. iOS应用上架App Store全流程解析作为一名经历过数十次App Store上架审核的开发者,我深知iOS应用发布过程中的每个环节都可能成为"拦路虎"。本文将用最直白的方式,拆解从零开始到成功上架的完整流程,分享那些官方文档不会告诉你的…

📰

C#装箱拆箱深度解析:从内存原理到高性能优化实践

1. 包装类与装箱拆箱,到底在聊什么如果你是搞C#开发的,这几个名词一定不陌生:包装类、装箱、拆箱。很多人一开始接触这个概念是在面试题里,背得滚瓜烂熟——“值类型转引用类型叫装箱,引用类型转值类型叫拆箱”。可真到…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬