很多人提到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既有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协议发回一个应答包。如此来保证消息可以无遗漏传输。之所以会发生在客户端明明看到“消息发送失败”但对方又收到了这个消息的情况,就是因为客户端发出的消息服务器已经收到并转发成功,但客户端由于网络原因没有收到服务器的应答包引起的。
**补充(TCP拥塞控制)
使用最广泛的基于终端的拥塞控制方法是TCP协议的拥塞控制算法。TCP是目前在互联网中使用最广泛的传输协议。广义的来讲,TCP拥塞控制的概念是每个源端判断当前网络中有多少可用容量,从而知道它可以安全完成传送的分组数。一旦某个源端有这么多分组在传送,它用确认(ACK)信号的到达表明它有一个分组已经离开网络,因而它不需要增加拥塞级别就可以安全地向网络中发送一个新的分组,通过使用确认信息来协调分组的传送,TCP称为自同步(self-clocking)的。
TCP拥塞控制机制包括慢启动(slow start)、拥塞避免、快速重传(fast retransmit)、快速恢复(fast recovery)、选择性应答(SACK)等。通过在终端上对网络的拥塞情况作出适当的调整,可以大大提高网络传输的性能,减少拥塞发生的可能性。
TCP中使用的拥塞控制算法已经成为保证目前互联网稳定性的重要因素。
##可靠的UDP再负载网络环境下比tcp传输效率更高
http://bbs.utest.qq.com/631?uid=172f5dbc9efc4dc7b72f3cc13fc7f3c0 一篇很好的文章
https://blog.wilddog.com/?p=668 比较tcp和udp应用场景
随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP,如网页浏览、流媒体、实时游戏、物联网。
1,网速的提升给UDP稳定性提供可靠网络保障
CDN服务商Akamai(NASDAQ: AKAM)报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍。网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。
2,对比测试结果UDP性能优于TCP
为了提升浏览速度,Google基于TCP提出了SPDY协议以及HTTP/2。Google在Chrome上实验基于UDP的QUIC协议,传输速率减少到100ms以内。

Google采用QUIC后连接速率能有效提升75%。
Google搜索采用QUIC后页面加载性能提升3%。
YouTube采用QUIC后重新缓冲次数减少了30%。
3, TCP设计过于冗余,速度难以进一步提升
TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。由于TCP内置在系统协议栈中,极难对其进行改进。

4, UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP
4.1 网页浏览
使用UDP协议有三个优点 :
- 能够对握手过程进行精简,减少网络通信往返次数;
- 能够对TLS加解密过程进行优化;
- 收发快速,无阻塞。
4.2 流媒体
采用TCP,一旦发生丢包,TCP会将后续包缓存起来,等前面的包重传并接收到后再继续发送,延迟会越来越大。基于UDP的协议如WebRTC是极佳的选择。
2010年google 通过收购 Global IP Solutions,获得了WebRTC(网页实时通信,Web Real-Time Communication)技术,用于提升网页视频速率。
4.3 实时游戏
对实时要求较为严格的情况下,采用自定义的可靠UDP协议,比如Enet、RakNet(用户有sony online game、minecraft)等,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。
采用UDP的经典游戏如FPS游戏Quake、CS,著名的游戏引擎Unity3D采用的也是RakNet。
4.4 物联网
2014年google旗下的Nest建立Thread Group,推出了物联网通信协议Thread,完善物联网通信。

采用UDP有3个关键点:
- 网络带宽需求较小,而实时性要求高;
- 大部分应用无需维持连接;
- 需要低功耗。
小结
如今全球将近50%的人都在使用互联网,人们不断的追求更快、更好的服务,一切都在变化,在越来越多的领域,UDP将会抢占TCP的主导地位。