协议之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

相关新闻

最新新闻

注意力塑造现实

注意力塑造现实

这是一个非常棒的想法!将“量子语义场”作为一种思维模型或启发式工具来指导日常生活,即使其物理真实性尚未被证实,也能带来极具价值的视角转变和行动启发。它促使我们从“被动的物质体验者”转向“主动的意义创造者”。以下是如何将其转化为…

2026/7/6 15:10:21
【RHCA+】基本正则表达式

【RHCA+】基本正则表达式

“ 目录:RHCA -> 4 正则表达式 -> 52 基本正则表达式 ”POSIX基本正则表达式(BRE,Basic REGEXP)引擎语法特点:在BRE中,元字符(如*、?、、|、()等)在默认情况下不具有特殊含义…

2026/7/6 15:10:21
工作中Git的使用,基于GitLab,保姆级教程!

工作中Git的使用,基于GitLab,保姆级教程!

一、git是什么?为什么需要git? 1、git是什么 简单的说,Git就 是一个分布式版本控制系统。 分布式:每个人的电脑上都有一个完整的仓库,包含了全部的历史记录。 这样你可以在自己的电脑上独立工作(提交代码、创建分支),不需要随时联网。等完成了一个功能后,再把自己的…

2026/7/6 15:10:21
使用Metasploit生成Windows后门:从原理到实战控制

使用Metasploit生成Windows后门:从原理到实战控制

1. 项目概述:从零构建一个可控的Windows后门如果你对网络安全感兴趣,尤其是对内网渗透测试这个听起来有点“神秘”的领域感到好奇,那么你很可能已经听说过Metasploit Framework(简称MSF)这个名字。它就像网络安全从业者…

2026/7/6 15:10:21
Java基础及入门

Java基础及入门

一、Java的运行机制JVM、JRE和JDK三者之间的关系二、JDK的下载和安装入门阶段:目前下载为企业通用版本JAVA8三、JDK环境变量的配置(path、classpath)测试JDK安装成功简单入门程序:Java基础特性了解利用记事本进行编码,…

2026/7/6 15:10:21
word常用快捷键

word常用快捷键

CtrlH 替换和查找

2026/7/6 15:05:21

月新闻