协议相关术语解释
基础核心概念
| 字段 | 说明 |
|---|---|
| 消息(Message) | SIP组件之间传递的协议数据,分为两种------请求(客户端发给服务器)和应答(服务器回复客户端),是SIP通信的基础。 |
| 方法(Method) | 请求消息中携带的"功能指令",告诉服务器要执行什么操作,最常用的是INVITE(发起呼叫)、BYE(结束通话)、REGISTER(注册地址)。 |
| 头域(Header) | SIP消息头部的"信息区",包含一堆头域字段,用来描述消息的详细信息(比如收发方地址、呼叫标识等)。 |
| 头域字段(Header Field) | 头域里的具体字段,由"字段名+字段值"组成,部分字段可包含多个值(用逗号分隔),部分字段只能有一个值。 |
| 头域值(Header Field Value) | 头域字段对应的具体内容,一个字段可包含0个或多个值。 |
| 会话(Session) | 简单说就是"一次完整的多媒体通信",比如一次网络电话、一场视频会议,由发送方、接收方和他们之间的媒体流(语音、视频)组成。 |
核心组件(逻辑实体,非物理设备)
| 字段 | 说明 |
|---|---|
| 客户端(Client) | 主动发送SIP请求、接收应答的网络元素,比如用户代理客户端(UAC)、代理服务器,不一定需要和人交互。 |
| 服务器(Server) | 接收SIP请求、处理后发送应答的网络元素,常见的有代理服务器、用户代理服务端(UAS)、注册服务器、重定向服务器。 |
| 用户代理(User Agent, UA) | 包含UAC和UAS的逻辑实体,可切换角色------发起请求时是UAC,接收请求时是UAS(比如我们用的软电话、SIP话机,本质就是UA)。 |
| 用户代理客户端(UAC) | UA的"发起请求"角色,负责创建并发送SIP请求(比如拨打呼叫时,你的软电话就是UAC),角色仅在单次事务中存在。 |
| 用户代理服务端(UAS) | UA的"接收应答"角色,负责处理收到的SIP请求,回复接受、拒绝或转发(比如接收呼叫时,对方的话机就是UAS),角色仅在单次事务中存在。 |
| UAC核心(UAC Core) | UAC的核心功能集合,运行在事务层和传输层之上,负责遵循UAC的请求规则。 |
| UAS核心(UAS Core) | UAS的核心功能集合,运行在事务层和传输层之上,负责遵循UAS的应答规则。 |
| 核心(Core) | 定义SIP实体的类别(比如有状态/无状态代理、UA、注册服务器),除无状态代理外,所有核心都是事务用户。 |
| 代理服务器(Proxy/Proxy Server) | 中间转发设备,既做客户端(接收请求)也做服务器(转发请求),核心作用是"路由"------把请求转发到更靠近目标用户的地方,还能执行一些规则(比如判断用户是否有权呼叫)。 |
| 有状态代理服务器(Stateful Proxy) | 转发请求时,会保存事务的状态(比如请求是否已转发、是否收到应答),遵循事务状态机,和"呼叫有状态代理"不是一回事。 |
| 无状态代理服务器(Stateless Proxy) | 转发请求时,不保存任何事务状态,收到请求/应答后直接转发,不做额外处理。 |
| 注册服务器(Registrar) | 专门接收REGISTER请求的服务器,会把用户的"公共地址"和"实际物理地址"绑定,存入定位服务库,方便代理服务器查找用户位置。 |
| 重定向服务器(Redirect Server) | 一种UAS,收到请求后不转发,而是返回3xx应答,告诉客户端"请连接其他地址"。 |
| 背对背用户代理(Back-to-Back User Agent, B2BUA) | 特殊逻辑实体,既像UAS接收请求,又像UAC发起请求,和代理服务器的区别是------它会保存对话状态,参与通话全程的所有请求,相当于"中间桥梁"。 |
| 对外代理服务器(Outbound Proxy) | 用户手动或自动配置的"默认代理",无论请求的目标地址是什么,都会先发送到这台代理服务器,再由它转发。 |
会话与呼叫相关
| 字段 | 说明 |
|---|---|
| 呼叫(Call) | 非正式术语,指两端设备之间的通信过程,通常用来建立多媒体对话(比如"一次呼叫"就是一次完整的拨打电话、接听、挂断流程)。 |
| 对话(Dialog) | 两个UA之间持续一段时间的端到端SIP连接,由INVITE请求和2xx应答建立,用Call-ID(呼叫标识)、本地tag、对方tag唯一标识(之前叫"Call Leg")。 |
| 呼叫方(Initiator/Calling Party/Caller) | 用INVITE请求发起会话的一方,从发起呼叫到会话结束,一直是这个角色(比如小夏拨打小杨,小夏就是呼叫方)。 |
| 被叫方(Invitee/Called Party/Callee) | 收到INVITE请求并建立会话的一方,从收到呼叫到会话结束,一直是这个角色(比如小杨接听小夏的呼叫,小杨就是被叫方)。 |
| 会议(Conference) | 多个人参与的多媒体会话(比如多人视频会议),本质是多端之间的会话集合。 |
| 回铃音(Ringback) | 给呼叫方的提示音,告诉呼叫方"被叫方正在振铃",比如我们拨打电话时听到的"嘟...嘟..."声。 |
请求与应答相关
| 字段 | 说明 |
|---|---|
| 请求(Request) | 客户端发给服务器的SIP消息,目的是让服务器执行特定功能(比如INVITE请求就是"请求对方接听电话")。 |
| 应答(Response) | 服务器发给客户端的SIP消息,告诉客户端"请求处理情况"(比如200 OK就是"请求成功,已接听")。 |
| 临时应答(Provisional Response/Informational Response) | 服务器用来提示"正在处理请求"的应答,不结束事务,只有1xx开头的应答(比如100 Trying、180 Ringing)。 |
| 终结应答(Final Response) | 结束SIP事务的应答,包括2xx(成功)、3xx(重定向)、4xx(客户端错误)、5xx(服务器错误)、6xx(全局错误)。 |
| SIP事务(SIP Transaction) | 客户端和服务器之间的一次完整"请求-应答"过程------从客户端发第一个请求,到服务器发最后一个终结应答(非1xx)。特殊情况:INVITE请求若收到非2xx应答,还需加一个ACK应答;INVITE请求收到2xx应答后,ACK应答是独立事务。 |
| 常规事务(Regular Transaction) | 不包含INVITE、ACK、CANCEL方法的事务(比如BYE、REGISTER请求对应的事务)。 |
| 取消请求(CANCEL) | 用来终止正在处理的事务,让服务器回滚到事务开始前的状态,并返回错误报告,本身也是一个独立事务。 |
定位与路由相关
| 字段 | 说明 |
|---|---|
| 记录地址(Address-of-Record, AOR) | 用户的"公共地址",是一个SIP/SIPS URI,指向有定位服务的主机,能把这个公共地址映射到用户的实际物理地址(比如sip:yang@biloxi.com就是小杨的AOR)。 |
| 定位服务(Location Service) | 代理服务器用来查找被叫方位置的"地址库",里面存着AOR和用户实际地址的绑定关系,可通过REGISTER请求更新。 |
| 宿主机(Home Domain) | 提供SIP服务的主机,通常是AOR中URI里的主机(比如小杨AOR中的biloxi.com,就是他的宿主机)。 |
| 路由集(Route Set) | 一串有序的SIP/SIPS URI,描述请求需要经过的代理服务器列表,可通过Record-Route头域自动生成,或手动配置。 |
| 严格路由(Strict Routing) | 用户的"公共地址",是一个SIP/SIPS URI,指向有定位服务的主机,能把这个公共地址映射到用户的实际物理地址(比如sip:yang@biloxi.com就是小杨的AOR)。 |
| 目标刷新请求(Target Refresh Request) | 在对话中发送的请求,用来修改对话的目标地址(比如通话中切换被叫方地址)。 |
| 上行流(Upstream) | 事务中消息的传递方向,特指从UAS(被叫方)向UAC(呼叫方)发送应答的方向。 |
| 下行流(Downstream) | 事务中消息的传递方向,特指从UAC(呼叫方)向UAS(被叫方)发送请求的方向。 |
SIP消息
SIP 是基于文本的协议,采用 UTF-8 字符集编码。
整条消息只分两类:客户端→服务器的请求消息、服务器→客户端的应答消息。
两者格式都参考 RFC2822,结构统一:起始行 + 若干头域 + 空行 + 可选消息体。
固定规范:起始行、每个头域、末尾空行,都必须用 CRLF 换行;哪怕没有消息体,空行也不能省。
补充:SIP 头域很多和 HTTP/1.1 相似,但SIP 不是 HTTP 的子集或扩展。
请求消息
请求靠 ** 请求行(Request-Line)** 区分,格式固定:
方法 + 空格 + Request-URI + 空格 + 协议版本 + CRLF
核心说明
- 方法(Method)
标准 6 种基础方法:
| 方法名 | 说明 |
|---|---|
| REGISTER | 上报地址、完成账号注册 |
| INVITE | 发起会话 / 呼叫 |
| ACK | 确认会话建立 |
| CANCEL | 取消未完成的呼叫 |
| BYE | 结束通话 / 会话 |
| OPTIONS | 查询对方设备 / 服务器能力后续可通过 RFC 扩展新增方法。 |
- Request-URI
标记目标用户 / 服务的地址,支持 SIP/SIPS/tel 等格式;禁止带空格、控制字符,不能用 <> 包裹。设备可自动把非 SIP 地址转成标准 SIP 地址。 - SIP 版本
所有交互统一用 SIP/2.0,协议字段大小写不敏感,工程实现建议大写。
应答消息
应答靠 ** 状态行(Status-Line)** 区分,格式固定:
协议版本 + 空格 + 3位状态码 + 空格 + 原因描述 + CRLF
核心说明
- 状态码(3 位数字):给程序自动识别处理
- 原因短语:给人看的文字说明,客户端可自定义展示
6 大类应答(按首位数字划分)
| 应答类型 | 说明 |
|---|---|
| 1xx 临时应答 | 请求已收到,正在处理(如 100 Trying、180 Ringing) |
| 2xx 成功应答 | 请求正常处理完成(如 200 OK) |
| 3xx 重定向应答 | 需跳转其他地址完成请求 |
| 4xx 客户端错误 | 请求格式 / 内容有误,本机无法处理 |
| 5xx 服务器错误 | 请求合法,但服务器自身故障处理失败 |
| 6xx 全局拒绝 | 所有节点都无法受理该请求 |
头域(Header)
- 基础格式
- 通用格式:头域名: 头域值;冒号前后可加空格,工程推荐「域名:单个空格 + 值」最简写法。
- 支持多行折叠:换行后开头加空格 / TAB,系统会自动合并为一行。
- 同个头域多个值:可用逗号合并写在一行;部分特殊鉴权头域不能合并,必须分行。
- 带参数格式:头域值;参数名=参数值,同个头域内参数名唯一不重复。
- 大小写规则:域名、常规参数大小写不敏感;引号内字符串、提示描述区分大小写。
-
头域分类
部分头域仅请求生效、或仅应答生效;若消息里出现不匹配的头域,直接忽略不处理。
-
缩写机制
SIP 支持头域名缩写,减少 UDP 传输时报文过长、超出 MTU 限制的问题;设备必须同时兼容全称 + 缩写两种格式。
消息体(包体)
- 请求 / 应答都可携带消息体,内容解读由「请求方法 + 状态码」决定。
- Content-Type:必须标明消息体格式(最常用 SDP 会话描述)。
- Content-Encoding:标注是否压缩编码,无压缩则该字段无效。
- 支持多部分 MIME、二进制内容;无特殊声明时,文本默认 UTF-8 编码。
- Content-Length:标明消息体字节长度;SIP 不支持 HTTP 的 chunked 分块传输。
消息分帧
- 可用 UDP 等不可靠传输,一条请求 / 应答就是一帧独立消息。
- 基于 TCP 流式传输时,靠 Content-Length 判断消息结束位置,必须严格携带该字段。
- 若对方不支持多部分消息,发送方需自动转为普通单段会话描述。