19. 通用消息组件 (Common Message Components)
SIP消息的某些组件出现在SIP消息的各个位置(有时甚至在消息外部),值得单独讨论。
19.1 SIP和SIPS统一资源标识符
SIP或SIPS URI标识通信资源。像所有URI一样,SIP和SIPS URI可以放置在网页、电子邮件或印刷文献中。它们包含足够的信息来发起和维护与资源的通信会话。
通信资源示例
- 在线服务的用户
- 多线电话上的外观
- 消息系统上的邮箱
- 网关服务上的PSTN号码
- 组织中的组(如"sales"或"helpdesk")
SIPS URI: 指定资源应该安全地联系。这特别意味着在UAC和拥有URI的域之间使用TLS。
19.1.1 SIP和SIPS URI组件
一般形式:
sip:user:password@host:port;uri-parameters?headers
组件说明:
- user: 被寻址主机的特定资源标识符
- password: 与用户关联的密码(不推荐使用)
- host: 提供SIP资源的主机(FQDN或IP地址)
- port: 发送请求的端口号
- uri-parameters: 影响从URI构造的请求的参数
- headers: 要包含在请求中的头字段
常见URI参数:
transport: 传输机制(udp/tcp/sctp/tls)maddr: 要联系的服务器地址ttl: 多播的生存时间user: 用户参数(phone/ip)method: 要使用的SIP方法lr: 松散路由标志
19.1.2 字符转义要求
SIP URI遵循RFC 2396的转义规则。某些字符必须使用%编码进行转义。
19.1.3 SIP和SIPS URI示例
sip:[email protected]
sip:alice:[email protected];transport=tcp
sips:[email protected]?subject=project%20x&priority=urgent
sip:+1-212-555-1212:[email protected];user=phone
sip:[email protected]
sip:atlanta.com;method=REGISTER?to=alice%40atlanta.com
sip:alice;[email protected]
19.1.4 URI比较
URI比较用于多种场景。SIP和SIPS URI比较规则:
1. URI方案比较(不区分大小写) 2. 用户部分比较(区分大小写) 3. 密码比较(区分大小写) 4. 主机比较(不区分大小写) 5. 端口比较(数值比较) 6. 参数比较(参数名不区分大小写,值通常区分大小写) 7. 头字段比较(名称不区分大小写)
19.1.5 从URI构造请求
从SIP或SIPS URI构造请求:
- URI成为Request-URI
- 如果URI包含maddr参数,它用于确定目的地
- 如果URI包含头字段,它们添加到请求
- URI参数影响请求的构造
19.1.6 关联SIP URI和tel URL
SIP URI可以包含电话号码。tel URL(RFC 2806)可以转换为SIP URI:
- tel URL的电话用户部分放入SIP URI的用户部分
- 添加
user=phone参数 - 主机部分设置为网关或服务域
示例:
tel:+1-212-555-1212
转换为
sip:[email protected];user=phone
19.2 选项标签 (Option Tags)
选项标签是唯一标识符,用于指定SIP扩展。它们在以下头字段中使用:
- Require: 请求必须支持的扩展
- Proxy-Require: 代理必须支持的扩展
- Supported: 表示支持的扩展
- Unsupported: 表示不支持的扩展
选项标签特点:
- 不区分大小写
- 必须是IANA注册的
- 用于向后兼容性和扩展性
19.3 标签 (Tags)
标签是不透明字符串,用于在对话中标识UA。
使用位置:
- From头字段的tag参数
- To头字段的tag参数
作用:
- 与Call-ID一起唯一标识对话
- UAC在From头字段中生成tag
- UAS在To头字段中生成tag
- 标签在对话的整个生命周期内保持不变
示例:
From: Alice <sip:[email protected]>;tag=1928301774
To: Bob <sip:[email protected]>;tag=a6c85cf
URI参数详解
| 参数 | 说明 | 示例值 |
|---|---|---|
| transport | 传输协议 | udp, tcp, sctp, tls |
| maddr | 多播地址 | 239.255.255.1 |
| ttl | 多播TTL | 1 |
| user | 用户类型 | phone, ip |
| method | SIP方法 | REGISTER, INVITE |
| lr | 松散路由 | (无值) |
SIP URI vs SIPS URI
| 特性 | SIP URI | SIPS URI |
|---|---|---|
| 方案 | sip: | sips: |
| 安全性 | 可选 | 强制TLS |
| 默认端口 | 5060 | 5061 |
| 传输 | 任意 | 必须可靠 |
| 用途 | 一般通信 | 安全通信 |
URI比较示例
相等:
sip:[email protected]
SIP:[email protected]
sip:[email protected]
不相等:
sip:[email protected]
sip:[email protected] (用户部分区分大小写)
相等:
sip:[email protected]:5060
sip:[email protected] (5060是默认端口)
相等:
sip:[email protected];transport=udp
sip:[email protected];Transport=UDP (参数名不区分大小写)
关键要点
- SIP URI标识通信资源,可以是用户、组、网关等
- SIPS URI提供安全通信,强制使用TLS
- URI参数影响请求构造,如transport、maddr
- URI比较规则复杂,某些部分区分大小写,某些不区分
- 选项标签支持SIP扩展,实现向后兼容
- 标签唯一标识对话参与者,与Call-ID配合使用
- tel URL可转换为SIP URI,用于电话号码集成
本章小结:
第19章描述了SIP消息中的通用组件,重点是SIP和SIPS URI的结构、语法和使用。SIP URI是协议的基础,用于标识和定位通信资源。本章还涵盖了选项标签(用于扩展性)和标签(用于对话标识)。理解URI的结构和比较规则对于正确实现SIP应用至关重要。