分析一下QQ你就会发现,QQ登录时会发送请求给服务器,QQ的服务器并不是一直监听客户端,反之是通过30秒的一个时间间隔来确定客户端是否还在,这个主要的以客户端完成,30秒以内客户端会和服务器握手,告诉服务器我还在,状态正常,而服务器会记录下这个时间,如果30后再次收到客户端握手则维护当前状态,如果收不到则表示客户端掉线了。然后服务器清除当前客户端的状态和注销用户。这就是为什么如果我们是退出QQ,对方很快就看到我们下线了,不超过五秒,但是如果我们的网络出现故障意外断线了,对方要看到你下线需要在大约30-40秒之后。所以使用UDP是为了降低服务器的压力,至于TCP,QQ同样提供了支持。登录时可以选择是TCP还是UDP,默认为随机。登录请求发送给服务器后自动分配的。QQ在文件传输和媒体通讯过程中使用UDP降低了很大的服务器承载。我自己也做IM,早期的版本全跑TCP,用户承载没问题,但是当有文件传输时 服务器承载能力大打折扣,更关键的是多人视频,使用UDP点对点之后客户端内存增加了,CPU也增加了,但是服务器承载变强了。在使用TCP时 ,200人同时视频通话 服务器程序就吃掉970MB内存,2GB的服务器 只能承载200人就差不多极限,8GB内存 4核CPU的服务器也只能承载500-800人的视频通话,改成UDP之后差不多只占原来服务器资源的十五分之一。但是客户端内存消耗增加,使用服务器中转时,客户端9个视频,内存消耗大约90MB,UDP之后这个内存飙升到170MB。
[quote=引用 40 楼 applemacosx 的回复:] 分析一下QQ你就会发现,QQ登录时会发送请求给服务器,QQ的服务器并不是一直监听客户端,反之是通过30秒的一个时间间隔来确定客户端是否还在,这个主要的以客户端完成,30秒以内客户端会和服务器握手,告诉服务器我还在,状态正常,而服务器会记录下这个时间,如果30后再次收到客户端握手则维护当前状态,如果收不到则表示客户端掉线了。然后服务器清除当前客户端的状态和注销用户。这就是为什么如果我们是退出QQ,对方很快就看到我们下线了,不超过五秒,但是如果我们的网络出现故障意外断线了,对方要看到你下线需要在大约30-40秒之后。所以使用UDP是为了降低服务器的压力,至于TCP,QQ同样提供了支持。登录时可以选择是TCP还是UDP,默认为随机。登录请求发送给服务器后自动分配的。QQ在文件传输和媒体通讯过程中使用UDP降低了很大的服务器承载。我自己也做IM,早期的版本全跑TCP,用户承载没问题,但是当有文件传输时 服务器承载能力大打折扣,更关键的是多人视频,使用UDP点对点之后客户端内存增加了,CPU也增加了,但是服务器承载变强了。在使用TCP时 ,200人同时视频通话 服务器程序就吃掉970MB内存,2GB的服务器 只能承载200人就差不多极限,8GB内存 4核CPU的服务器也只能承载500-800人的视频通话,改成UDP之后差不多只占原来服务器资源的十五分之一。但是客户端内存消耗增加,使用服务器中转时,客户端9个视频,内存消耗大约90MB,UDP之后这个内存飙升到170MB。
不是所有聊天记录都经过服务器的,否则腾讯早就挂机了,TCP长连接只不过记录通信双方的连接端口,点对点通信就用UDP了。减轻了服务器的大部分压力。
奇怪的一点,既然QQ登录后,服务器和客户端之间都会保留一个TCP长连接用于保持用户的在线状态,为什么数据中转不通过这条TCP链路中转呢,而非要用UDP协议来中转,还加上什么辅助算法来确保安全性(难道不需要占用额外的资源吗),理由说是,UDP较TCP快,服务器端只有采用UDP协议与客户端进行通讯才能保证这种超大规模的服务(TCP长连接不是在了吗,资源已经被占用了),有必要吗,真的是这样吗?
同时在线几亿用户,全靠服务器这个也太疯狂了
[quote=引用 10 楼 applemacosx 的回复:] 做了几年的通讯软件,第一次看到这么搞笑的提问。
引用UDP来进行点对点通信 那UDP是面向非连接的,怎么能进行点对点通信呢?求解
UDP来进行点对点通信
18,356
社区成员
64,214
社区内容
加载中
试试用AI创作助手写篇文章吧