在SIP(Session Initiation Protocol)协议中,Cseq(Command Sequence)头域是一个关键的组成部分,它用于标识SIP请求的顺序和唯一性。
组成
Cseq头域包含两部分信息:一个是命令方法(Method),另一个是序列号。
1. 序列号的特性
1)32位无符号整数:序列号必须表示为32位无符号整数。这意味着序列号的取值范围是0到4,294,967,295(即2^32-1)。
2)唯一性:序列号在同一个Call-ID范围内必须是唯一
3)初始化和递增:序列号的初始值可以是任意选取的,但一旦确定,后续的请求(对于具有相同命令方法但不同消息体的请求)中序列号必须严格单调增加,不得循环。
2. 序列号的作用:(特性决定作用)
1)特定3决定:这样的设计确保了即使在网络条件不佳导致重传的情况下,服务器也能够准确地区分原始请求和重传请求,从而避免了处理上的混乱。
2)特定2决定:匹配请求和响应。服务器在响应中回送请求中的Cseq值,以便客户端能够识别哪些响应是针对哪个请求的。这种机制有助于维持会话状态的同步,并确保通信的可靠性。
3. 方法名:
表示SIP请求的方法类型,如INVITE、ACK、CANCEL等。方法名与序列号一起,唯一地标识了一个SIP事务。方法名必须与SIP请求的方法类型一致。
作用
- 区分新的请求和重发的请求:当客户端发送一个新的请求时,它会增加Cseq的序列号。客户端在发送新的请求时会递增Cseq的序列号,而对于重发的请求(如INVITE请求的重传),Cseq的值保持不变。
- 提供请求和响应的标识:服务器在响应时会复制请求中的Cseq值,从而将响应与相应的请求关联起来。
- 事务排序:提供事务的唯一标志,并且区分请求和请求的重发。如果序列号相等,并且请求的方法相等,那么两个Cseq头域被认为是相同的。这有助于服务器管理并发的SIP事务,并确保正确的消息被发送到正确的会话。
注意:
1)对于ACK和CANCEL请求,它们必须包含与它们相关联的INVITE请求相同的Cseq值。
2)当发送BYE请求以结束会话时,Cseq的值应高于之前的INVITE请求.
3)当SIP请求被转发到另一个服务器时,Cseq头域的值应该保持不变。这是为了确保请求在整个转发过程中保持一致性和可追踪性;但在B2BUA环境中,转发后的INITE请求CSeq序列号可能会改变,如下: