协议之SIP介绍

发布时间:2026/9/27 16:22:17

协议之SIP介绍
SIP 是一个应用层控制协议用于建立、修改和终止多媒体会话如语音通话、视频会议。它采用请求-响应模式默认使用UDP 5060端口。一、SIP URL 格式sip:[username[:password]]host[:port][/path] 示例: sip:aliceexample.com sip:bob:secret192.168.1.100:5060 sip:carolexample.com:5061/call解析源码Boolean parseSIPURL(UsageEnvironment env, char const* url, NetAddress address, portNumBits portNum) { // 1. 检查协议前缀 char const* prefix sip:; if (_strncasecmp(url, prefix, 4) ! 0) { env.setResultMsg(URL is not of the form \sip:\); return False; } // 2. 跳过用户名密码部分寻找 符号 unsigned addressStartIndex 4; while (url[addressStartIndex] ! \0 url[addressStartIndex] ! ) {} // 3. 解析服务器地址支持 IPv4 和 IPv6 // ... 解析主机名或IP地址 // 4. 解析端口号默认5060 portNum 5060; if (*from :) { sscanf(from, %d, portNumInt); portNum (portNumBits)portNumInt; } }二、SIP 请求格式2.1 常用函数方法作用REGISTER终端向注册服务器注册位置INVITE发起通话会话ACK确认 INVITE 最终响应完成会话建立BYE挂断通话释放会话CANCEL取消未完成的 INVITE 呼叫OPTIONS探测对方服务能力REFER呼叫转移NOTIFY / SUBSCRIBE事件订阅通话状态、消息请求格式Method Request-URI SIP/2.0\r\nMethodSIP 请求方法核心 6 种Request-URI被叫 SIP 地址sip:userip:port版本固定SIP/2.02.2 INVITE 请求建立会话┌─────────────────────────────────────────────────────────────────┐ │ SIP INVITE 请求 │ ├─────────────────────────────────────────────────────────────────┤ │ INVITE sip:aliceexample.com SIP/2.0 │ ← 请求行 │ From: bob sip:bob192.168.1.10;tag12345 │ ← 发起者 │ Via: SIP/2.0/UDP 192.168.1.10:5060 │ ← 路由信息 │ Max-Forwards: 70 │ ← 最大转发数 │ To: sip:aliceexample.com │ ← 接收者 │ Contact: sip:bob192.168.1.10:5060 │ ← 联系地址 │ Call-ID: 98765192.168.1.10 │ ← 会话标识 │ CSeq: 1 INVITE │ ← 序列号 │ Content-Type: application/sdp │ ← 内容类型 │ Authorization: Digest usernamebob, realm..., ... │ ← 认证信息 │ User-Agent: LIVE555 Streaming Media v2026.07.04 │ ← 用户代理 │ Content-Length: 256 │ ← 内容长度 │ │ │ v0 │ ← SDP 开始 │ o- 12345 67890 IN IP4 192.168.1.10 │ │ sLIVE555 session │ │ cIN IP4 192.168.1.10 │ │ t0 0 │ │ maudio 1234 RTP/AVP 0 │ │ artpmap:0 PCMU/8000 │ └─────────────────────────────────────────────────────────────────┘2.3 ACK请求确认会话建立ACK sip:aliceexample.com SIP/2.0 From: bob sip:bob192.168.1.10;tag12345 Via: SIP/2.0/UDP 192.168.1.10:5060 Max-Forwards: 70 To: sip:aliceexample.com;tag67890 Call-ID: 98765192.168.1.10 CSeq: 1 ACK Content-Length: 02.4 BYE请求终止会话BYE sip:aliceexample.com SIP/2.0 From: bob sip:bob192.168.1.10;tag12345 Via: SIP/2.0/UDP 192.168.1.10:5060 Max-Forwards: 70 To: sip:aliceexample.com;tag67890 Call-ID: 98765192.168.1.10 CSeq: 2 BYE Content-Length: 0三、SIP响应格式3.1 响应格式SIP/2.0 Status-Code Reason-Phrase\r\nStatus-Code3 位数字状态码分 6 大类Reason-Phrase可读描述文本┌─────────────────────────────────────────────────────────────────┐ │ SIP 响应格式 │ ├─────────────────────────────────────────────────────────────────┤ │ SIP/2.0 200 OK │ ← 状态行 │ Via: SIP/2.0/UDP 192.168.1.10:5060 │ ← 路由信息 │ From: bob sip:bob192.168.1.10;tag12345 │ │ To: sip:aliceexample.com;tag67890 │ ← 包含 To-Tag │ Call-ID: 98765192.168.1.10 │ │ CSeq: 1 INVITE │ │ Contact: sip:alice192.168.1.20:5060 │ │ Content-Type: application/sdp │ │ Content-Length: 312 │ │ │ │ v0 │ ← SDP 响应 │ o- 67890 12345 IN IP4 192.168.1.20 │ │ sAlices Session │ │ cIN IP4 192.168.1.20 │ │ t0 0 │ │ maudio 5000 RTP/AVP 0 │ │ artpmap:0 PCMU/8000 │ └───────────────────────────────────────────────────────────────┘3.2 响应状态码分类1xx 临时响应处理中100 Trying 正在处理180 Ringing 对方振铃183 Session Progress 媒体提前打通2xx 成功响应200 OK 操作成功注册、接听、挂断都返回3xx 重定向302 Moved Temporarily 临时转移分机4xx 客户端错误403 Forbidden 禁止访问404 Not Found 号码不存在486 Busy Here 对方忙线5xx 服务器错误500 Server Internal Error 服务器异常6xx 全局失败603 Decline 对方拒绝接听响应解析逻辑getResponseCode函数unsigned getResponseCode() { unsigned responseCode 0; // 1. 读取响应数据 char readBuffer[10001]; unsigned bytesRead getResponse(readBuffer, 10000); // 2. 解析第一行获取状态码 char* firstLine readBuffer; nextLineStart getLine(firstLine); sscanf(firstLine, %*s%u, responseCode); // 提取状态码 // 3. 解析头部字段 while (lineStart ! NULL) { // 查找 To-Tag if (sscanf(lineStart, To:%*[^;]; tag%s, toTagStr) 1) { fToTagStr strDup(toTagStr); } // 查找 Content-Length if (sscanf(lineStart, Content-Length: %d, contentLength) 1) { // ... } } // 4. 获取 SDP 响应体 if (contentLength 0) { bodyStart[contentLength] \0; fInviteSDPDescriptionReturned strDup(bodyStart); } return responseCode; }四、核心说明4.1 字段说明字段作用说明From发起者标识包含用户名、地址和From-TagTo接收者标识包含地址响应中包含To-TagVia路由路径记录请求经过的代理服务器Call-ID会话唯一标识全局唯一用于关联同一会话的所有消息CSeq命令序列号每个请求递增用于排序和去重Contact联系地址用于后续通信的直接地址Max-Forwards最大转发数防止消息无限循环Content-Type内容类型通常为application/sdpAuthorization认证信息Digest 或 Basic 认证1. Via 路由传输头防环路、响应回传记录报文经过的每一跳代理服务器响应按 Via 逆序原路返回。 格式plaintextVia: SIP/2.0/UDP 192.168.1.200:5060;branchz9hG4bK123456UDP传输层协议branch事务唯一标识同一呼叫事务 branch 相同多跳会出现多条 Via从上到下是传输顺序2. From 主叫标识呼叫发起方带tag用于区分会话分支plaintextFrom: 张三 sip:1001192.168.1.100;tagabc1233. To 被叫目标用户早期振铃阶段无 tag200OK 响应会携带 tagplaintextTo: sip:1002192.168.1.1004. Call-ID 全局会话唯一标识整条通话全程不变主叫 被叫共享同一个 Call-IDplaintextCall-ID: 887654321192.168.1.2005. CSeq 事务序列号格式数字 Method同一呼叫递增区分不同事务plaintextCSeq: 1 INVITE CSeq: 2 BYE四元组Call-ID From.tag To.tag CSeq唯一标识一条 SIP 对话Dialog6. Contact 联系地址终端实际接收媒体 / 信令的地址通话媒体路由关键plaintextContact: sip:1001192.168.1.200:5060;transportudp7. Max-Forwards 最大跳数限制代理转发次数每经过一台代理减 1到 0 丢弃防止环路plaintextMax-Forwards: 708. Content-Type / Content-Length消息体描述Content-Type消息体格式通话时固定application/sdpContent-Length消息体字节长度0 代表无消息体plaintextContent-Type: application/sdp Content-Length: 1424.2 SIP INVITE状态机RFC 3261 定义的 INVITE 客户端状态机┌──────────┐ │ Calling │◄─────────────────────────────────┐ └────┬─────┘ │ │ 1xx │ ▼ │ ┌──────────┐ │ │Proceeding │ │ └────┬─────┘ │ │ 2xx │ ▼ │ ┌──────────┐ │ │Terminated│◄────────────────────────────────┤ └──────────┘ │ ^ │ │ 4xx/5xx/6xx │ │ │ ┌────┴─────┐ │ │Completed │─────────────────────────────────┤ └────┬─────┘ Timer D expires │ │ │ │ ACK │ ▼ │ ┌──────────┐ │ │Terminated│─────────────────────────────────┘ └──────────┘定时器机制定时器作用超时时间Timer AINVITE 重传定时器初始 500ms每次加倍Timer B事务超时定时器64 × T1约 32 秒Timer D等待 ACK 确认定时器32 秒五、示例5.1 sip SDP会话描述SIP INVITE 请求携带 SDPSession Description Protocol描述媒体参数// SDP 格式live555 构建 char const* const inviteSDPFmt v0\r\n // 版本 o- %u %u IN IP4 %s\r\n // 所有者信息 s%s session\r\n // 会话名称 cIN IP4 %s\r\n // 连接信息 t0 0\r\n // 时间范围 maudio %u RTP/AVP %u\r\n // 媒体描述 %s; // rtpmap 行可选 // 示例输出 v0 o- 12345 67890 IN IP4 192.168.1.10 sLIVE555 session cIN IP4 192.168.1.10 t0 0 maudio 1234 RTP/AVP 0 artpmap:0 PCMU/8000SDP 媒体行结构m媒体类型 端口 传输协议 负载类型列表 示例: maudio 1234 RTP/AVP 0 // PCMU 音频端口 1234 mvideo 5000 RTP/AVP 96 // H.264 视频动态负载类型5.2Digest 认证RFC 2617认证流程客户端发送 INVITE无认证服务器返回401 Unauthorized包含Proxy-Authenticate头realm、nonce客户端计算 Digest 响应重新发送带认证的 INVITE服务器验证通过返回200 OK

相关新闻

Java面试通关⑯:JVM虚拟机核心全集

Java面试通关⑯:JVM虚拟机核心全集

2026/9/27 16:19:45

📖 前言导读 JVM是Java底层核心、中高级面试终极难点、薪资分水岭模块,大厂二面三面必深挖内存模型、GC原理、垃圾收集器、类加载、JVM调优、OOM故障排查。多数开发者只会写业务代码,完全不懂JVM底层,无法应答调优与底层原理提问…

第三章:C 语言基础概念 —— 变量与数据类型

第三章:C 语言基础概念 —— 变量与数据类型

2026/9/27 16:19:02

前言欢迎来到第三章!在上一章中,我们认识了一个 C 程序的完整结构:头文件、主函数、语句。但我们写的程序都是 "固定的"—— 输出什么内容在写代码的时候就定死了。如果我想让程序 "记住" 一些东西呢?比如用户…

如何快速搭建企业级后台管理系统?Layui-Admin终极指南

如何快速搭建企业级后台管理系统?Layui-Admin终极指南

2026/8/23 1:07:53

如何快速搭建企业级后台管理系统?Layui-Admin终极指南 【免费下载链接】layui-admin 基于layui2.x的带后台的通用管理系统 项目地址: https://gitcode.com/gh_mirrors/la/layui-admin 还在为搭建后台管理系统而烦恼吗?😫 面对复杂的权…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/26 19:14:12

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/27 1:30:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/27 1:30:37

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/27 1:30:35

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/27 1:30:34

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/26 16:36:51

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/26 14:29:04

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/26 13:57:22

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/26 23:35:16

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…