osip源代码框架详解(7)

2018-12-04 22:40

Q/CT XXXX.1-2008

eXosip_call_build_initial_invite的流程如下:

入口参数的合法性检查,特别是发送目的端地址to的检查generating_request_out_of_dialog_eXosip_dialog_add_contactosip_message_set_subjectosip_message_set_expires

在创建一个新的INVITE时,而且该INVITE是call的第一个INVITE,则需要检查必要参数目的端地址to的合法性。生成一个INVITE message需要使用到的信息大部分在exosip lib库启动的时候就设定了,包括sip协议的版本,from tag 的产生机制等。需要特别指定的只有发送目的端to。

在检查合法性之后,调用通用的请求构造函数generating_request_out_of_dialog构造生成一个request message,在构造参数中指定要构建的是一个INVITE。因为是在dialog创建之前构建INVITE 请求,所以调用的接口为out_of_dialog的,即不需要从dialog中获取信息;如果是dialog内构造的新的请求,则根据sip协议,其新的request的 local cseq number必须大于dialog中的local cseq number,并且因为属于一个dialog,所以其call_id, from tag, to tag 必须同dialog相同。同时如果不是dialog中的新的INVITE请求用于更改route set,则还要使用dialog中的route set用于该请求中。

在创建成功通用的dialog外的请求后,添加INVITE相关部分字段,包括contact,subject和超时时间expires。其中contact之间使用本端内部设置的IP地址。

eXosip_call_send_initial_invite的流程:

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

Q/CT XXXX.1-2008

eXosip_call_init_eXosip_transaction_initosip_new_outgoing_sipmessageosip_transaction_add_event 首先initial invite是用于创建一个新的call的,所以在发送一个initial invite时,创建一个new call,并且为该invite创建一个新的transaction,该transaction类型为ICT,同时将该transaction做为这个new call的c_out_tr,因为整个call是有该transaction创建的,当该transaction到达complete状态的时候该call就建立起来了。但是此时并不建立dialog,因为dialog是两端通信协商后的结果,只有收到了对端的非100的1xx应答或>200的应答才会建立一个dialog。

在创建完call和transaction之后,根据要发送的INVITE生成一个transaction上的event,将该event添加到该transaction的event队列中;并将call添加到exosip管理的call链表中,然后给call分配一个call_id,最后唤醒处理线程对transaction上的event进行处理。

在两个线程的交互方面是通过transaction的event队列来完成的,eXosip_call_send_initial_invite只是将要发送的invite生成一个event添加到event队列,真正的发送在处理线程处理该event时才会进行。 4.3.2

INVITE的ACK应答的创建和发送

eXosip_update对端发送过来的INVITE等请求的处理在 exosip_read_message中已经进行了处理,对request的应答是sip协议栈自动完成的,同时对非2xx的应答也自动完成。当接收到的是2xx的应答,在transaction层的处理会上报一个EXOSIP_CALL_ANSWERED事件给UAC层,此时需要管理程序处理该事件,创建一个ACK应答并发送该ACK应答,同时如果在超时时间内继续接收到该2xx应答,只需要重新发送该ACK应答即可。

客户端接收到2xx应答的处理参见Jcallbakck.c文件的cb_rcv2xx函数。

eXosip_call_build_ack的处理流程:

a) 根据所属的dialog,查询得到所属的call 和dialog的结构。

b) 获取该dialog中还未处理完的transaction,如果该transaction不是INVITE的

transaction则返回错误,因为ACK只会出现在INVITE的请求transaction中。

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

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 -


osip源代码框架详解(7).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:意键险核保人员上岗资格考试(带答案)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: