四 网络编程懒人入门:快速理解TCP和UDP的差异

1、前言
对于即时通讯开发者新手来说 , 在开始着手编写IM或消息推送系统的代码前 , 最头疼的问题莫过于到底该选TCP还是UDP作为传输层协议 。本文延续《网络编程懒人入门》系列文章的风格 , 通过快速对比分析 TCP 和 UDP 的区别 , 来帮助即时通讯初学者快速了解这些基础的知识点 , 从而在IM、消息推送等网络通信应用场景中能准确地选择合适的传输层协议 。
即时通讯网的另一篇文章《简述传输层协议TCP和UDP的区别》也阐述了类似的内容 , 希望能为您提供更多的参考 。
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次挥手过程详解》
《理论联系实际:抓包分析TCP 3次握手、4次挥手过程》
《技术往事:改变世界的TCP/IP协议(珍贵多图、手机慎点)》
《计算机网络通讯协议关系图(中文珍藏版)》
《高性能网络编程(一):单台服务器并发TCP连接数到底可以有多少》
《高性能网络编程(二):上一个10年 , 著名的C10K并发连接问题》
《高性能网络编程(三):下一个10年 , 是时候考虑C10M并发问题了》
《高性能网络编程(四):从C10K到C10M高性能网络应用的理论探索》
《简述传输层协议TCP和UDP的区别》
《UDP中一个包的大小最大能多大?》
《为什么QQ用的是UDP协议而不是TCP协议?》
《移动端即时通讯协议选择:UDP还是TCP?》
4、建立连接方式的差异 4.1TCP
说到 TCP 建立连接 , 相信大多数人脑海里肯定可以浮现出一个词 , 没错就是“三次握手” 。TCP 通过“三次握手”来建立连接 , 再通过“四次挥手”断开一个连接 。在每次挥手中 TCP 做了哪些操作呢?
流程如下图所示(TCP的三次握手和四次挥手):

四  网络编程懒人入门:快速理解TCP和UDP的差异

文章插图
上图就从客户端和服务端的角度 , 清楚的展示了 TCP 的三次握手和四次挥手 。可以看到 , 当 TCP 试图建立连接时 , 三次握手指的是客户端主动触发了两次 , 服务端触发了一次 。
我们可以先明确一下 TCP 建立连接并且初始化的目标是什么呢?
所以三次握手的次序是这样子的:
其中的 2 、3 步骤可以简化为一步 , 也就是说将 ACK 确认包和 SYN 序列化包一同发送给端 。到此我们就比较简单的解释了 TCP 建立连接的“三次握手” 。
4.2 UDP
我们都知道 TCP 是面向连接的、可靠的、有序的传输层协议 , 而 UDP 是面向数据报的、不可靠的、无序的传输协议 , 所以 UDP 压根不会建立什么连接 。
就好比发短信一样 , UDP 只需要知道对方的 ip 地址 , 将数据报一份一份的发送过去就可以了 , 其他的作为发送方 , 都不需要关心 。