默认
打赏 发表评论 18
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势
阅读(148338) | 评论(18 收藏11 淘帖2
微信扫一扫关注!

本文观点仅作参考,请根据自已系统的应用场景合理地选择数据传输层协议即可,无需盲目崇拜大牛言论。


1、前言


对于即时通讯开者新手来说,在开始着手编写IM或消息推送系统的代码前,最头疼的问题莫过于到底该选TCP还是UDP作为传输层协议。本文延续《网络编程懒人入门》系列文章的风格,通过快速对比分析 TCP 和 UDP 的区别,来帮助即时通讯初学者快速了解这些基础的知识点,从而在IM、消息推送等网络通信应用场景中能准确地选择合适的传输层协议。

随着网络技术飞速发展,网速已不再是传输的瓶颈,UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP,如网页浏览、流媒体、实时游戏、物联网。本文作为《网络编程懒人入门》系列文章的第5篇,将为您快速梳理UDP协议在某些场景下对比TCP协议所具有的优势。

另外,即时通讯网的文章:《简述传输层协议TCP和UDP的区别》、《为什么QQ用的是UDP协议而不是TCP协议?》、《移动端即时通讯协议选择:UDP还是TCP?》,更详细地阐述了类似的内容,可以为您提供更多的参考。

2、系列文章


本文是系列文章中的第4篇,本系列文章的大纲如下:


本站的《脑残式网络编程入门》也适合入门学习,本系列大纲如下:


如果您觉得本系列文章过于基础,可直接阅读《不为人知的网络编程》系列文章,目录如下:


关于移动端网络特性及优化手段的总结性文章请见:


3、参考资料


TCP/IP详解 - 第11章·UDP:用户数据报协议
TCP/IP详解 - 第17章·TCP:传输控制协议
TCP/IP详解 - 第18章·TCP连接的建立与终止
TCP/IP详解 - 第21章·TCP的超时与重传
通俗易懂-深入理解TCP协议(上):理论基础
通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
理论经典:TCP协议的3次握手与4次挥手过程详解
理论联系实际:Wireshark抓包分析TCP 3次握手、4次挥手过程
技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)
计算机网络通讯协议关系图(中文珍藏版)
高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少
高性能网络编程(二):上一个10年,著名的C10K并发连接问题
高性能网络编程(三):下一个10年,是时候考虑C10M并发问题了
高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索
简述传输层协议TCP和UDP的区别
UDP中一个包的大小最大能多大?
为什么QQ用的是UDP协议而不是TCP协议?
移动端即时通讯协议选择:UDP还是TCP?

4、网速的提升给UDP稳定性提供可靠网络保障


CDN服务商Akamai报告从2008年到2015年7年时间,各个国家网络平均速率由1.5Mbps提升为5.1Mbps,网速提升近4倍。网络环境变好,网络传输的延迟、稳定性也随之改善,UDP的丢包率低于5%,如果再使用应用层重传,能够完全确保传输的可靠性。

5、对比测试结果UDP性能优于TCP


为了提升浏览速度,Google基于TCP提出了SPDY协议以及HTTP/2。Google在Chrome上实验基于UDP的QUIC协议,传输速率减少到100ms以内。

网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势_1.png

  • Google采用QUIC后连接速率能有效提升75%;
  • Google搜索采用QUIC后页面加载性能提升3%;
  • YouTube采用QUIC后重新缓冲次数减少了30%。

6、TCP设计过于冗余,速度难以进一步提升


TCP为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。由于TCP内置在系统协议栈中,极难对其进行改进。

7、UDP协议以其简单、传输快的优势,在越来越多场景下取代了TCP


7.1网页浏览


使用UDP协议有三个优点 :

  • 能够对握手过程进行精简,减少网络通信往返次数;
  • 能够对TLS加解密过程进行优化;
  • 收发快速,无阻塞。

7.2流媒体


采用TCP,一旦发生丢包,TCP会将后续包缓存起来,等前面的包重传并接收到后再继续发送,延迟会越来越大。基于UDP的协议如实时音视频开源工程WebRTC是极佳的选择。

2010年google 通过收购 Global IP Solutions,获得了WebRTC(网页实时通信Web Real-Time Communication)技术,用于提升网页视频速率。关于WebRTC的介绍,请见:《访谈WebRTC标准之父:WebRTC的过去、现在和未来》,更多WebRTC文章点此进入

7.3实时游戏


对实时要求较为严格的情况下,采用自定义的可靠UDP协议,比如Enet、RakNet(用户有 sony online game、minecraft)等,自定义重传策略,能够把丢包产生的延迟降到最低,尽量减少网络问题对游戏性造成的影响。

采用UDP的经典游戏如FPS游戏Quake、CS,著名的游戏引擎Unity3D采用的也是RakNet。

7.4物联网


2014年google旗下的Nest建立Thread Group,推出了物联网通信协议Thread,完善物联网通信。

网络编程懒人入门(五):快速理解为什么说UDP有时比TCP更有优势_3.jpg

采用UDP有3个关键点:

  • 网络带宽需求较小,而实时性要求高;
  • 大部分应用无需维持连接;
  • 需要低功耗。

8、本文小结


如今全球将近50%的人都在使用互联网,人们不断的追求更快、更好的服务,一切都在变化,在越来越多的领域,UDP将会抢占TCP的主导地位。

附录:更多高性能网络编程文章


Java新一代网络编程模型AIO原理及Linux系统AIO介绍
有关“为何选择Netty”的11个疑问及解答
开源NIO框架八卦——到底是先有MINA还是先有Netty?
选Netty还是Mina:深入研究与对比(一)
选Netty还是Mina:深入研究与对比(二)
NIO框架入门(一):服务端基于Netty4的UDP双向通信Demo演示
NIO框架入门(二):服务端基于MINA2的UDP双向通信Demo演示
NIO框架入门(三):iOS与MINA2、Netty4的跨平台UDP双向通信实战
NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
Netty 4.x学习(一):ByteBuf详解
Netty 4.x学习(二):Channel和Pipeline详解
Netty 4.x学习(三):线程模型详解
Apache Mina框架高级篇(一):IoFilter详解
Apache Mina框架高级篇(二):IoHandler详解
MINA2 线程原理总结(含简单测试实例)
Apache MINA2.0 开发指南(中文版)[附件下载]
MINA、Netty的源代码(在线阅读版)已整理发布
解决MINA数据传输中TCP的粘包、缺包问题(有源码)
解决Mina中多个同类型Filter实例共存的问题
实践总结:Netty3.x升级Netty4.x遇到的那些坑(线程篇)
实践总结:Netty3.x VS Netty4.x的线程模型
详解Netty的安全性:原理介绍、代码演示(上篇)
详解Netty的安全性:原理介绍、代码演示(下篇)
详解Netty的优雅退出机制和原理
NIO框架详解:Netty的高性能之道
Twitter:如何使用Netty 4来减少JVM的GC开销(译文)
绝对干货:基于Netty实现海量接入的推送服务技术要点
Netty干货分享:京东京麦的生产级TCP网关技术实践总结
>> 更多同类文章 ……

(原文链接:https://yq.aliyun.com/articles/88122,有改动)

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

上一篇:新手请教 tcp udp nat穿透问题下一篇:不为人知的网络编程(七):如何让不可靠的UDP变的可靠?

本帖已收录至以下技术专辑

推荐方案
评论 18
学习了,这样的文章真适合我这种超懒的人
签名: 秋天到了,终于凉快了
UDP在编程上很轻量,还是能做很多事的
签名: 该会员没有填写今日想说内容.
学习了
签名: 大家好
头像文件找不到了,服务器报403错误
引用:liu1348789134 发表于 2017-12-21 11:06
头像文件找不到了,服务器报403错误

已经修复
学习了学习了
非常适合我这种懒人
签名: 生活本无所谓,但是却惹尘埃
引用:haswhere 发表于 2018-06-08 09:45
非常适合我这种懒人

哈哈
学习了,UDP在某些特定领域确实比TCP更有优势!
引用:登至必极 发表于 2018-06-27 08:53
学习了,UDP在某些特定领域确实比TCP更有优势!

tcp在移动网络里,确实不是那么灵活,毕竟tcp出来的时候从没想过有一天无线网会这么发达
5G来了,用UDP会有优势吗
引用:cyc 发表于 2019-03-08 11:19
5G来了,用UDP会有优势吗

这跟是不是5G没关系吧
引用:JackJiang 发表于 2019-03-08 12:30
这跟是不是5G没关系吧

5G传送的带宽不是会更宽吗,这样网络拥堵情况应该会有很多改善吧?
可以 很通俗易懂
签名: 冒个泡
谢谢楼主的分享
学习了,感谢
上一章不是说不确定用什么的时候就用TCP吗,这章反而有种UDP逆袭的感觉
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部