拓冰建站拓冰建站
首页 / 资讯中心 / 正文

curl/libcurl 的 CURLOPT_SSL_ENABLE_NPN:已废弃的 NPN 选项及其在 HTTP/2 协议协商中的历史角色

curl/libcurl 的 CURLOPT_SSL_ENABLE_NPN已废弃的 NPN 选项及其在 HTTP/2 协议协商中的历史角色【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl本篇技术指南围绕 libcurl 的废弃选项CURLOPT_SSL_ENABLE_NPN展开完整讲解它在 TLS 握手阶段启用/禁用 NPNNext Protocol Negotiation扩展的语义、默认值与参数形态并结合当前仓库源码include/curl/curl.h、lib/setopt.c验证其设置后无实际作用的废弃实现同时对比其继任者 ALPN 选项CURLOPT_SSL_ENABLE_ALPN帮助读者理解 curl 中 HTTP/2 应用层协议协商的演进脉络并掌握在 libcurl 编程中正确配置协议协商选项的实战能力。一、选项概览名称、作用与状态CURLOPT_SSL_ENABLE_NPN是 libcurl 提供的一个 TLS 相关选项用于在 SSL 握手阶段控制NPNNext Protocol Negotiation下一代协议协商扩展的启用与禁用。NPN 是 SPDY/HTTP/2 早期阶段用于协商应用层协议的机制曾在 HTTP/2 over TLS 场景中扮演重要角色。在 curl 的选项历史记录 docs/libcurl/symbols-in-versions 中可以看到它的完整生命周期CURLOPT_SSL_ENABLE_NPN 7.36.0 7.86.0即该选项自 7.36.02014 年引入自 7.86.02022 年 10 月起被正式废弃Deprecated。关键事实速览项目内容选项名称CURLOPT_SSL_ENABLE_NPN头文件curl/curl.h定义于 include/curl/curl.h参数类型long0 或 1默认值1启用适用协议TLS适用 TLS 后端全部All引入版本7.36.0废弃版本7.86.0废弃原因设置后没有任何功能Has no function二、函数原型与参数语义按照 libcurl 选项的标准形态CURLOPT_SSL_ENABLE_NPN通过curl_easy_setopt设置其原型为#include curl/curl.h CURLcode curl_easy_setopt(CURL *handle, CURLOPT_SSL_ENABLE_NPN, long npn);参数npn是一个long类型传 1在 SSL 握手中启用 NPN 扩展如果 libcurl 编译所基于的 SSL 后端支持传 0在 SSL 握手中禁用 NPN 扩展。从用途上看启用 NPN 的目的是在 TLS 握手中协商应用层协议例如 HTTP/2。需要特别强调的是NPN 是否真正可用取决于 libcurl 构建时链接的 SSL 后端是否支持 NPN——这一前提在原文档与 ALPN 选项文档中均有明确说明。官方文档原文语义原文档CURLOPT_SSL_ENABLE_NPN.md对 DESCRIPTION 的表述是Deprecated. Setting this option has no function. Pass a long as parameter, 0 or 1 where 1 is for enable and 0 for disable. This option enables/disables NPN in the SSL handshake (if the SSL backend libcurl is built to use supports it), which can be used to negotiate http2.翻译过来即该选项已废弃设置它没有任何作用其历史语义是在 SSL 握手中启用/禁用 NPN前提是所用 SSL 后端支持可用于协商 HTTP/2。三、源码级验证废弃选项的实际实现从当前仓库源码可以清晰验证该选项的废弃且无功能状态。1. 头文件中的废弃标记在 include/curl/curl.h 中该选项使用专用宏CURLOPTDEPRECATED声明并明确标注了废弃版本与原因/* Enable/disable TLS NPN extension (http2 over SSL might fail without) */ CURLOPTDEPRECATED(CURLOPT_SSL_ENABLE_NPN, CURLOPTTYPE_LONG, 225, 7.86.0, Has no function),选项编号为225参数类型为CURLOPTTYPE_LONG废弃版本为7.86.0废弃说明为Has no function没有任何功能。CURLOPTDEPRECATED宏会为使用该选项的代码生成编译期弃用告警deprecation warning提醒开发者迁移到替代方案即 ALPN。2. setopt 处理分支空实现在选项解析入口 lib/setopt.c 中CURLOPT_SSL_ENABLE_NPN的 case 分支是空的case CURLOPT_SSL_ENABLE_NPN: break;即调用curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, ...)后libcurl直接忽略该参数不写入任何内部状态也不会影响后续 TLS 握手行为。这正是设置此选项无任何功能的源码级证明。与之形成鲜明对比的是紧邻的活跃选项例如CURLOPT_SSL_OPTIONS会真实地把位掩码写入s-ssl.primary.ssl_options。3. 选项注册表与命令行映射在 libcurl 的选项注册表 lib/easyoptions.c 中仍保留了该条目的元信息{ SSL_ENABLE_NPN, CURLOPT_SSL_ENABLE_NPN, CURLOT_LONG, 0 }用于文档生成与选项名称查询在命令行工具的参数映射表 src/tool_setopt.c 中NV1(CURLOPT_SSL_ENABLE_NPN, 1)与NV1(CURLOPT_SSL_ENABLE_ALPN, 1)并列存在说明 curl 工具层面为两者均提供了映射入口NPN 一项已随选项废弃而失去实际效果。四、与 ALPN 的关系从 NPN 到 ALPN 的演进NPN 与 ALPN 都是 TLS 握手阶段的应用层协议协商机制但二者机制不同NPNNext Protocol Negotiation由服务端把支持的协议列表发给客户端由客户端选择最终协议。它源于 SPDY 时代浏览器端Chromium最先提出属于非标准化草案机制。ALPNApplication-Layer Protocol Negotiation由客户端把支持的协议列表发给服务端由服务端选择最终协议随后由 IETF 标准化RFC 7301是当前 HTTP/2RFC 7540与 HTTP/3 时代唯一被广泛采用的协商机制。curl 在 7.36.0 同时引入了 NPN 与 ALPN 两个开关选项CURLOPT_SSL_ENABLE_NPN与CURLOPT_SSL_ENABLE_ALPN但行业最终统一到 ALPN。因此 curl 在7.86.0将 NPN 选项标记为废弃而 ALPN 选项至今仍是活跃选项——在 include/curl/curl.h 中可以看到它是用普通CURLOPT宏声明的/* Enable/disable TLS ALPN extension (http2 over SSL might fail without) */ CURLOPT(CURLOPT_SSL_ENABLE_ALPN, CURLOPTTYPE_LONG, 226),选项编号为226紧邻已废弃的 225NPN。当前源码中的 ALPN 实际实现佐证从当前仓库的 TLS 后端实现可以看到ALPN 是各后端实际落地并广泛使用的机制OpenSSL 后端 lib/vtls/openssl.c通过SSL_set_alpn_protos()把客户端支持的协议列表写入 SSL 会话GnuTLS 后端 lib/vtls/gtls.c通过gnutls_alpn_set_protocols()设置 ALPN 协议列表mbedTLS 后端 lib/vtls/mbedtls.c通过mbedtls_ssl_conf_alpn_protocols()配置 ALPN。这些后端均围绕connssl-alpn结构操作协商结果通过Curl_alpn_set_negotiated()回写。可以推断NPN 选项废弃后这些握手路径中的协议协商统一由 ALPN 承担HTTP/2 的协商能力并未因此缺失。五、完整示例代码继承自原文档原文档给出的示例展示了该选项的完整调用方式int main(void) { CURL *curl curl_easy_init(); if(curl) { CURLcode result; curl_easy_setopt(curl, CURLOPT_URL, https://example.com/); curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 1L); result curl_easy_perform(curl); curl_easy_cleanup(curl); } }要点说明curl_easy_init()创建句柄后先通过CURLOPT_URL设置目标地址curl_easy_setopt(curl, CURLOPT_SSL_ENABLE_NPN, 1L)设置该选项注意参数为1L的long字面量curl_easy_perform(curl)执行传输result保存返回码使用完毕调用curl_easy_cleanup(curl)释放句柄。实战建议由于该选项自 7.86.0 起已无任何功能在新代码中不应再使用CURLOPT_SSL_ENABLE_NPN如需控制 HTTP/2 的协议协商应改用活跃的 CURLOPT_SSL_ENABLE_ALPN 选项其默认值同为 1即默认启用 ALPN并结合 CURLOPT_SSL_OPTIONS 进行更细粒度的 TLS 行为控制。六、返回值与其他curl_easy_setopt选项一致设置CURLOPT_SSL_ENABLE_NPN后返回CURLcode类型的错误码CURLE_OK0设置成功非零值发生错误具体错误码参见libcurl-errors(3)。需要指出的是由于该选项已被废弃且实现为空操作即使返回CURLE_OK也不会对 TLS 握手产生任何影响而在未启用 TLS 支持的构建中setopt.c中#else /* USE_SSL */分支任何 SSL 相关选项包括本选项都会返回CURLE_UNKNOWN_OPTION。七、总结维度结论历史作用在 TLS 握手中启用/禁用 NPN用于协商 HTTP/2当前状态已废弃7.86.0设置后无任何功能源码为空的 case 分支替代方案CURLOPT_SSL_ENABLE_ALPN活跃选项默认启用适用场景仅用于阅读历史代码、理解 HTTP/2 协商演进或保持旧代码兼容性CURLOPT_SSL_ENABLE_NPN是 libcurl 中技术演进而被淘汰的典型代表从 7.36.0 引入到 7.86.0 废弃它的生命周期完整映射了应用层协议协商从 NPN 草案走向 ALPN 标准的过程。理解这一选项的废弃实现setopt.c 的空分支、curl.h 的CURLOPTDEPRECATED标记既能帮助开发者识别历史代码中的无效配置也能更清楚地把握 libcurl 中 HTTP/2 协议协商的正确配置方式。【免费下载链接】curlA command line tool and library for transferring data with URL syntax, supporting DICT, FILE, FTP, FTPS, GOPHER, GOPHERS, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, MQTT, MQTTS, POP3, POP3S, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET, TFTP, WS and WSS. libcurl offers a myriad of powerful features项目地址: https://gitcode.com/GitHub_Trending/cu/curl创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门