SIP是一个分层的协议,意思是说SIP协议由一组相当无关的处理层次组成,这些层次之间只有松散的关系。协议分成不同层次来描述是为了能够更清晰的表达。本协议并没有规定一个具体的实现。当我们说一个要素”包含”某一个层,我们的意思是这个要素符合这个层定义的规则。
不是SIP每一个要素都一定包含每一个层。此外,SIP定义的要素是逻辑上的要素,不是物理要素。一个物理的实现可以实现不同的逻辑要素,或许甚至是基于串行事务处理原理。
SIP最底层的是它的语法和编码层。SIP编码方式是采用扩展的Backus-Naur Form grammar(BNF范式)。(对BNF范式的介绍:https://baike.baidu.com/item/BNF/7328753?fr=aladdin)
第二层是传输层。它定义了一个客户端如何发送请求和接收应答,以及一个服务器如何接收请求和发送应答。所有的SIP要素都包含一个通讯层。
第三层是事务层。事务是SIP的基本组成部分。一个事务是客户发送的一个请求事务(通过通讯层)发送到一个服务器事务,连同服务器事务的所有的该请求的应答发送回客户端事务。事务层处理应用服务层的重发,匹配请求的应答,以及应用服务层的超时。任何一个用户代理客户端(user agent client UAC)完成的事情都是由一组事务构成的。用户代理包含一个事务层,来实现有状态的代理服务器。无状态的代理服务器并不包含事务层。事务层包含一个客户元素(可以认为是一个客户事务)和一个服务器元素(可以认为是一个服务器事务),他们都可以用一个有限状态机来处理特定的请求。
在事务层之上是事务用户(TU)。每一个SIP实体,除了无状态代理,都是一个事务用户。当一个TU发出一个请求,它首先创建一个客户事务实例(client transaction instance)并且和请求一起发送,这包括了目标IP地址、端口号、以及发送请求的设备。TU可以创建客户事务,也可以取消客户事务。当客户取消一个事务,它请求服务器终止正在处理的事务,并且回滚状态到该事务开始前的状态,并且产生指定的该事务的错误报告。这是由CANCEL请求完成的,这个请求有自己的事务,并且包含一个被取消的事务。
SIP要素,包含,用户代理客户端和服务器,无状态和有状态代理服务器和注册服务器,包含一个可以互相区别的核心(Cores)。Cores,除了无状态代理服务器,都是事务用户。UAC(用户代理客户端)和UAS(用户代理服务端)的cores的行为依赖于实现。对UAC来说,这些规则约束请求的建立;对UAS来说,这些规则约束请求的处理和应答。由于注册服务在SIP中是一个重要的角色,所以UAS处理REGISTER请求有一个特别的名字:登记员(即登记服务器)。
在对话中,有其他的相关会被发送。一个对话是一个持续一定时间的两个用户之间的端到端的SIP关系。对话过程要求两个用户代理之间的信息是有序的而且请求被正确路由传输的。在这个规范中,只有INVITE请求可以用来建立会话。
SIP中最重要的方法就是INVITE方法,它用来在不同的参与者中创建会话使用。一个会话由一组参与者,他们之间用于交流的媒体流组成。这个在前面会话建立的过程中已经详细介绍整个过程了,在这里不再赘述。