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的结构。因为是接收到一