TCP与UDP
chenpeng 2021-04-30 TCP
# TCP 与 UDP 的比较
| TCP | UDP | |
|---|---|---|
| 是否连接 | 面向连接 | 无连接 |
| 是否可靠 | 可靠传输,使用流量控制和拥塞控制 | 不可靠传输,使用流量控制和拥塞控制 |
| 连接对象个数 | 只能是一对一通信 | 支持一对一、一对多、多对一和多对多通信 |
| 传输方式 | 面向字节流 | 面向报文 |
| 首部开销 | 首部最小20字节,最大60字节 | 首部开销小,仅8字节 |
| 适用场景 | 适用于要求可靠传输的应用,例如文件传输 | 适用于实时应用(视频、直播等) |
# TCP 的流量控制与拥塞控制
# 流量控制
流量控制是指如果发送者发送数据过快,接收者来不及丢失,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使接收者来得及接收。
流量控制的目的是防止分组丢失,它是构成TCP可靠性的一方面。
如何实现流量控制?
由滑动窗口协议(连续ARQ协议)实现,滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式是接收者返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送者的数据发送。
流量控制引发的死锁?怎么避免死锁的发生?
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。但是如果这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。 为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。
# 拥塞控制
拥塞控制是作用域网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况。
拥塞控制的算法
- 慢开始算法
- 拥塞避免算法
- 快重传算法
- 快恢复算法