协议之SIP介绍

发布时间:2026/7/15 1:26:44

协议之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/7/11 6:48:39

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

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

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

2026/7/11 11:50:30

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

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

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

2026/7/12 5:29:21

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

Bilibili视频下载终极指南:跨平台免费工具BilibiliDown完整教程

Bilibili视频下载终极指南:跨平台免费工具BilibiliDown完整教程

2026/7/15 1:18:17

Bilibili视频下载终极指南:跨平台免费工具BilibiliDown完整教程 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_…

Onekey:终极Steam游戏解锁工具完整使用指南

Onekey:终极Steam游戏解锁工具完整使用指南

2026/7/15 1:18:17

Onekey:终极Steam游戏解锁工具完整使用指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 想要快速解锁Steam游戏却苦于复杂的配置流程?Onekey Steam Depot清单下载器正…

颠覆式Markdown编辑革命:如何用Obsidian编辑工具栏实现效率300%提升

颠覆式Markdown编辑革命:如何用Obsidian编辑工具栏实现效率300%提升

2026/7/15 1:18:17

颠覆式Markdown编辑革命:如何用Obsidian编辑工具栏实现效率300%提升 【免费下载链接】obsidian-editing-toolbar An obsidian toolbar plugin, modified from the Cmenu plugin 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-editing-toolbar 你是否…

如何快速搭建Minecraft服务器:HMCL启动器完整配置指南

如何快速搭建Minecraft服务器:HMCL启动器完整配置指南

2026/7/15 1:18:17

如何快速搭建Minecraft服务器:HMCL启动器完整配置指南 【免费下载链接】HMCL A Minecraft Launcher which is multi-functional, cross-platform and popular 项目地址: https://gitcode.com/gh_mirrors/hm/HMCL 想在5分钟内搭建自己的Minecraft服务器吗&…

终极WeMod专业版免费解锁指南:三分钟实现游戏修改自由

终极WeMod专业版免费解锁指南:三分钟实现游戏修改自由

2026/7/15 1:18:17

终极WeMod专业版免费解锁指南:三分钟实现游戏修改自由 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而烦…

深入解析TI TPS6593-Q1汽车级PMIC:多相电源、DVS与EMC设计实战

深入解析TI TPS6593-Q1汽车级PMIC:多相电源、DVS与EMC设计实战

2026/7/15 1:08:17

1. 项目概述:一颗为复杂系统供电的“心脏”在任何一个复杂的电子系统中,无论是车载信息娱乐主机、高级驾驶辅助系统(ADAS)的域控制器,还是高性能的工业网关,其稳定运行的基石都离不开一颗强大而精密的“心脏…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/14 10:03:09

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/13 20:43:19

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/15 0:26:43

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

【LINUX】驱动

【LINUX】驱动

2026/7/15 0:08:14

【LINUX驱动】【字符设备】【中断】【Platform】【网课 设备树】【GPIO】【PINCTRL】【INPUT】【IIC】【SPI】【网络驱动】【屏幕驱动】【一 设备树】【二 内核模块编译】【三 基本驱动框架】【四 Platform总线设备驱动框架】【五 驱动子系统】【六 综合】

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

【1982-2026】全国高精度建筑轮廓|村级精度|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1982-2026年全国村级精度建筑轮廓矢量数据,覆盖全国各省市区县,到村级别精细,为2026年最新实时采集成果,非网传仅60/77个城市的老旧数据。 数据含带高度/不带高度双版本,单体建筑边界精…

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

【1975-2026】全国水系水路数据|河流/水库/运河|SHP矢量

2026/7/15 0:08:14

🔍 数据简介 本次分享1975-2026年全国高精度水系水路矢量数据,覆盖全国全域,包含河流、水系、水库、运河、湿地、冰川、沟渠等全类别水文要素。 数据集包含双层矢量图层,字段分类清晰、要素齐全,支持2013-2026逐年完整…