TCP
和 UDP
都是传输层协议,他们都属于 TCP/IP
协议族。
#TCP
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
#TCP 的特点
- 面向连接
面向连接指的是在发送数据之前必须通过“三次握手”建立连接,这样能够建立可靠连接,为数据传输提供稳定的字节流服务。
- 仅支持单播传输
每条 TCP
连接都必须是一对一的。
- 面向字节流
字节流服务是指,为了方便传输,将大块数据分割成以报文段 segment
为单位的数据包进行管理。
- 可靠传输
对于可靠传输,判断丢包,误码靠的是客户端和服务端发出的 TCP
序号和确认号 ACK
。TCP
为了保证报文传输的可靠,就给每个包一个序号,同时序号也保证了传送到接收端实体的包的按序接收。然后接收端实体对已成功收到的字节发回一个相应的确认 ACK
;如果发送端实体在合理的往返时延 2MSL
内未收到确认,那么对应的丢失的数据将会被重传。
- 拥塞控制
TCP
能够计算当前网络的传输速率,根据它去调整数据包的传输速率,丢包概率小。
- TCP 提供全双工通信
TCP
允许通信双方的应用程序在任何时候都能发送数据。TCP
连接的两端都设有发送缓存和接收缓存,用来临时存放双向通信的数据。
#UDP
用户数据报协议 (UDP,User Datagram Protocol)是一种面向无连接的协议。
#UDP 特点
- 面向无连接
UDP
不像 TCP
是基于连接才能发送数据的,UDP
发送数据不需要建立连接,所以 UDP
比 TCP
的速度更快。
- 有单播,多播,广播的功能
多播、广播是指,服务器接收多个数据包,其数据包在发送时不需要等待回应,因此多播、广播发送的数据是不稳定且容易丢失的。
- 面向报文
UDP
发送数据包时不像 TCP
会将数据包拆分成数据片段 segment
,UDP
对于应用端交下来的报文既不合并也不拆分,而是将报文主体发送给服务端,发送时,UDP
是无序发送数据包,服务端并不知道哪个数据先来。
- 不可靠性
首先不可靠性体现在无连接上,通信都不需要建立连接,想发就发,这样的情况肯定不可靠。
并且收到什么数据就传递什么数据,并且也不会备份数据,发送数据也不会关心对方是否已经正确接收到数据了。
再者网络环境时好时坏,但是 UDP
因为没有拥塞控制,一直会以恒定的速度发送数据。即使网络条件不好,也不会对发送速率进行调整。这样实现的弊端就是在网络条件不好的情况下可能会导致丢包,但是优点也很明显,在某些实时性要求高的场景(比如直播、视频会议)就需要使用 UDP
而不是 TCP
。
- 传输数据高效性
UDP
的头部开销小,只有8字节,相比 TCP
的至少20-60字节要少得多,在传输数据报文时是很高效的
#TCP和UDP的比较
对比 | TCP | UDP |
---|---|---|
连接方式 | 面向连接 | 无连接 |
是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,不使用流量控制和拥塞控制 |
连接对象个数 | 只能是一对一通信 | 支持一对一,一对多,多对一和多对多交互通信 |
首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
适用场景 | 适用于要求可靠传输的应用,例如文件传输 | 直播,视频聊天 |