为什么QQ⽤的是UDP协议⽽不是TCP协议
这⼏天⽹上溜达突然看到这么⼀个提问,简单整理了下⽹上有⽤信息。
最佳答案
QQ既有UDP也有TCP!
不管UDP还是TCP,最终登陆成功之后,QQ都会有⼀个TCP连接来保持在线状态。这个TCP连接的远程端⼝⼀般是80,采⽤UDP⽅式登陆的时候,端⼝是8000。
纳米技术有哪些用途UDP协议是⽆连接⽅式的协议,它的效率⾼,速度快,占资源少,但是其传输机制为不可靠传送,必须依靠辅助的算法来完成传输控制。QQ采⽤的通信协议以UDP为主,辅以TCP协议。由于QQ的服务器设计容量是海量级的应⽤,⼀台服务器要同时容纳⼗⼏万的并发连接,因此服务器端只有采⽤UDP协议与客户端进⾏通讯才能保证这种超⼤规模的服务。
QQ客户端之间的消息传送也采⽤了UDP模式,因为国内的⽹络环境⾮常复杂,⽽且很多⽤户采⽤的⽅式是通过代理服务器共享⼀条线路上⽹的⽅式,在这些复杂的情况下,客户端之间能彼此建⽴起来TCP连接的概率较⼩,严重影响传送信息的效率。⽽UDP包能够穿透⼤部分的代理服务器,因此QQ选择了UDP作为客户之间的主要通信协议。
采⽤UDP协议,通过服务器中转⽅式。因此,现在的IP侦探在你仅仅跟对⽅发送聊天消息的时候是⽆法获取到IP的。⼤家都知道,UDP 协议是不可靠协议,它只管发送,不管对⽅是否收到的,但它的传输很⾼效。但是,作为聊天软件,怎么可以采⽤这样的不可靠⽅式来传输消息呢?于是,腾讯采⽤了上层协议来保证可靠传输:如果客户端使⽤UDP协议发出消息后,服务器收到该包,需要使⽤UDP协议发回⼀个应答包。如此来保证消息可以⽆遗漏传输。之所以会发⽣在客户端明明看到“消息发送失败”但对⽅⼜收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于⽹络原因没有收到服务器的应答包引起的。
后续补充
qq消息很多⼈提到keepalive,TCP⽆法感知⽹络中断这些问题。。。这个算是TCP⼀个容易踩的坑,但这并不能说明UDP就⽐TCP好(或者说解释为何要使⽤UDP)。因为在UDP上⾯⼀样需要⾯对这些问题,⽽解决这类问题的⽅法和在TCP上⾯进⾏应⽤层⼼跳的⽅法其实没有本质上的区别。⽽这就是为什么没有接触过这类问题的⼈会有题主提出的疑惑。
滨小步那么为什么呢?最本质上UDP的优势还是带宽的利⽤。这⼀切要回归到99~03年的⽹络状况,当时⽹络的特点就是接⼊带宽很窄⽽且抖动特别厉害。所谓抖动可能是多⽅⾯的,例如延时突发性地暴增、也有可能是由于路由层⾯的变化突然导致路由⿊洞,还各种等等等等的问题。TCP因为拥塞控制、保
土耳其旅游景点证有序等原因,在这种⽹络状态上对带宽的利⽤是⾮常低的。⽽且因为⽹络抖动的原因,应⽤层⼼跳超时(⼀般不依靠keepalive)应⽤层主动断掉socket之后TCP需要三次握⼿才能重新建⽴链接,⼀旦出现频繁的⼩抖动就会使得带宽利⽤更低。⽽等待四次挥⼿的时间,也会占⽤服务器上宝贵的资源。
总结来说,当⽹络差到⼀定程度了,TCP的优势反⽽会成为劣势。
字长这时候我们再看看UDP在这种情况下的表现。使⽤UDP对抗⽹络抖动,说到底就是在应⽤层⽐TCP更快地探测和重传,⼀旦超过⼀定的时间没有收到回复,客户端可以选择马上重试或者换⼀个IP:PORT重试(假如你的服务像QQ⼀样有多个接⼊),在服务器端则可以果断地断掉socket。⽽可以应⽤UDP的时候,往往是你的应⽤层协议本⾝已经具备了⼀定的⾯向连接的特性。如果你应⽤层的协议已经达到了⼀定程度的消息幂等,客户端可以⼏乎⽆脑地进⾏重传,这样就可以尽可能地降低⽹络抖动的影响,同时也可以尽可能地利⽤整个带宽。⽽刚好QQ的协议,就具备类似的特点。情话绵绵
简单来说就是我们可以使⽤UDP实现⼀个⾯向连接协议,这个协议可以很好地适应当时的⽹络状况和QQ本⾝的业务。但凡事都有成本,成本就是你的应⽤层协议本⾝需要去实现抵抗⽹络异常带来的问题。例如乱序、例如业务数据的分⽚和重组、例如⽹络状态探测等等等等。。。
⽽现在UDP也应⽤在很多跨运营商、跨地域、跨机房之间的服务调⽤当中。原因⽆它,就是⽹络烂到⼀定程度了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论