IM后台实现的一些思考

IM后台实现的一些思考

   之前困惑于IM如何维持用户的在线状态,如果用UDP,那么服务器为了得知客户端是否还在线,是否轮询用户列表,对每个用户发包探测?如果这样,客户端没有任何动作,服务器已经忙于维护在线状态而不断占用CPU轮询,不断发包,而且这种情况下如果用户下线,好友还要等到服务器轮询到该用户才知道他下线了,这个延时比较大。反之,如果对每个在线用户维护一个TCP连接,这样用户一下线服务器就立刻知道,但是,用户量这么大,每个用户fork一个进程不现实,而单个进程能打开的文件数目是1024。再说,大量的TCP连接长时间占用系统资源。

   看了腾讯大讲堂的视频,有些收获,最大的收获是,清楚计算机网络没学好……端口映射,上网查了下资料,原来还有个打洞的技术,不过,还是选择用服务器转发简单。

   抓包,发现QQ登录时发了好多了UDP,登录后,每隔半分钟发个数据报,这可能就是讲座中提到的hello,服务器回复一个数据报,如果没有回复,客户端就重发,我这才发现,服务器没有用TCP维护与客户的连接,也没有对客户轮询发包,而是用户自己发hello包通知服务器自己还在,服务器上记录有客户最近一次hello的时间,服务器上有个遍历记录的进程,发现hello时间距今超过半分钟,客户就算是断线了,而客户如果正常下线,则会发送离线提示,这样好友能立刻知道客户下线,即使客户无故断线,最迟也是半分钟的延迟而已。之所以要30秒一次hello包,是因为客户端有可能是处于局域网中,要通过路由器与服务器通信,涉及到局域网与外网通信,要“打洞“,而路由器上的连接session只保存可能只保存数十秒,所以要不断”打洞“,也就是不断发hello包维持通信。

posted @ 2013-02-19 23:25  wongzawing  阅读(2996)  评论(11编辑  收藏  举报