SIP协议、linphone学习(二)

协议相关术语解释

基础核心概念

字段 说明
消息(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)

  1. 基础格式
  • 通用格式:头域名: 头域值;冒号前后可加空格,工程推荐「域名:单个空格 + 值」最简写法。
  • 支持多行折叠:换行后开头加空格 / TAB,系统会自动合并为一行。
  • 同个头域多个值:可用逗号合并写在一行;部分特殊鉴权头域不能合并,必须分行。
  • 带参数格式:头域值;参数名=参数值,同个头域内参数名唯一不重复。
  • 大小写规则:域名、常规参数大小写不敏感;引号内字符串、提示描述区分大小写。
  1. 头域分类

    部分头域仅请求生效、或仅应答生效;若消息里出现不匹配的头域,直接忽略不处理。

  2. 缩写机制

    SIP 支持头域名缩写,减少 UDP 传输时报文过长、超出 MTU 限制的问题;设备必须同时兼容全称 + 缩写两种格式。

消息体(包体)

  • 请求 / 应答都可携带消息体,内容解读由「请求方法 + 状态码」决定。
  • Content-Type:必须标明消息体格式(最常用 SDP 会话描述)。
  • Content-Encoding:标注是否压缩编码,无压缩则该字段无效。
  • 支持多部分 MIME、二进制内容;无特殊声明时,文本默认 UTF-8 编码。
  • Content-Length:标明消息体字节长度;SIP 不支持 HTTP 的 chunked 分块传输。

消息分帧

  • 可用 UDP 等不可靠传输,一条请求 / 应答就是一帧独立消息。
  • 基于 TCP 流式传输时,靠 Content-Length 判断消息结束位置,必须严格携带该字段。
  • 若对方不支持多部分消息,发送方需自动转为普通单段会话描述。
相关推荐
小手指动起来3 小时前
保姆级提示词工程学习总结(含实操示例+工具推荐)
人工智能·学习·自然语言处理
绛橘色的日落(。・∀・)ノ4 小时前
Matplotlib实践学习笔记
笔记·学习
chase。4 小时前
【学习笔记】AGILE:把人形机器人强化学习从“玄学”变成“工程学”
笔记·学习·敏捷流程
bu_shuo4 小时前
git练习学习网站【中文网站】
git·学习
EnglishJun5 小时前
ARM嵌入式学习(十四)--- IMX6ULL的I2C通信实现
arm开发·学习
_李小白5 小时前
【OSG学习笔记】Day 31: 渲染到纹理(RTT)
笔记·数码相机·学习
嵌入式小企鹅5 小时前
蓝牙学习系列(七):BLE GATT 数据模型详解
学习·蓝牙·ble·蓝牙协议栈·蓝牙开发·gatt
arvin_xiaoting6 小时前
OpenClaw学习总结_III_自动化系统_3:CronJobs详解
数据库·学习·自动化
少许极端6 小时前
算法奇妙屋(四十一)-贪心算法学习之路 8
学习·算法·贪心算法
arvin_xiaoting7 小时前
OpenClaw学习总结_III_自动化系统_2:Webhooks详解
运维·学习·自动化