TCP协议(二)
数据结构
为了保证不丢包、不乱序,在收发两端的 TCP
还需要维护两个发送列表。
发送端

滑动窗口的大小应该小于等于 min(流量窗口, 拥塞窗口)
接收端

乱序和丢包问题
为了确定一个包是真的发送到,接收方需要发送一个带确认序号的应答包。应答包的机制有:
- 累计应答
- 确认序号为发送方发送的下个包的序号,理解为期待序号

如果发送方没有收到应答包,发送方会尽可能的尝试再次发送。触发重传的时机有:
超时,没有在规定的时间内收到带确认序号的应答包
- 初始重传时间:采用自适应重传算法,估计往返时间,采样RTT进行加权平均计算,且需要考虑波动范围
- 累计重传时间:多次重传会将重传时间设为之前的两倍,因为多次超时,网络环境差,避免拥塞
接收方主动触发
接受方连续3次发送冗余 ack,称快速重传
- 头部添加
SACK
,称Selective Acknowledgment
主动触发的方式会比超时重传更加快速解决丢包问题。
流量控制
流量控制是发送方考虑接收方的处理能力调整发送速率的机制,接收方的处理能力与下述两点有关:
- 自身的最大缓存量。是一个固定值
- 自身
TCP
层中缓存的未被应用层读取的数据长度。可接受量:最大缓存长度 - 应用层未读取数据长度
可接受量通过 TCP
头部中的 窗口大小
来通知对方调整发送速率.
低能窗口综合征
当接收方的
窗口大小
调整为0
时,发送方会发送探测数据包,查看是否有机会更新窗口大小。接收方这时要注意,需要等到可接收量恢复到一定大小再通知发送发,避免低能窗口综合征。
拥塞控制
TCP
开始发送数据时是无法得知网络情况的,为了避免一下把网络塞慢,TCP
采用了慢启动机制。

y
为可发送包的数量x
为已成功发送包的数量,即有应答的包的数量ssthresh
为slow start threshold,减速阀值
随着成功的包越来越多,可发送的数量呈指数增长,在到达一定值后,呈线性增长。但是当发生超时重传或则丢包后,这些值将会发生变化。不同的重传有不同的重置方法。
传统重传:y' = 1
,ssthresh' = y / 2
,x' = 0
快输重传:y' = y / 2
,ssthresh' = y
,x' = 0
,y 的公式修改为 y = ssthresh + x

快输重传算法不照常传输速率断崖式下降而导致网络卡顿。
优化
TCP BBR 拥塞算法,寻找高宽带与低时延的平衡点。