手把手调试:用Wireshark抓包分析SIP REFER实现呼叫转移的完整流程(含NOTIFY消息解读)
手把手调试用Wireshark抓包分析SIP REFER实现呼叫转移的完整流程含NOTIFY消息解读在VoIP和实时通信系统中SIPSession Initiation Protocol作为核心信令协议其REFER方法在实现呼叫转移功能中扮演着关键角色。本文将带您深入实战通过Wireshark抓包工具逐步解析基于REFER方法的完整呼叫转移流程特别关注NOTIFY消息中的关键信息。无论您是部署FreeSWITCH、Asterisk等SIP服务器的工程师还是开发SIP客户端的技术人员这份指南都将成为您调试过程中的实用手册。1. 测试环境搭建与基础配置在开始抓包分析前我们需要搭建一个可控的测试环境。推荐使用两台支持SIP协议的硬件话机或软电话如Linphone、MicroSIP配合一个SIP服务器如FreeSWITCH构成三角测试架构。环境配置要点确保所有设备在同一局域网内避免NAT带来的复杂性为每台话机分配独立的SIP账号如1001和1002在SIP服务器上启用呼叫转移功能关闭不必要的加密如TLS以简化初始分析提示测试前建议关闭防火墙或配置放行5060端口SIP默认端口2. Wireshark抓包准备与SIP流量过滤启动Wireshark后选择正确的网络接口通常是连接SIP服务器的网卡。为高效捕获SIP流量可使用以下过滤表达式sip || udp.port 5060关键抓包技巧开始捕获后在话机A1001上呼叫话机B1002通话建立后在话机A上发起向第三方号码如1003的呼叫转移停止捕获保存为call_transfer.pcapngWireshark实用配置启用Resolve network addresses方便识别设备在Telephony VoIP Calls中可重构整个呼叫流程使用Follow UDP Stream查看完整消息交换3. REFER消息流逐包解析一个典型的REFER呼叫转移流程包含以下关键消息序列初始INVITE话机A呼叫话机B200 OK建立初始会话REFER请求话机A发起转移请求202 Accepted话机B接受请求触发INVITE话机B呼叫目标号码NOTIFY序列状态通知3.1 REFER请求关键头域分析以下是一个典型的REFER请求示例REFER sip:1002192.168.1.100 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.101:5060;branchz9hG4bK74gh5 Max-Forwards: 70 To: sip:1002192.168.1.100;tagas5d8f7g6 From: sip:1001192.168.1.100;tag76a5s4d3f Call-ID: a1b2c3d4e5192.168.1.101 CSeq: 20 REFER Refer-To: sip:1003192.168.1.100 Referred-By: sip:1001192.168.1.100 Content-Length: 0关键头域说明头域必选说明Refer-To是指定转移目标URIReferred-By否标识转移发起方Event否用于多REFER时的订阅区分Refer-Sub否控制是否创建隐式订阅3.2 202 Accepted与隐式订阅REFER响应中的202 Accepted表示请求已被接受但处理尚未完成。此时会建立隐式订阅随后会收到NOTIFY消息NOTIFY sip:1001192.168.1.101 SIP/2.0 Event: refer;id1 Subscription-State: active;expires60 Content-Type: message/sipfrag Content-Length: 18 SIP/2.0 100 Trying4. NOTIFY消息深度解读NOTIFY消息携带了触发请求的状态信息其消息体通常为message/sipfrag类型包含SIP响应片段。典型NOTIFY消息示例NOTIFY sip:1001192.168.1.101 SIP/2.0 Via: SIP/2.0/UDP 192.168.1.100:5060;branchz9hG4bK23d4f5g6 Max-Forwards: 70 To: sip:1001192.168.1.101;tag76a5s4d3f From: sip:1002192.168.1.100;tagas5d8f7g6 Call-ID: a1b2c3d4e5192.168.1.101 CSeq: 15 NOTIFY Event: refer;id1 Subscription-State: terminated;reasonnoresource Content-Type: message/sipfrag Content-Length: 25 SIP/2.0 200 OK关键点解析Subscription-State指示订阅状态terminated表示订阅结束message/sipfrag包含触发INVITE的最终响应Event头域在多REFER场景下区分不同订阅5. 常见问题排查指南在实际部署中REFER流程可能遇到各种问题。以下是一些典型故障及排查方法问题1REFER请求被拒绝检查Refer-To头域格式是否正确验证SIP服务器是否支持REFER方法查看是否有Require头域冲突问题2未收到NOTIFY消息确认没有设置Refer-Sub: false检查网络是否允许NOTIFY消息通过验证Subscription-State是否被正确处理问题3触发INVITE失败分析NOTIFY中的sipfrag内容检查Refer-To URI是否可达验证目标号码是否已正确注册调试技巧在FreeSWITCH中启用高级日志sofia global siptrace on使用sngrep工具实时监控SIP消息流sngrep -d eth0 -O call_transfer.pcap6. 高级应用咨询转移实现REFER方法结合Replaces头域可以实现更复杂的咨询转移功能。基本流程如下话机A与话机B建立通话话机A呼叫话机C咨询通话话机A向话机B发送REFERRefer-To包含Replaces信息话机B直接与话机C建立通话话机A退出会话关键头域示例Refer-To: sip:1003192.168.1.100?Replaces12345%40192.168.1.101%3Bto-tag%3Dabcd%3Bfrom-tag%3D5678这种模式下Replaces头域携带了原始会话的标识信息使话机B能够无缝接管会话。