UDP建立的SIP对话发送TCP大消息后后续报文采用何种传输协议
SIP对话传输协议切换问题结论
通过UDP完成建立的SIP对话,因传输大报文临时切换为TCP后,大报文发送完成时:
- 无特殊约束的正常尺寸报文,既可以继续使用TCP传输,也可以切回初始协商的UDP传输,RFC 3261没有强制要求必须全程保持TCP传输
- ACK、CANCEL两类请求有明确协议约束,必须与对应原始请求使用完全相同的传输协议,不可随意切换
相关RFC 3261规范依据
- 所有SIP元素必须实现UDP和TCP,也可选择实现其他传输协议
- ACK必须发送到原始请求指向的相同地址、端口和传输协议,不可独立选择传输协议
- UA必须支持TCP的核心设计目的就是处理大消息,大消息必须使用TCP传输,已建立的对话无需通过RE-INVITE修改传输参数,即可直接从UDP切换为TCP
- 301(永久迁移)或302(临时迁移)响应可在返回相同目标位置和用户名的同时,指定额外传输参数,实现UDP和TCP的传输协议切换,该规则仅用于响应INVITE或RE-INVITE时修改UAC提出的传输参数,和本问题关联度较低
- CANCEL的目标地址、端口和传输协议必须与发送原始请求时使用的参数完全一致,不可独立选择传输协议
- 若请求大小与路径MTU差值小于200字节,或请求大于1300字节且路径MTU未知,必须使用符合拥塞控制要求的传输协议(例如TCP)发送。如果该操作导致传输协议与顶部Via字段标识的协议不一致,必须修改顶部Via字段的值,这也说明通过UDP建立的SIP对话,必须具备接收TCP请求的能力
- 服务端在任意端口和接口监听UDP请求的同时,必须在相同端口和接口监听TCP请求,就是为了支持大消息从UDP切换为TCP发送。反过来没有强制要求,服务端无需仅因为监听了某地址端口的TCP就必须监听UDP,因此UDP到TCP的切换可无缝实现,反向切回UDP也不存在兼容性障碍
内容的提问来源于stack exchange,提问作者Haphil
相关产品推荐
相关产品推荐

