sip客户端注册超时细节
2018-01-29 本文已影响448人
XDgbh
1、注册信息数据库表。
- 当有sip客户端向服务器注册时,在进行一番验证注册成功后,会向<.dir.>/freeswitch/db/core.db数据库的registrations表中以及sofia_reg_internal.db数据库的sip_registrations表中,存入注册信息,两者大部分数据是相同的。
//源文件sofia.c第2476行。
//将注册信息存入sofia_reg_internal.db数据库的sip_registrations表中。
sql = switch_mprintf("insert into sip_registrations "
"(call_id, sip_user, sip_host, presence_hosts, contact, status, rpid, expires,"
"user_agent, server_user, server_host, profile_name, hostname, network_ip, network_port, sip_username, sip_realm,"
"mwi_user, mwi_host, orig_server_host, orig_hostname, ping_status, ping_count) "
"values ('%q','%q','%q','%q','%q','Registered','%q',%ld, '%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q','%q', '%q', %d)",
call_id, from_user, from_host, presence_hosts, contact_str, rpid, expires, user_agent, to_user, guess_ip4,
profile_name, mod_sofia_globals.hostname, network_ip, network_port, username, realm, mwi_user, mwi_host,
orig_server_host, orig_hostname, "Reachable", 0);
2、超时时间。
- core.db的registrations表中,重点关注第五列数据(一个长整型数据),这个数据就是超时时间,也就是指的这个用户的注册信息如果不更新将在这个时间后失效。具体是指——“当前系统正常时间-UNIX时间纪元(1970/1/1/00:00:00)”转化成秒数的长整型数字。
- sofiq_reg_internal.db的sip_registrations表中有上面registrations表中的所有数据,并多有一些其他更详细的数据。
3、注册信息更新。
- 如果在用户的配置信息如1010.xml中添加一行
<variable name="sip-force-expires" value="100"/>
。那么1010这个sip客户端就会在注册后的每50~100秒内重新再注册一次,然后更新注册信息中的超时时间。
4、超时时间和注册时间的关系。
- 超时时间一般是在当前注册时间的系统时间(秒数)的基础上,加上一定的秒数x和秒数y。
即:超时时间 = 注册时刻系统时间now + x + y 。
这个秒数x有两种情况:
1)如果用户配置信息中配置了sip-force-expires具体值如100,那么x等于100秒。
2)如果用户配置信息中没配置该expires值,那么就从sip客户端注册时提交的信息中获取expires值,如x-lite sip客户端一般将expires值设为3600秒。那么x等于3600秒。
这个秒数y是指:sip协议源代码中,默认设置的一个安全时间,一般y是60秒。可以防止用户配置信息中sip-force-expires设置的太小,导致频繁检测注册用户是否超时。
若要在源代码中修改,可修改sofia_reg.c源文件中的 超时时间=(long)reg_time + (long)exptime + profile->sip_expires_late_margin
与上面式子一一对应。
5、注册超时
- sip协议源代码中,会有个线程循环检测比较当前系统时间和注册信息表中的超时时间,如果系统时间到了超时时间,这条注册信息还没有更新超时时间,则认为这条用户注册信息超时了(原因可能是对应用户的sip客户端断网或者进程非正常结束)。但是不会立马删除数据库中的这条数据,测试时发现在10秒左右之后,再删除,并发送 CUSTOM sofia::expire 事件通知有用户注册超时。
6、用户正常上下线事件通知
- 正常注册上线。不管是第一次注册还是后面每隔多少秒更新注册,都会发送一个注册事件CUSTOM Sofia::register。这些注册方式都是UDP。
- 不正常注册上线时。如果是用户在断网或其他原因不正常下线后又恢复网络重新注册时,注册方式会是TCP,会产生3个事件CUSTOM Sofia::register。
- 正常取消注册下线时。此为正常手动关闭退出sip客户端程序,会产生事件CUSTOM Sofia::unregister。
- 不正常下线时。如果因为注册超时,然后被删除数据库注册信息,会收到 CUSTOM sofia::expire 事件通知有用户注册超时。
以上这些事件需要向freeswitch发送相关api订阅
api event plain CUSTOM sofia::register sofia::unregister sofia::expire
。收到的事件的正文内容会包含一些用户的信息,比如号码、系统当前时间、超时时间等等。