多年来做sip终端比较多,服务器一般直接采用asterisk。
最近,做一个通信产品的整合,把桌面im, webim,voip,call center等合到一起。这时有时候从整体上考虑一下这些产品的相关性。个人发现,其实,sip架构就是一个im,甚至,现代的im的功能和复杂性都远超sip。那为什么im的产品非常多,而sip的server确一直都在抄开源项目吗?感觉,有点对sip过于神化了,其实,完全可以用普通的方法实现一个大规模的server。拿以前做过的一个项目来说:
1 linux下使用udp select 模型(连epoll都用不到,压力测试单机轻松过万)。
2 终端发register,server验证用户名,口令,成功后创建一个cuser对象,追加到user map中, 返回200 ok(演示代码,暂不考虑180)。
3 如果该用户名口令已经存在,删掉原来的,重新生成一个cusr 对象。
4 终端每30秒发一个保活包。
5 对user map保活操作,每30秒轮循查cuser,超时做相关处理。
6 终端发invite,server创建一个session对象,加到session map中。session中包含各种状态机。
7 如果支持穿透nat,转发invite时,由session负责协调,在sdp中带上源终端音视频的外网ip和端口。
8 session map也做保活,每一条命令转发后,超时做相关处理。
9 协商成功,转发rtp数据,或双方直接点对点。
10 会话完成,终端 发bye,从map中删掉该 session
11 终端 发unregister,从map中删掉user
asterisk代码把所有的逻辑处理都放在一个.c里,这一个.c代码超过2万行,现在想起来看代码的时候还心有余悸。其实,如果做个简单一些的sip proxy,不考虑全面兼容市面上的硬件设备,完全可以按上面的流程自己实现一个。至少,上面的udp通信,用户管理和会话管理,比asterisk方便的多,也更容易维护。至少可以解决不同终端用同一账号同时在线,测试过很多视频会议终端和voip电话终端,都有这个现象(当然卖给用户的时候,每个终端的账号都固定设置好了,不会冲突)。
阅读(4928) | 评论(0) | 转发(0) |