OpenSIPS 4.0 不仅在于添加新功能,更在于重新审视引擎中那些长期未变的部分。
最重要的例子之一就是 TCP/TLS 层。我们迄今所熟知的 TCP 框架,自 20 多年前推出以来,其结构基本保持不变。它基于当时的架构现实构建而成,并为 OpenSIPS 提供了良好的服务。但随着时间的推移,其局限性变得越来越明显。
OpenSIPS 4.0 对这一领域进行了彻底重构:摒弃了旧有的多进程 TCP 模型,转向全新的单进程、多线程架构。

旧模型
传统的 TCP 框架基于一个 TCP 主进程,该进程将连接分配给一组 TCP 工作进程。由于 OpenSIPS 本身是围绕多进程模型设计的,因此 TCP 层必须支持连接共享,甚至支持进程之间的连接“迁移”。
这种方法带来了代价。首先,它使得整个 I/O 路径比本应有的更加复杂。连接必须在 TCP 主进程和 TCP 工作进程之间来回传递,增加了额外的开销,也使得流量更难维护。
其次,负载均衡本身也受到一定限制。由于连接和 I/O 所有权与这种基于进程的模型紧密相连,因此在工作进程之间高效分配工作始终无法达到我们期望的灵活性。
最后,这种设计给 TLS 带来了沉重负担。
从一开始,OpenSIPS 中对 TLS 的支持就因这种多进程 SIP 架构而困难重重。它需要特殊的共享内存处理机制,并需对 OpenSSL 结构体进行显式加锁。随着时间推移,OpenSSL 越来越不支持此类用法,迫使我们不得不添加越来越多的调整,仅为维持系统正常运行。
这些调整不仅影响了 TLS 传输层,还对在更简单的单进程场景中使用 OpenSSL 的其他模块(如 db_mysql、db_postgres、stir_shaken 等)产生了负面影响。此外,旧模型还为那些无人愿意调试的错误敞开了大门:悬空内存、双重释放、内存泄漏以及难以解释的崩溃。
因此,此次重构的动机不仅仅是为了使代码现代化。我们还希望简化 OpenSIPS 中的 I/O 模型,并消除长期存在的架构痛点。而 OpenSIPS 4.0 正是实现这一目标的绝佳契机!
新模型
与将 TCP 所有权分配给多个进程不同,现在所有 TCP/TLS 工作都在一个专用的进程内部处理。该进程使用可配置数量的线程来执行 TCP 连接上的实际读写操作。换句话说,连接不再在进程之间传递:它们由一个进程统一拥有和管理。
这使得 TCP 层更加轻量、简洁,并更好地适配现代系统。在当今系统中,多线程设计比 20 年前要实用得多。
读取(Reading)
在读取方面,TCP 主进程通过其专用线程执行实际的 I/O 操作。
数据接收后,OpenSIPS 会执行一个轻量级的解析步骤,仅用于确定消息边界并计算完整消息的长度。一旦获得完整的 SIP 消息,它就会被分发给其中一个 OpenSIPS 工作进程,由其继续进行 SIP 层面的处理。
因此,传输 I/O 保持集中化,而 SIP 逻辑则继续由工作进程处理。
写入与连接(Writing and connecting)
写入路径遵循相同的理念。当一个工作进程需要发送数据时,它不再直接写入套接字。取而代之的是,它会构建一个异步数据块,并将写入任务提交给 TCP 进程,由该进程的 I/O 线程执行实际的发送操作。
连接建立也由该进程处理,这意味着写入和连接现在完全由 TCP 进程及其线程负责。这彻底消除了 TCP 传递,使框架拥有了一个更加简洁的所有权模型。
对于 TLS/OpenSSL 而言,其优势更为显著。SSL 上下文现在可以局限于 TCP 进程内部,无需在多个进程之间共享。这消除了旧设计中最大的限制之一,并使我们能够摆脱此前所需的许多调整和妥协。
性能
在性能方面,最大的优势在于延迟,尤其是连接建立阶段。在涵盖 30,000 次 SIP 交换、每秒 500 次请求的合成端到端 TLS 测试中,重构后的架构在保持类似吞吐量的同时,始终比旧模型提供更低的延迟,其中连接建立阶段的改进最为显著。
当然,这些只是合成测试,因为在受控环境中很难准确复现真实的 SIP 流量。尽管如此,测试结果仍有力地表明:将套接字 I/O 集中到拥有独立线程池的专用 TCP 进程中,不仅能降低协调开销,还能在高负载下提供更简洁、更可预测的执行路径。
未来工作
对于这个新框架而言,还有一些显而易见的后续步骤。一是实现完善的写入结果报告机制,以便SIP端能够获知异步发送最终是成功还是失败。二是继续简化处理模型,放弃专用工作线程模式,转而采用统一的工作线程池。
此次 TCP/TLS 重构不仅是对当前协议栈的清理,也是朝着 OpenSIPS 4.0 及更高版本计划进行的更广泛的内部变更迈出的一步。
此次 TCP/TLS 重构是 OpenSIPS 4.0 的一项重大内部变更。它简化了传输层,消除了旧 TLS 设计的一些限制,并为 OpenSIPS 核心的进一步变更提供了更好的基础。
原文:https://blog.opensips.org/2026/04/08/tcp-tls-rework-in-opensips-4-0/
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。