网络编程入门如此简单(五):UDP跟TCP相比,到底差了什么?
本文由悟空聊架构分享,有修订和排版优化。
1、引言
本文将通俗易懂地为你类比解释UDP与TCP的核心差异,包括如何基于UDP实现TCP的可靠传输:通过模拟三次握手、添加序列号与确认机制解决顺序和丢包问题,利用滑动窗口控制流量,并引入拥塞控制算法来动态调整发送速率等。
2、系列文章
本文是该系列文章中的第 5 篇:
- 《网络编程入门如此简单(一):假如你来设计网络,会怎么做?》
- 《网络编程入门如此简单(二):假如你来设计TCP协议,会怎么做?》
- 《网络编程入门如此简单(三):什么是IPv6?漫画式图文,一篇即懂!》
- 《网络编程入门如此简单(四):一文搞懂localhost和127.0.0.1》
- 《网络编程入门如此简单(五):UDP跟TCP相比,到底差了什么?》(* 本文)
3、写在前面
本题是我在面试中,技术总监问我的一道真题,当时答得不太好,所以把它揪出来总结了下。后来问了下总监,总监说这是阿里的面试题。。
其实面试官主要是想让我说出 UDP 和 TCP 的原理上的区别,怎么给 UDP 加些功能实现 TCP。
看好去很容易就能说出一两个 TCP 和 UDP 的区别,但如果能用女朋友都能听懂的方式该怎么说呢?
女朋友:我不想听课本上讲的!我听不懂呀~
下面我会以大白话的方式来解答上面的问题。
4、UDP协议的主要特点
1)沟通简单:
领导安排的任务,直接干就完了。
UDP 也是,相信网络世界永远是美好的,我发送的包是很容易送到的,接收方也是很容易组装的。数据结构也很简单,不需要大量的数据结构、处理逻辑、包头字段。
2)轻信他人:
测试人员报的 bug 我也不会和她争论什么,永远相信测试人员是对的,测试人员说啥就是啥,我改就是。
UDP 也是,不会建立连接,有个端口号,谁都可以监听这个端口号往上面发数据。也可以从这个端口号传给任何人数据。反正我只管发就是。
3)不会讨价还价:
产品经理昨天说手机壳需要根据心情变色,测试人员说这个 bug 要把关联的两个 bug 一起修掉。那就按照他们说的做吧!
UDP 也是,不懂坚持和退让。也就是根据网络情况进行拥塞控制。无论网络丢包多严重,我还是照样发~
5、UDP协议的使用场景
1)内部系统,任务简单,模块单一,不需要考虑代码的关联影响,即使失败了也没有关系。
UDP 也是,需要资源少,网络情况比较好的内网,或者对于丢包不敏感的应用。
2)有一个强力的团队支持,都是中高级开发、测试人员,团队成员打过很多年交道,互相信任。有什么问题,吼一嗓子就可以了!
UDP 也是,不需要一对一沟通来建立连接,可以广播的应用。
3)一个新项目,需要有激情,对于刚毕业的菜鸟,都是有很强的自主能动性的,也不会耍滑头,躲在厕所玩手机,带薪拉shi ?即使项目不忙,我也抓紧时间干。项目忙,还是一样干!
UDP 也是,猛着发包就是,主要应用在需要处理速度快,时延低,可以容忍少数丢包的情况。即使网络情况不佳,发包就是~
针对上面的三大场景,UDP 常用在实时竞技游戏,IoT 物联网,移动通信领域。
6、TCP协议的主要特点
6.1 面向连接
TCP 和 UDP 是传输层里面比较重要的两个协议。大部分面试的时候都会问到两者的区别。而大部分都会两句,比如 TCP 是面向连接的,UDP 是面向无连接。
那什么是面向连接?
TCP 三次握手是我们常常念叨和背诵的。而在这三次握手成功后,就是建立连接成功。
那什么又叫面向呢?
我们也常听到面向对象编程、面向切面编程、面向服务编程。那到底什么是面向?
在我看来 面向 就是遵循一定的协议、规范、数据结构等来做一系列事情。
比如面向连接,就是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据来保证所谓的面向连接的特性。
知道了 TCP 的是用三次握手来建立连接,那我们是否可以让 UDP 也发三个包来模拟 TCP 建立连接?可以是可以,但是如果只是建立,而不是面向连接,其实意义不大。
那 TCP 面向连接做了哪些事情?
TCP 提供可靠交付,通过 TCP 连接传输的数据,可以无差错、不丢失、不重复、并且按序到达。而 UDP 继承了 IP 包的特性,不保证不丢失,不保证按顺序到达。
6.2 面向字节流
TCP 是面向字节流,所谓字节流,就是发的是一个流,没头没尾。TCP 自己维护流状态。
UDP 基于 IP 数据报,一个一个地发,一个一个地收。
6.3 拥塞控制
TCP 拥有拥塞控制,如果包丢弃了或者网络环境不好了,就会根据网络情况自行控制自己的行为,看下是发快点还是发慢点。
UDP 则没有这么智能了, 你让我发,我就发呗,反正是你让我发的,其他的一概不管~
6.4 有状态服务
TCP 是一个有状态的服务,有状态可以理解为:我记录了哪些发送了,哪些没有发送,哪些接收到了,哪些没接收到,应该接收哪个了,一点差错都不行。TCP 干的事情可真多!
而 UDP 则不是有状态的服务,我只管发,其他的就交给接收端吧,有点任性是吧?
7、如何让UDP追上TCP的能力?
建立连接上面已经讲到了,三次握手和四次握手,UDP 也可以模拟去做。
那下面还有几个问题:
- 1)顺序问题;
- 2)丢包问题;
- 3)流量控制;
- 4)拥塞控制。
TCP 的数据结构长这样:
顺序问题和丢包问题可以利用确认与重发的机制。假如包收到了,可以做一个确认,发送一个 ACK 给发送端,告诉他我收到了。假如有的包提前到了,就缓存着。假如有包丢失了,就可以超时重试。超时重试不宜过短,时间必须大于往返时间 RTT,否则会引起不必要的重传。也不宜过长,如果超时时间过长,访问就变慢了。那怎么确定这个时间,可以通过采样 RTT 的时间,进行加权平均。还需要根据网络状况,动态变化。可以了解下自适应重传算法。
流量控制就是根据网络情况调整发包的速率。利用的是滑动窗口。在对于包的确认中,同时会携带一个窗口的大小,只要利用好这个窗口大小,就能很好地调整发包速率,发的报文段不要超过窗口的大小就 OK。
8、参考资料
[1] TCP/IP详解 - 第11章·UDP:用户数据报协议
[2] TCP/IP详解 - 第17章·TCP:传输控制协议
[4] 通俗易懂-深入理解TCP协议(下):RTT、滑动窗口、拥塞处理
[5] 快速理解TCP协议一篇就够
[6] 快速理解TCP和UDP的差异
[10] 假如你来设计网络,会怎么做?
[11] 假如你来设计TCP协议,会怎么做?
[12] 深入地理解UDP协议并用好它
[13] 如何让不可靠的UDP变的可靠?
[14] UDP比TCP高效?还真不一定!
[15] 可靠传输的TCP协议send成功就意味着数据一定发出去了?
[16] 为何基于TCP协议的移动端IM仍然需要心跳保活机制?
[17] 技术扫盲:新一代基于UDP的低延时网络传输层协议——QUIC详解
即时通讯技术学习:
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》
- 开源IM框架源码:https://github.com/JackJiang2011/MobileIMSDK(备用地址点此)
(本文已同步发布于:http://www.52im.net/thread-4897-1-1.html)
作者:Jack Jiang (点击作者姓名进入Github)
出处:http://www.52im.net/space-uid-1.html
交流:欢迎加入即时通讯开发交流群 215477170
讨论:http://www.52im.net/
Jack Jiang同时是【原创Java
Swing外观工程BeautyEye】和【轻量级开源移动端即时通讯框架MobileIMSDK】的作者,可前往下载交流。
本博文
欢迎转载,转载请注明出处(也可前往 我的52im.net 找到我)。





浙公网安备 33010602011771号