「 计算机网络 」说说TCP和UDP的区别及其应用场景
参考&鸣谢
一、TCP/IP模型
计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。
TCP/IP 是互联网相关的各类协议族的总称,比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。
TCP/IP模型是互联网的基础,它是一系列网络协议的总称。这些协议可以划分为四层,分别为链路层、网络层、传输层和应用层。
- 链路层:负责封装和解封装IP报文,发送和接受ARP/RARP报文等。
- 网络层:负责路由以及把分组报文发送给目标网络或主机。
- 传输层:负责对报文进行分组和重组,并以TCP或UDP协议格式封装报文。
- 应用层:负责向用户提供应用程序,比如
HTTP、FTP
、Telnet、DNS、SMTP等。
在网络体系结构中网络通信的建立必须是在通信双方的对等层进行,不能交错。 在整个数据传输过程中,数据在发送端时经过各层时都要附加上相应层的协议头和协议尾(仅数据链路层需要封装协议尾)部分,也就是要对数据进行协议封装,以标识对应层所用的通信协议。接下去介绍TCP/IP 中有两个具有代表性的传输层协议----TCP 和 UDP。
二、UDP
UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。
它有以下几个特点:
相较于TCP,UDP的特点可以归纳为:实时性高、资源占用少、基于数据报。
实时性高
在遇到网络拥塞时,UDP协议可以在应用层控制重传策略,减少重传间隔,超时时间后无法发送的数据直接丢弃。
资源占用少
UDP通信双方不需要保持长连接状态,没有三次挥手/四次挥手的过程,通信双方无需为了保持连接状态消耗资源。
基于数据报
UDP协议不会对应用层发送的数据进行拆分、合并,直接以数据报的形式发送到网络中。因此,使用UDP通信的双方协商好发送/接收的数据长度,才能完整的收发数据,并且一次数据发送必须对应一次数据接收。
头部开销小
UDP 头部包含了以下几个数据:
- 两个十六位的端口号,分别为源端口(可选字段)和目标端口
- 整个数据报文的长度
- 整个数据报文的检验和(IPv4 可选 字段),该字段用于发现头部信息和数据中的错误
因此 UDP 的头部开销小,只有八字节,相比 TCP 的至少二十字节要少得多,在传输数据报文时是很高效的
有单播、多播、广播的功能
UDP 不止支持一对一的传输方式,同样支持一对多,多对多,多对一的方式,也就是说 UDP 提供了单播,多播,广播的功能。
三、TCP
当一台计算机想要与另一台计算机通讯时,两台计算机之间的通信需要畅通且可靠,这样才能保证正确收发数据。例如,当你想查看网页或查看电子邮件时,希望完整且按顺序查看网页,而不丢失任何内容。当你下载文件时,希望获得的是完整的文件,而不仅仅是文件的一部分,因为如果数据丢失或乱序,都不是你希望得到的结果,于是就用到了TCP。
TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议
,由 IETF 的RFC 793定义。TCP 是面向连接的、可靠的流协议。流就是指不间断的数据结构,你可以把它想象成排水管中的水流。
面向连接
使用TCP协议通信的双方在传输数据之前,必须先建立一对一的连接,并且这个连接是全双工的,双方可以在一个连接上完成数据读/写,完成数据交互后,双方必须断开连接以释放系统资源。所以,在这期间通信双方会产生资源开销以维护、管理连接的状态(读写缓冲区、定时器等等)。
字节流传输
基于字节流传输的数据没有长度限制,就像一根无限长的水管一样,数据可以源源不断的从通信的一端流向另一端,发送端可以逐个字节的向数据流中写入数据,接收端也可以逐个字节的从数据流中读出数据。TCP通信双方的读/写数据次数不一定相等,发送端在连续进行写操作时,TCP模块会先将数据放入TCP发送缓冲区,等待真正发送数据的时候,将发送缓冲区中的数据组成一个或者多个报文段发出。同样地,接收端也拥有TCP接收缓冲区,接收端收到一个或多个报文段后按序依次放入接收缓冲区,可以一次性读取全部数据或分多次读取,这取决于用户指定的读缓冲区大小。
可靠传输
TCP是可靠传输依赖于以下几种机制:应答机制、超时重传、拥塞控制。
- 应答机制
即TCP三次握手、四次挥手,发送端发送的每个TCP报文段都必须得到接收端的应答,才认为这个报文段传输成功。
- 超时重传
TCP模块为每一个TCP报文段都维护一个重传定时器,发送端发出报文后启动重传定时器,在定时时间未收到应答,则重新发送该报文段。(关于重传定时器的定时时间以及如何重传都依赖于内核指定的重传策略,此处不做讨论)。
- 拥塞控制
拥塞控制其实分为两部分,一部分是拥塞发生之前避免拥塞发生(慢启动、拥塞避免),另一部分是拥塞发生之后解决拥塞(快速重传、快速恢复)。
i.慢启动。TCP连接成功建立后,并不清楚网络的状况,以慢启动的方式更加平滑的发送数据,假设发送端此时最多发送X个报文段,此后每成功接受到一次确认信息都线性增大X的值。
ii.拥塞避免。由于慢启动会不断增加发送报文段的数量X,X越来越大必然会导致网络拥塞,因此TCP中定义了慢启动门限值来限制X的值,当超过门限值时,将启用拥塞避免算法,来减缓X的增大。
iii.快速重传。发送端连续收到三个重复的确认后重新发送丢失的报文段,并且减小慢启动门限值,避免拥塞。(引起接收端发送连续确认的原因可能有:报文段丢失、收到的报文段乱序)
iiii.快速恢复。当收到新数据的确认时,恢复因快速重传修改的慢启动门限值为初始状态。
仅支持单播传输
每条TCP传输连接只能有两个端点,只能进行点对点的数据传输,不支持多播和广播传输方式。
提供全双工通信
TCP允许通信双方的应用程序在任何时候都能发送数据,因为TCP连接的两端都设有缓存,用来临时存放双向通信的数据。当然,TCP可以立即发送一个数据段,也可以缓存一段时间以便一次发送更多的数据段(最大的数据段大小取决于MSS)
四、使用场景
五、小结
对比
UDP | TCP | |
---|---|---|
是否连接 | 无连接 | 面向连接 |
是否可靠 | 不可靠传输,不使用流量控制和拥塞控制 | 可靠传输,使用流量控制和拥塞控制 |
连接对象个数 | 支持一对一,一对多,多对一和多对多交互通信 | 只能是一对一通信 |
传输方式 | 面向报文 | 面向字节流 |
首部开销 | 首部开销小,仅8字节 | 首部最小20字节,最大60字节 |
适用场景 | 适用于实时应用(IP电话、视频会议、直播等) | 适用于要求可靠传输的应用,例如文件传输 |
TCP 和 UDP 的优缺点无法简单地、绝对地去做比较:TCP 用于在传输层有必要实现可靠传输的情况; 而在一方面,UDP 主要用于那些对高速传输和实时性有较高要求的通信或广播通信。TCP 和 UDP 应该根据应用的目的按需使用。