SIP URI分隔符使用咨询:History-Info头中?与;的适用场景区分
两种格式的本质差异
SIP URI的结构在RFC 3261中明确规定,两种分隔符的作用完全不同:
- 分号
;:用于分隔SIP URI固有参数,属于URI本身的组成部分,会参与URI的匹配、路由计算逻辑,常见的user=phone、transport=tcp都属于这类参数 - 问号
?:用于分隔URI携带的请求头参数,不属于URI本身的属性,仅在使用该URI发起新请求时,会自动将这部分参数作为对应的请求头添加到新请求中
History-Info场景的正确用法
根据RFC 4244(History-Info头域官方规范)的定义,History-Info条目中用于记录呼叫跳转原因的Reason属于URI的元数据,需要作为URI参数存在,因此标准场景下应当使用分号;作为分隔符,也就是你给出的第二种格式是规范写法:History-Info:<sip:xxxx@xx.com;user=phone;Reason=SIP%3Bcause%3D486>;index=1
问号写法的适用场景
你看到的第一种带?的写法属于非标准的扩展用法,仅在特定场景下使用:当你需要后续向该URI发起新请求时,自动在请求头中携带Reason: SIP;cause=486的头域,才会使用这种写法。但该写法不符合History-Info的规范,绝大多数标准SIP设备无法正确识别其中的跳转原因值,兼容性极差,非必要不推荐使用。
注意事项
无论使用哪种写法,Reason的取值都需要做URL编码,你示例中的SIP%3Bcause%3D486符合编码要求,可以避免特殊字符被解析错误。
内容的提问来源于stack exchange,提问作者yxxxxx
相关产品推荐
相关产品推荐

