用户代理:
一个用户代理是一个完整的终端系统,它包含了一个用户的客户端代理UAC(用来发送请求和处理应答),和一个用户服务器代理UAS(用来接收请求,回复应答)。
注:用户代理值得就是一个完整的sip呼叫系统,UAC指的就是客户端,UAS指的就是服务器。
UAC与UAS处理程序依据两个因素:第一个请求与应答是否为同一个对话,第二基于请求的方法。
UAC行为
UAC产生一个request必须包含如下头域:To、From、CSeq、Call-ID、Max-Forward和Via,这六个头域是必须包含的,缺少一个就是不合法的request。这六个头域之所以缺一不可是因为它们组合提供了路由服务(包括消息的地址、应答的回复路径、消息最大跳数)消息的顺序、消息的唯一事物标示。
To:
To头域的首要作用是指出request消息的“逻辑”接收人是谁。To头域要包含一个sip uri和一个要建立对话的终端的名称用来指明要接收request的接收人的“逻辑地址”。一个UAC需要使用一些列的办法合成一个To头域值。值得注意的是在request消息中,To头域值不能包含tag字段,因为tag字段是建立会话有才会有的。
To: Carol <sip:carol@chicago.com> 这就是一个request的To头域,它指明了要建立会话的对象
From:
From头域的与To头域一样,首要的任务是指明发送request终端的“逻辑地址”(有了这个From字段,就可以自动拒绝接听,如果自动屏蔽掉某人的来电)。From头域值得组成和To头域值类似,由发起人的显示名称和sip uri组成。值得注意的是在request消息中,From头域值必须包含一个tag标签。
From: "Bob" <sips:bob@biloxi.com> ;tag=a48s
From: sip:+12125551212@phone2net.com;tag=887s
From: Anonymous <sip:c8oqz84zk7z@privacy.org>;tag=hyh8
第三个From头域值中Anonymous表示未给出request消息的显示名称只是给出了sip uri,第二个From头域表示From头域值中可以不包含显示名称的。
Call-ID:
Call-ID头域是一组会话的唯一标示,一组会话的request与response的Call-ID必须是同一个。在UAC发起一个请求的时候,UAC必须产生一个全局的Call-ID,Call-ID头域值与UA是一一对应的,不能存在重复的Call-ID。UA每一次注册,注册消息的Call-ID值都应该相同的。重新尝试的request,不算是新的请求,所以Call-ID应该用之前已经有的。
Cseq:
Cseq头域是用来识别和排序事物用的,Cseq头域值由32位数值和方法组成,方法必须与request消息的方法相同。例如 Cseq:2244 invite 这就是一个Cseq头域
Max-Forwards:
Max-Forwards头域用来指明在网络传输中,sip消息到达目的地的最大跳数,每经过一个节点跳数减1。默认的跳数值为70.
Via:
Via头域是用来记录sip事物传输时经过了那些设备,以及用来做为response的返回路径用的。在传输设备找到下一跳或者是目的地准备转发sip消息的时候,在Via头域中添加上他自己的Via头域值。在UAC创建一个request时必须把自己的“逻辑地址”添加到Via头域值中,还要添加协议名称和协议版本号,它们必须为sip和2.0。除此之外必须还要有一个参数分支,这个分支用来判定是谁发送的这个request。
Contact:
Contact头域提供了一个后续直接连接而不需要sip路由的方法。
Supported and Require:
如果sip服务器响应sip协议的扩展这两个头域才会有作用。
附加信息:
上面的头域添加完成之后,就合成了一个基本的sip request信息。在此外我们还需要添加一些额外的信息。例如:指出消息体的类型,长度之类的。
上面是简单的介绍了UAC封装一个请求的过程,下面将要介绍UAC处理这个请求返回的应答。
传输层的错误:
有的时候传输层传给事务处理层的不一定是一个sip消息,而又可能是传输层的一个错误,当事务处理层收到一个timeout的错误时,必须把这个错误当做收到状态码408(请求timeout)来处理,如果事务处理层收到了一个严重的错误(udp或是tcp出错)那么把这个错误当做状态码503来处理。
未知应答:
UAC必须把自己不认识的 所有应答当做x00来处理。
Vias错误:
如果在应答中,不止有自己的via头域存在,那么UAC应该丢弃这个消息,因为应答回来的时候,每经过之前走的代理服务器,都会把这个服务器响应的via头域去掉。所以,如果存在了多余的via头域,那么就是说明这个消息被错误的路由了或是消息已经不完整了。
处理3xx应答:
当UAC收到了3xx的应答时,UAC需要使用contact头域中去重新制定一个或多个新的request消息。值得注意的是在重定向的这个request中,我们可以使用之前的request的Call-ID头域,也可以使用新的Call-ID头域。
3xx表示重定向应答;
处理4xx应答:
一些特定的4xx应答需要UAC进行特殊的处理,这个与请求的方法无关。
如果收到的是401(未鉴权)或者是407(代理鉴权要求),那么UAC需要进行鉴权工作
如果收到的是413(请求实体过大),表示UAS不能接收这么大的sip消息,UAC需要重新压缩一下。
如果收到的是415(表示不支持这种媒体类型),UAC重新发送的request应该使用服务器给出的支持的媒体类型
。。。。
4xx应答客户端请求错误,请求消息可能存在格式错误或者是在这个服务器上不能完成。
处理1xx应答:
1xx表示服务器已经接受了这个应答,这在处理转发中。。。。
处理2xx应答:
2xx表示目标已经成功接受,正在处理中。。。。