场景
拱墅项目,国标服务每次发送SIP报文都出现重复的情况,服务器IP地址:
33.86.188.60,下级国标服务IP地址:33.88.0.211
针对下级发送过来的心跳保活报文,回复的200 OK的报文也是一样重复的
两个数据包之间的时间间隔是18微妙,还不到一毫秒。
疑窦
按照osip重发的逻辑,至少也要等500毫秒才会重发
osip库数据重发解读
osip库超时重传的时间间隔是500ms,相关代码在osip2/osip.h文件中:
#define DEFAULT_T1 500 /* 500 ms */
当需要创建新的ICT的transaction时,TIMEOUT_B被启动,时长为64*DEFAULT_T1(DEFAULT_T1为500ms),TIMEOUT_B为整个transaction的生命周期时长,如果超过这个时间,transaction会被结束。
如果传输层是没有传输保证的UDP,则设置TIMEOUT_A、TIMEOUT_D的间隔时间为DEAULT_T1和64*DEFAULT_T1;
TIMEOUT_A管理Invite的发送,发送时启动TIMEOUT_A,如果超时还没收到response,则重发该Invite;
TIMEOUT_D管理ACK
INVITE事务处理逻辑
首先系统调用osip_transaction_init产生一个新的状态机。在发送invite请求的时候,这个状态机是ICT (带invite的client端状态机)。状态机产生后,系统调用函数把消息扔给状态机处理, osip_transaction_add_event负责把消息插到队列中,
A的ICT状态机调用ict_snd_invite函数发送invite包给对方,状态机自身从初始状态跳转到calling状态, 等待对方回应,并设置响应的A超时(重发invite)和B超时(结束本次请求),当A超时到达的时候, 向对方重发一次数据包,并且把A时间的时间增加一倍(最长为4S,如果超过4S,将不再增加)。 当B时间到达后,系统认为对方没有响应,则释放资源,结束本次操作。