5G 技术的速度比 4G 技术快 1000 倍,延迟也大大降低,并能支持大量设备同时连接到网络。美国和欧洲的电信运营商最早于 2019 年部署 5G,并在接下来的几年中持续部署,因此现在是通过 HTTP/2 支持来增强 OpenSIPS 的最佳时机,这样它也能在下一代 5GC(5G 核心网)网络中发挥作用。
HTTP/2 摘要
HTTP/2 是一种二进制协议(是的,现在需要经常在 Wireshark 中对其进行解码),通过引入报头字段压缩并允许在同一连接上进行多个并发交换,可以更有效地利用网络资源并减少延迟感。具体来说,它允许在同一连接上交错处理请求和响应信息,并使用高效的 HTTP 头字段编码。
“nghttp2″库和 “libevent “服务器框架
在搜索 HTTP/2 RFC 9113 的 C 语言实现时,没过多久我们就发现了 Tatsuhiro Tsujikawa 在 nghttp2 C 库和工具方面的工作,该开源项目的文档托管在他们的个人 https://nghttp2.org/ 网站上,由 nghttp2d 服务器提供服务。
nghttp2 开放源代码库在网站和 C 源代码头文件中都有非常完善的文档。该库大量采用回调驱动,在根据需要配置、调整或指示该库以不同方式运行时,都有适当的抽象。虽然在学习和正确携带/管理单个 HTTP/2 请求的大量回调数据以及与每个回调相关的数据结构和抽象时,学习曲线会比较陡峭,但最终投资是值得的,因为您最终会得到一个与底层 HTTP/2 实现完全解耦的应用程序。从长远来看,这将最大限度地提高与 nghttp2 库未来迭代的兼容性,因为我们预计系统升级将非常顺利。
nghttp2 库被称为 “HTTP/2 实现”,它忠实于自己的定义,并不是 HTTP/2 服务器。至于服务器部分,它本身由 libevent.org 开源项目和库提供支持,库的代码托管在 github.com/libevent/libevent。
OpenSIPS 3.5 中的新模块:”http2d“
下一步是将 nghttp2、libevent 及其他依赖库(libssl、libcrypto、libevent-openssl)整合到 OpenSIPS 模块中。httpd 由 libmicrohttpd 提供支持,我们没有将所有这些新的库依赖关系整合到 httpd 中,而是使用了一个新模块:http2d。
让我们来看看它的一些模块参数:
loadmodule "http2d.so"
modparam("http2d", "ip", "127.0.0.2")
modparam("http2d", "port", 443)
modparam("http2d", "tls_cert_path", "/etc/pki/ http2/cert.pem")
modparam("http2d", "tls_key_path", "/etc/pki/http2/key.pem")
modparam("http2d", "max_headers_size", 8192)
modparam("http2d", "response_timeout ”,2000)
由于 HTTP/2 主要是以安全方式提供的(例如,Chrome 浏览器和 Mozilla 不支持明文 HTTP/2 服务器,也就是 “h2c “升级),因此我们也将其作为起点。请注意用于 TLS 通信的 tls_cert_path 和 tls_key_path 设置。最后,我们使用 max_headers_size(8 KB)对单个 HTTP/2 请求的头数据量进行了合理的默认设置,并限制了 OpenSIPS 系统开发人员在 OpenSIPS 自动回复客户端之前对单个 HTTP/2 请求的 opensips.cfg 处理量–response_timeout(2 秒)。
下面是 OpenSIPS 系统开发人员如何处理 HTTP/2 请求并构建自定义响应的示例:
event_route [E_HTTP2_REQUEST]
{
xlog("H2-Method: $param(method)\n");
xlog("H2-Path: $param(path)\n");
xlog("H2-Headers: $param(headers)\n");
xlog("H2-Data: $param(data)\n");
$var(headers) = "[
{ \"content-type\": \"application/json\" },
{ \"server\": \"OpenSIPS 3.5\" },
{ \"x-current-time\": \"1711457142\" },
{ \"x-call-cost\": \"0.355\" }
]";
$var(data) = "{\"status\": \"success\"}";
if (!http2_send_response(200, $var(rpl_headers), $var(data)))
xlog("ERROR - failed to send HTTP/2 response\n");
}
要点:
- HTTP/2 请求通过E_HTTP2_REQUEST 事件到达,因此请确保事先加载event_route.so模块,并为事件定义 event_route 订阅者
- 请求的所有数据都可以通过事件参数获得: method、path、headers和data。提示:您可以使用json 模块来解析$param(headers) JSON 数据。
- 能够完全自定义 HTTP/2 响应:
- 可以包含一个或多个自定义回复标头,打包为 JSON 数组,然后传递给“http2_send_response()”函数
- 还可以通过提供“http2_send_response()”的第三个参数来包含响应的数据有效负载
新的 http2d 模块初稿已在主分支(开发分支)上发布,正在等待测试和反馈。您的反馈意见非常重要: 您是对 TLS 通信 100% 满意,还是认为我们也应该提供 HTTP/2 明文(h2c)监听选项?您是否知道在 5GC 网络中使用/推荐使用 “h2c “的情况或 3GPP 草案?HTTP/2中是否有http2d目前还没有提供的功能?或者有一些非 HTTP/2 功能(实用功能)被遗漏了?
译自:https://blog.opensips.org/2024/03/27/http-2-server-support-for-next-generation-services-in-opensips-3-5/
本文来自作者投稿,版权归原作者所有。如需转载,请注明出处:https://www.nxrte.com/jishu/46362.html