严格路由 vs 松散路由

发布时间:2026/9/28 23:49:14

严格路由 vs 松散路由
Kamailio 里的“严格路由”和“松散路由”本质上是 SIP Route/Record-Route 机制的两种模式分别来自较老的 RFC 2543 和较新的 RFC 3261。现在实际生产中几乎都使用松散路由。1. 核心区别对比项严格路由 Strict Routing松散路由 Loose Routing标准来源旧 RFC 2543RFC 3261Route URI 标识没有;lr参数有;lr参数Request-URI会被改成下一个代理的 URI保持为最终目标 URIRoute 头作用通过不断改写 R-URI 实现路由Route 头明确表示下一跳是否推荐不推荐主要为了兼容老设备推荐现代 SIP 标准方式Kamailio 常用处理函数一般不主动使用loose_route()复杂度高容易和 NAT、转发逻辑冲突简单清晰2. 松散路由 Loose Routing松散路由是现代 SIP 的标准做法。典型 Record-Route 头类似Record-Route: sip:proxy.example.com;lr关键点是 URI 里有;lrlr代表 loose routing。松散路由下的请求示例假设 Kamailio 在初始 INVITE 中插入了Record-Route: sip:kamailio.example.com;lr后续 BYE、ACK、re-INVITE 等 in-dialog 请求会带上Route: sip:kamailio.example.com;lr但 Request-URI 仍然是最终目标例如BYE sip:alice192.168.1.100 SIP/2.0 Route: sip:kamailio.example.com;lr也就是说Request-URI 最终目标 Route 经过哪些代理Kamailio 收到后通常这样处理if (has_totag()) { if (loose_route()) { route(RELAY); exit; } }loose_route()会检查 Route 头如果发现自己在 Route 头里就消费掉对应 Route然后继续转发。3. 严格路由 Strict Routing严格路由是旧 SIP 规范里的方式。Record-Route 头里没有;lrRecord-Route: sip:proxy.example.com这种情况下后续请求的 Request-URI 会被改成下一个代理地址而真正的目标 URI 会被放到 Route 头的末尾。严格路由下的请求示例可能变成BYE sip:kamailio.example.com SIP/2.0 Route: sip:alice192.168.1.100也就是说Request-URI 下一个代理 Route 最终目标或后续路由集合这种方式的问题是Request-URI 不再表示最终目标代理需要反复改写 Request-URI和 NAT、注册 Contact、负载均衡逻辑更容易冲突配置和排错更复杂现代 SIP 设备基本不推荐这样用。4. Kamailio 中怎么体现Kamailio 里通常通过rr模块处理 Record-Route 和 Route。常见配置loadmodule rr.so modparam(rr, enable_full_lr, 0) modparam(rr, append_fromtag, 1)初始 INVITE 时让 Kamailio 留在信令路径中if (is_method(INVITE|SUBSCRIBE)) { record_route(); }后续 in-dialog 请求if (has_totag()) { if (loose_route()) { route(RELAY); exit; } if (is_method(ACK)) { exit; } sl_send_reply(404, Not here); exit; }这里的重点是loose_route()虽然名字叫loose_route()但 Kamailio 的rr模块在一定程度上也能兼容一些严格路由场景。不过在现代配置中一般只需要按松散路由设计。5. Record-Route 里的;lr这是判断松散路由的核心。松散路由Record-Route: sip:1.2.3.4;lr或者Record-Route: sip:proxy.example.com;transportudp;lr严格路由Record-Route: sip:1.2.3.4没有;lr就可能被对端当成严格路由。6. Kamailio 的enable_full_lrKamailio 的rr模块有一个参数modparam(rr, enable_full_lr, 0)默认情况下Record-Route 可能类似Record-Route: sip:proxy.example.com;lr如果设置为modparam(rr, enable_full_lr, 1)可能生成Record-Route: sip:proxy.example.com;lron这是为了兼容某些有问题的 SIP 设备它们可能不正确识别没有值的;lr参数。一般情况下保持默认即可除非遇到特定终端或运营商兼容性问题。7. 实际使用建议在 Kamailio 生产环境中建议使用松散路由使用record_route()插入带;lr的 Record-Route使用loose_route()处理后续 in-dialog 请求不要主动生成没有;lr的 Record-Route严格路由只作为兼容旧设备考虑。典型配置结构request_route { if (is_method(INVITE|SUBSCRIBE)) { record_route(); } if (has_totag()) { if (loose_route()) { route(RELAY); exit; } if (is_method(ACK)) { exit; } sl_send_reply(404, Not here); exit; } route(RELAY); } route[RELAY] { if (!t_relay()) { sl_reply_error(); } exit; }8. 一句话总结严格路由是旧式 SIP 路由方式会通过改写 Request-URI 控制下一跳松散路由是现代标准方式通过Route头和;lr参数控制路由Request-URI 保持最终目标。Kamailio 生产环境中基本都应该使用record_route()loose_route()的松散路由模式。

相关新闻

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南

2026/8/23 4:16:13

Vibe Coding到Agentic Engineering:AI编程范式演进与实战指南 2025年2月,OpenAI联合创始人Andrej Karpathy首次提出"Vibe Coding"(氛围编程)概念,同年入选柯林斯词典年度热词。然而仅仅一年后,20…

深入解析TI N2HET核心指令:MOV64、PCNT、PWCNT与协同指令实战

深入解析TI N2HET核心指令:MOV64、PCNT、PWCNT与协同指令实战

2026/8/23 4:16:14

1. 项目概述与N2HET模块定位 在嵌入式实时控制系统的开发中,精准的时序控制能力往往是决定系统性能上限的关键。无论是电机驱动中精确的换相时序,还是电源管理里严苛的死区时间,亦或是通信协议中毫秒乃至微秒级的同步信号,其背后都…

【Rust自学】10.2. 泛型

【Rust自学】10.2. 泛型

2026/9/23 11:53:22

10.2 泛型 10.2.1. 什么是泛型 泛型的主要作用是提高代码的复用性。它们适合处理重复代码问题,也可以看成是把数据与算法分离。 泛型是具体类型或其他属性的抽象替代。 换句话说,你写的泛型代码并不是最终代码,而更像是一种带有一些占位符…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/28 4:08:17

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/28 16:01:49

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

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/28 2:15:29

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/28 3:14:54

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/28 3:58:00

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

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/28 3:47:14

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/28 16:01:48

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/28 5:05:21

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/28 16:01:48

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…