4.2 TCP 重传、滑动窗口、流量控制、拥塞控制
重传机制
通过序列号与确认应答。保证发送的包一定被接受,TCP 针对数据包丢失的情况,会用重传机制解决。常见的重传机制有
- 超时重传
- 在发送数据时,当超过指定的时间没有收到对方的
ACK确认应答报文,就会重发该数据。- 原因可能是数据包丢失或者确认应答丢失
- RTT 表示数据发送到收到确认的差值,RTO是超时重传时间,通常略大于RTT,并且通过RTT的变化动态调整
- 在发送数据时,当超过指定的时间没有收到对方的
滑动窗口
- 操作系统开辟的一个缓存空间
- 发送方主机只有在收到确认应答后会将发送数据从缓存区清除
- 接收方主机缓存
- 已收到并确认的数据,等待应用读取
- 剩余空间
- 窗口大小由接收方通过 TCP 头中的
Window字段告知发送方,表示自己最大接受能力,两行滑窗基本一致,因为传输有时延,所以是约等于
流量控制
- 发送方按照接收方窗口大小调整自己窗口大小
拥塞控制
避免「发送方」的数据填满整个网络。
- 拥塞窗口(cwnd):发送方根据网络的拥塞程度维护的一个的状态变量,网络越好,窗口越大。
- 发送窗口的值是= min(拥塞窗口, 接收窗口)
- 拥塞定义:发送方规定时间内没有收到确认报文 控制算法如下:
- 慢启动:TCP 刚建立时,每次收到一个确认报文,拥塞窗口大小增加 1
- 第一次发送收到一个 ack,增加到 2,第二次到 4(指数增长)
- 当达到慢启动门限值,启动拥塞避免算法
- 拥塞避免:没收到一个确认报文,拥塞窗口大小增加 1 / cwnd
- 由指数增长变成了线性增长,增速放缓
- 拥塞发生:当触发了重传机制(规定时间未收到确认包)
- 将慢启动门限值设置为当前拥塞窗口的一半
- 拥塞窗口重置为初始值(Linux的初始值为10),再次进行慢启动
快速恢复
发生了「快速重传」(能收到3个重复的ACK)的拥塞发生算法
拥塞窗口减少到原来的一半;
慢启动门限值设置为当前拥塞窗口值(也就是发生重传时的一半)
进入快速恢复算法:
拥塞窗口 = 慢启动门限值 + 重复收到ack的数量
重传丢失的数据包;
如果再收到重复的 ACK,那么拥塞窗口每次增加 1;
如果收到新数据的 ACK 后,把拥塞窗口设置为第一步中的慢启动门限值;
- 这里拥塞窗口又回到慢启动门限值,是因为快速恢复是为了尽快将丢失的数据包发给目标
- 快速恢复是拥塞发生后慢启动的优化,最后还是要降低拥塞窗口进入拥塞避免,只是没有那么剧烈
