一. 前言
UDP和TCP是我们常用的网络通信协议,两者的区别导致了其不同的应用场景,两者的优缺点互补的特点导致了二者互相借鉴优化,从而出现了可靠UDP和TCP的优化算法。这里简单的记录个人在学习UDP/TCP的过程中的一些感想,并简单的做一个知识总结,不完善、错误的地方会逐步改进不断更新。
本篇介绍UDP和TCP的特点以及他们为何如此设计,后文逐步介绍TCP30年以来的优化、发展过程以及可靠UDP的发展,最后给出一些个人对于使用、开发可靠UDP的经验和感想。
二.UDP和TCP的特点及设计思路
说到UDP和TCP的优缺点,大部分人都能给出答案(这也是面试常见的一个问题,划重点):
- 基于连接与无连接
- 对系统资源的要求(TCP较多,UDP少)
- UDP程序结构较简单
- 流模式与数据报模式
- TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证
对于TCP,很多人直观的感觉就是复杂的状态机,较长的包头,怎么优化也做不好的拥塞控制算法,各种定时器,重传的设计等等,这里从开发者的角度谈一下为什么要做这些设计,比起死记硬背这样也许更易于理解和记忆,也更容易对其问题进行分析和优化。
首先我们要知道TCP即传输控制协议,要做的核心思想就是可靠传输,即可以控制的传输。因此,我们需要解决以下几个问题:
-
是否收到,是否回复,以及包的正确性和顺序性需要得到保证
针对这个问题,TCP
(1)采用了三次握手保证成功建立连接
(2)在包头部分加入序号和标记位,用以握手、挥手、数据的发送,并且可以记录包的正确性和顺序
(3)设计了重传定时器用以完成重传操作,通过ACK的收到来判断是否丢包,丢包则重传
(4)通过滑动窗口来允许一定的乱序同时提高传输速率 -
若网络拥塞如何及时处理
针对这个问题,TCP
(1)设置了滑动窗口和拥塞窗口,通过拥塞窗口大小的控制来调节传输速率
(2)采用了慢开始、快恢复以及后续各种优化的拥塞控制算法来进行拥塞处理
(3)设计缓冲区队列和缓冲区算法 -
若发生网络断开如何处理
针对这个问题,TCP
(1)设计坚持定时器处理零窗口通知
(2)设计保活计时器探测客户端状态
(3)对于正常断开过程采用四次挥手完成
(4)对于四次挥手设计了时间等待计时器
关于每一点的具体内容就不做展开介绍了,可以阅读TCP/IP详解深入学习。TCP的复杂性来源于其既要保证可靠又要尽可能提高性能,而往往越是复杂的东西问题就越多,这也就带来了TCP不断地优化以及采纳TCP优点而不带其缺点的可靠UDP的研究工作。
三. 拥塞控制
三.总结
本文较为简单的总结了TCP和UDP的特点,之后将会对TCP的优化过程进行梳理。