网络:为什么QQ用的以UDP为主,TCP为辅助

TCP VS UDP

这两种传输协议用于不同的业务和不同的硬件终端

  1. 类似于图像、声音等对可靠性要求没有那么高的业务可以用UDP,它们不需要准确存储对准备性无要求但要求速度快。类似于文本、程序、文件等要求可靠的数据最好就用TCP,但会牺牲一些速度
  2. 对系统资源的要求:TCP较多、UDP少
  3. 程序结构:UDP程序结构较简单,TCP复杂
  4. 流模式与数据报模式:TCP保证数据正确、UDP可能丢包
  5. TCP保证数据顺序,UDP不保证

用途:

  1. TCP是面向连接的,有比较高的可靠性,一些要求比较高的服务使用这些协议,比如FTP、Telnet、SMTP、HTTP、POP3等
  2. UDP是面向无连接的,使用这个协议的常见服务有DNS、SNMP、QQ等。它使得数据传输速度得到大幅度的提高。视频聊天语言基本都是用UDP协议

QQ以UDP为主、TCP为辅

QQ即使传文件也是以UDP为主,主要是从服务器的角度来考虑。

  • 首先每一个客户实际上都适合服务器交互,再有服务器转发给正在通信的用户,如果每一个QQ从一上线到下线的这段时间全部采用TCP长连接,这对服务器的负担很大;而如何采用TCP短连接,频繁的连接断开也会造成网络负担,而采用UDP可以避开上面麻烦,减少服务的负担
  • 不管是TCP还是UDP,最终登录成功之后,QQ都会有一个TCP连接来保持在线状态。这个TCP连接的远程端口一般是80,采用UDP方式连接的时候,端口是8000。UDP协议是无连接方式的协议,它的效率高、速度快、占用资源少,但是其传输机制为不可靠传输,必须依靠辅助的算法来完成传输控制。QQ采用的通信协议以UDP为主,TCP为辅。由于QQ服务器设计容量是海量级的应用,一台服务器要同时容纳十几万的并发连接,因此服务器只有采用UDP协议与客户端进行通信才能保证这种大规模的服务。
  • QQ客户端之间的消息传输也采用了UDP模式,因为国内的网络环境复杂,而且很多用户采用的方式是通过代理服务器共享一条线路上网的方式,在这些复杂的情况下,客户端之间彼此能够建立起来TCP连接的概率较小,严重影响传输信息的效率。而UDP包能够穿透大部分的代理服务器,因此QQ选择了UDP作为客户端之间的主要通信协议
  • 采用UDP协议,通过服务器中转方式。因此,限制的IP探测在你仅仅跟对方发送聊天消息的时候是无法获取到IP的。大家都知道,UDP协议是不可靠的协议,只管发送,不管对方是否能够收到,但传输高效。但是,作为聊天软件是必须可靠的。所以,QQ采用了上层协议来保证可靠传输:如果客户端使用UDP协议发出消息之后,服务器收到该包,需要使用UDP协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的

为什么QQ早期仅仅选择UDP

本质上UDP的优势还是带宽的利用。这一切要回归到99~03年的网络状况,当时网络的特点就是接入带宽很窄而且抖动很厉害。所谓抖动可能是多方面的,比如延时突发性的暴增、也有可能是由于路由层面的变化突然导致路由黑洞,还各种等等等等的问题。TCP因为拥塞控制、保证有序等原因,在这种网络状态上对带宽的利用是非常低的。而且因为网络抖动的原因,应用层心跳超时(一般不依靠keepalive)应用层主动断掉socket之后TCP需要三次握手才能重新建立连接,一旦出现频繁的小抖动就会使得带宽利用率更低。而等待四次挥手的时间,也会占用服务器上宝贵的资源。

总结来说,当网络差到一定程度了,TCP的优势反而会成为劣势。

这时候我们再看看UDP在这种情况下的表现。使用UDP对抗网络抖动,说到底就是在应用层比TCP更快的探测和重传,一旦超过一定的时间没有收到回复,客户端可以选择马上重试或者换一个IP:PORT重试(假如你的服务像QQ一样有多个接入),在服务器就可以果断的断掉socket。而可以应用UDP的时候,往往是你的应用层协议本身就已经具备了一定的面向连接的特性。如果你应用层的协议已经达到了一定程序的消息幂等,客户端几乎可以无脑的进行重传,这就可以尽可能降低网络抖动的营销,同时尽可能的利用整个带宽。而刚好QQ协议,就句柄类似的特点。

简单来说就是我们可以使用UDP实现一个面向连接协议,这个协议可以很好地适应当时的网络状况和QQ本身的业务。但凡事都有成本,成本就是你的应用层协议本身需要去实现抵抗网络异常带来的问题。例如乱序、例如业务数据的分片和重组、例如网络状态探测等等等等。。。而现在UDP也应用在很多跨运营商、跨地域、跨机房之间的服务调用当中。原因无它,就是网络烂到一定程度了。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值