SIP协议即会话初始化协议,是一个基于文本格式的,用户ip通话的一种协议
在sip协议中,有会话、对话、事务这几个基本的概念,以及一些关键字段
会话(Session): 用于进行媒体流传送。当一方发出请求,而另外一方或多方接受请求并通过信令交互成功后才能建立会话。
跟SDP内信息相关。在SDP中,多媒体会话指的是一组的媒体发送方和接收方及媒体流从发送方流向接受方。会话是由SDP里的user name, session id, network type, address type, 和源处地址元素来确定的。只有当媒体协商成功后,会话才能被建立起来。
对话(Dialog): 由INVITE或者SUBSCRIBE创建
对话指的是一对一的持续一段时间的连接关系,由Call-ID, From-tag和To-tag确定。当三个元素齐全的时候,即对话处于确定阶段时,对话已经建立起来。 Dialog ID:Call-Id, 本地tag, 对端tag 组成
Dialog(会话) 会话是两个UAs(user agent) 之间持续一段时间的端到端(peer-to-peer)的SIP 关系. 一个会话由一个Call-ID, 一个local tag 和 一个remote tag来标识.会话过去也叫做 “call leg”.
事务(Transaction):
事务包括发送的请求和相应的回应,指的是UA之间的请求和应答关系。而VIA中的branch参数用于确定事务。
Transaction(事务) 事务发生于客户端和服务器端之间,包含从客户端发出请求给服务器,到服务器响应给客户端的最终消息(non-1xx message)之间的所有消息. 如果请求是一个"Invite"消息,并且最终的响应是一个non-2xx消息,那么该事务包含一个"Ack"响应消息.如果服务器的响应是一个2xx消息,那么,随后的ACK是一个单独的事务.
Branch是一个事务ID(Transaction ID),用于区分同一个Client所发起的不同Transaction。
对于遵循RFC3261规范的实现,这个branch参数的值必须用magic cookie”z9hG4bK”打头. 其它部分是对“To, From, Call-ID头域和Request-URI”按一定的算法加密后得到。 这7个字母是一个乱数cookie(定义成为7位的是为了保证旧版本的RFC2543实现不会产生这样的值),这样服务器收到请求之后,可以很方便的知道这个branch ID是否由本规范所产生的(就是说,全局唯一的)。
SIP的关键头域字段:
Via: 转发过sip包的服务器都可以往头域的via字段中添加自己的地址,后续的响应(Response)包可以根据via字段进行转发,以达到发送端,同时也可以使用via字段进行环路检测,避免出现死循环
Route: 被sip代理服务器加入到头域中,后续消息接收方如果存在主动发起的消息,需要将该字段的值复制到头域中,并且发送的消息包必须经过这台机器
Recoed-Route: 被sip代理服务器加入到头域中,后续消息接收方如果存在主动发起的消息,需要将该字段的值复制到头域中,并且发送的消息包可以 经过这台机器
Contact: 后续Request将根据Contact头域的内容决定目的地的地址,同时将Contact头域的内容放到Request-URI中。它还可以用来指示没 有在Record-Route头域中记录的代理的地址。同时它还可以被用在Redirect servers和REGISTER requests 和responses