osip源代码框架详解 下载本文

Q/CT XXXX.1-2008

c) 调用函数_eXosip_build_request_within_dialog构建ACK message 并且设置

ACK的联系地址contact和INVITE相同。

d) 设置ACK的cseq number同INVITE的cseq number,ACK是一个特殊的请求,

其method与对应的INVITE不同,但是使用相同的cseq number,用于对端确定该ACK是哪个INVITE的ACK。

e) 同时设置ACK的认证信息anthorization为INVITE的anthorization。

eXosip_call_send_ack的处理流程:

a) 参数检查,需要确定要发送的ACK所属的dialog是否正确。并查询得到call

和dialog的结构地址。

b) 检查第一个路由项,如果没有 ”lr” 标识,说明是前一版本的路由设置规则,

根据协议的向后兼容性,需要调整发送目的request_uri为第一个路由的request_uri,并且保存原发送目的request_uri为路由集合中的最后一条路由。 c) 直接发送该ACK,不做为一个event添加到transaction是防止中间的消耗时间

过长,导致对端的2xx应答重发。

d) 保存该ACK,在对端重发2xx应答时重发该ACK。

4.3.3

dialog内的请求的创建和发送

eXosip_call_build_request处理流程:

因为是dialog已经建立完成,所以创建的新的dialog内的请求只需要知道request的类型即可以。创建一个新的request所需要的信息在dialog内部已经保存,包括call_id、from、from tag、to、to tag、cseq number、request_uri以及认证信息anthentication information。

在创建一个新的请求的时候,需要检查是否有未处理完的请求存在,因为按照sip协议标准,一个call内的请求是要按照顺序进行处理的,即上一个请求没有处理完,下一个请求不应该被发送出去。其中INVITE请求比较特殊,只要没有INVITE请求没有处理完,就可以发送下一个INVITE请求,而不需要等待像notify、option等的请求。

eXosip_call_send_request处理流程:

a) 检查要发送的request的合法性,并且检查所属的dialog的合法性。 b) 检查该dialog上是否有transaction没有处理完毕,如果有,则返回错误,不允

许多个请求同时在一个call上处理。这个检查和build时是一样的。 c) 为新请求创建一个transaction,并且将该transaction加入到dialog的d_out_tr

链表中,因为是请求发送方,所以本端为client端,所以创建的transaction为

中国IMS网络SIP协议规范总体技术要求 - 33 -

Q/CT XXXX.1-2008

NICT或ICT,并且是属于本端发送出去的transaction。

d) 根据该请求生成一个event,加入到该transaction的event队列中。 e) 最后唤醒处理线程对该event进行处理,即将该request发送出去。

4.3.4

Dialog内answer的创建和发送

在接收到dialog内部的request时,需要发送response。 eXosip_call_build_answer的处理流程:

a) 根据transaction id查询得到 call、dialog、transaction的结构。因为是接收到一

个请求,所以在处理请求的时候已经创建了新的transaction,所以查询在正常情况下不会失败。

b) 如果是INVITE的请求,则调用_eXosip_answer_invite_123456xx进行response

的message的构建,根据传入的最后一个参数0标识只构建message不发送该message。

c) 如果不是INVITE,则直接调用eXosip_build_response_default生成一个通用的

应答message,如果回复的应答状态为(100, 399],则最终本端和对端会建立dialog,则调用函数complete_answer_that_establish_a_dialog从request中获取部分信息。

eXosip_call_send_answer的流程:

a) 参数的合法性检查,如果回应的status不在[100,699]之间,或者transaction id

<0,则返回错误提示。

b) 根据transaction id查询得到call、dialog、transaction的结构,如果没有找到,

则返回错误。

c) 检查该transaction的合法性,如果其状态已经结束,则返回错误。

d) 如果answer还没有创建,并且是INVITE的应答,且应答status为2xx应答,

则返回错误。

e) 如果要发送的answer还没有创建,且是INVITE的应答,则调用

_eXosip_answer_invite_123456xx创建并发送应答。如果不是INVITE的应答,则返回错误。 f)

如果是INVITE的应答,且应答的status为2xx,并且dialog已经创建,则保存该2xx的应答到dialog中,并且置dialog的状态为confirmed,在未收到ACK的情况下,该2xx应答会被重新发送。

g) 所有合法性检查通过,则生成一个transaction上的event事件,并且添加到

中国IMS网络SIP协议规范总体技术要求 - 34 -

Q/CT XXXX.1-2008

transaction的event链表上。

4.4

Register的处理

同call一样,exosip lib库通用提供了创建一个新的register和发送rejister的接口,管理程序只要调用接口创建一个新的register并且调用发送接口进行发送即可。

Register注册包括初始的注册,改变超时时间和取消该注册。其区别主要为发送给注册服务器的参数expires即超时时间的不同。

如果expires为0,则为终止该注册;如果为expires大于0,则为修改或注册该register。为避免太频繁的重注册行为,规定注册的无效时间最小为100s,而且服务器可以自己配置该最小值比100大。 4.4.1

向一个服务器第一次注册

向一个服务器第一次注册时,调用接口eXosip_register_build_initial_register生成一个新的register message。该函数会进行一些合法性检查,其处理流程如下:

a) 查询所有的register,检查其注册服务器的地址与现在要注册的服务器的地址

是否相同,如果有相同的服务器地址存在,则删除原有的注册的transaction,进行重新注册。

b) 调用eXosip_reg_init生成一个新的register管理结构并且添加到exosip的j_reg

管理链表中。

c) 调整这个新的register的重注册时间,如果输入的超时时间expires <= 0,说明

是一个注销行为,则设置重注册时间为0,即不需要重注册。如果设置的重注册时间小于100,则调整为最小值100。

d) 调用_eXosip_register_build_register创建一个标准的register message,并返回新

生成的register管理结构的id。

4.4.2

调整一个注册的注册超时时间

接口eXosip_register_build_register用于创建一个注册message,用于调整已经注册成功的注册的超时时间。

a) 接口根据传入的register的id查询得到register的管理结构。如果查询失败,

则返回错误。

b) 重置该register的超时时间为传入的参数expires,并且根据协议的规范调整其

范围到[100, 3600]。

c) 检查被调整expires的注册的前一个请求处理是否已经结束,如果没有,则返

回错误提示。

d) 调用_eXosip_register_build_register创建一个新的register message并返回

中国IMS网络SIP协议规范总体技术要求 - 35 -

Q/CT XXXX.1-2008

register的id。

4.4.3

发送一个register注册

前两个的创建新的register message之后,都需要调用接口eXosip_register_send_register发送新创建的message。

Register的发送流程如下:

a) 检查要发送注册message的register的上一个注册请求的状态码是否已经到结

束状态,如果不是,则返回错误。

b) 为要发送的register message创建一个新的transaction,每个新的请求都对应一

个新的transaction。并且将该transaction挂接在register的管理结构 jr->r_last_tr中。每个主次只保存最近的一个transaction,因为注册必须是串行的,在上一个注册还没有处理完毕的情况下,不允许在同一个注册服务器上发送新的注册请求。

c) 根据发送的message生成一个transaction上面的event并挂接在transaction的

event队列中。

d) 唤醒处理线程,处理transaction的event。

Exosip lib包中提供的notify、publish、subscribe、message和options等的功能和call、register的功能是相近的,不做详细解释。

中国IMS网络SIP协议规范总体技术要求 - 36 -