初识sip
本文跳过注册保活等基本操作,默认通话双方已注册且能呼叫
本文
复制粘贴参考:SIP 中的Dialog,call,session 和 transaction - 简书
Difference between session, dialog and transaction in SIP? - Stack Overflow
1 - 概述
SIP(Session initialization Protocol,会话初始协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。
它是一个基于文本的应用层控制协议,用于创建、修改和释放一个或多个参与者的会话。SIP
是一种源于互联网的IP 语音会话控制协议,具有灵活、易于实现、便于扩展等特点。SIP(Session Initiation
Protocol)是一种类似于http协议的纯文本应用层协议。SIP可以用来控制会话的建立、取消、关闭等操作。主要可以实现以下功能:
- 用户定位: 检查终端用户的位置,用于通信;
- 用户有效性: 检查用户参与会话的意愿程度;
- 用户能力: 检查媒体和媒体参数;
- 建立会话: “振铃”,在呼叫和被叫方同时建立会话的参数;
- 会话管理: 包括会话的传输和终止,修改会话参数以及请求服务
2 - request method
SIP REQUEST用以建立一段communication。为了补全这个communication的过程,无论成功或者失败,总会生成SIP RESPONSE以对应SIP REQUEST
在SIP的REQUEST中,核心的方法(CORE METHOD)定义了6种:INVITE、ACK、BYE、CANCEL、OPTIONS和REGISTER。
- INVITE消息用于发起一个新的会话;
- ACK消息用于完成会话的建立;
- BYE消息用于结束一个会话;
- CANCEL消息用于取消一个请求(一般是针对INVITE);
- OPTIONS消息用于查询服务器的能力;
- REGISTER消息用于发送注册请求消息。
SIP请求的类型,也称作SIP方法。RFC3261 中定义了六种方法(CORE METHOD)。另外八种方法(EXTEND METHOD)有独立的RFC扩展描述。如INFO、NOTIFY等等
METHOD也能被认为是REQUEST,它指明了对其他USER AGENT或者SERVER的具体行动
3 - SIP CALL 基本工作流
下面的图片描述了一段SIP call的基本工作流,目的是建立一段SIP session
下文REQUEST直接称作请求,RESPONSE直接称作回复
流程描述:
一个INVITE请求发出以初始化这段session (注意,session还未开始,后文详述)
Proxy立即回复一个100 Tring给caller(Alice),防止Alice重复发送INVITE请求
接着proxy寻找Bob的地址所在的服务器,之后在转发一次INVITE请求
接着callee(Bob)生成180 Ringing(临时回复)回复给caller(Alice)
在Bob接电话后其生成正式回复200 OK给Alice
Alice发送ACK报文给Bob以通知Bob她已接收到200 OK
就在这时session正式建立,session从这里开始
在这段session中,任意一个人都能主动挂断电话直接发送bye到对端结束session
Alice挂断电话,绕过proxy,直接发送bye给Bob
最后Bob发送200 OK确认by和终结session,此时session结束
上述流程完整的call也被称作dialog,一共有三个transaction(在图中1、2、3处)
transaction、dialog和session的区别下文揭示
bye相关:
下面链接描述了不能使用bye来结束未确立的invite;也说了bye是不通过proxy server,直接p2p联系。但是不要忘了这个过程只是不经过proxy server没说绕开register server
例如下面过程:
在这个过程中可以明显观察到无论是invite和bye都要通过register服务器转发一次,对应的转发过程开了条call-id,可以看到虽然是p2p但是并非完全透明,register server明显参与了这次完整的call。在caller与register server之间call-id为
1808150176@192.168.7.101
;而callee与register server之间call-id为5fcdc4bf-3662-123a-9a87-1158c9642285
。这两个call-id决定了一个session的建立和结束
4 - 关于transaction、dialog和session
Transaction(事务):一个Transaction包含一个Rrequest和可能的多个Response。在一个Transaction在接收到特定的Final Response(2xx, 3xx, 4xx, 5xx, or 6xx)和这些Response的ACK报文后结束。结束前也可以接受多个非Final Response(1xx)。注意,在Final Responese(200)后面的ACK报文并非Transaction的一部分
Dialog(对话):一对SIP peers对话中间有多个Transaction。Dialog被设立的目的是建立、修改、拆卸(teardown,英文直译,应该是指发送bye结束session的动作)。在一对peer中可能无论何时都有可能产生多个Dialog,一般可以通过SIP头的from tag、to tag、call-id以确认相应的Dialog。例如一个peer同时收到了两个bye请求,可以检查上述SIP头的字段以确认到底是哪个Dialog
Session(会话):Session的概念相对简单,它仅仅用于描述流媒体传输之间的过程,没有流媒体传输就没有Session
5 - 关于tag、call-id和branch
tag:标识同一个dialog(同一call-id)中caller和callee的身份
call-id:决定一段session,
caller和rigister server的call-id
和callee和register server的call-id
共同决定了一段session(似乎跳脱出session和dialog,call-id也能当branch用,例如一对message的Request和200 OK)branch:决定了transaction,相对应的transaction有一样的branch值
- 标题: 初识sip
- 作者: 7cmb
- 创建于 : 2024-04-19 15:23:39
- 更新于 : 2024-10-12 23:07:35
- 链接: https://7cmb.com/初见sip/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。