TCP重传 滑动窗口 流量控制 拥塞控制
学习资源 小林coding 2022.4.7
重传机制
TCP实现可靠传输的方式之一 通过序列号与确认应答
TCP 当发送端的数据到达接受主机时 接收端主机回返回一个确认应答消息
表示已收到消息
TCP针对数据包丢失的情况 会使用重传机制
解决
常见的重传机制
- 超时重传
- 快速重传
- SACK
- D-SACK
超时重传
在发送数据时 设定一个定时器 超过时间没有收到对方的ACK确认 就会重发该数据
- 数据包丢失
- 确认应答丢失
超时时间应该设置为多少
RTT(往返时间)
RTT是数据从网络一段传送到另一端所需的时间 也就是包的往返时间
超时重传时间是以RTO(超时重传时间)表示
- RTO较大 重发慢 没有效率 性能差
- RTO较小 没有丢就重发 重发快 增加网络拥塞 导致更多超市
- RTO的值应略大于报文往返RTT的值
RTO的值是一个动态变化的值
Linux如何计算RTO
-
需要TCP通过采样RTT的时间 然后进行加权平均 算出平滑RTT值 值是不断变化的
-
采样RTT的波动范围
超时重传策略:
超时间隔加倍
每当遇到一次超时重传的时候 都会下一次超时时间间隔设为先前值的两倍
两次超时 就说明网络环境差 不适宜频繁发送
快速重传
TCP还有快速重传机制
不以时间为驱动 以数据驱动重传
- Seq2没收到 ACK回2
- 发送端收到了三个ACK=2的确认 直到Seq2还没有收到 就会在定时器国企之前 重传丢失的Seq2
- 问题:
重传之前的一个 还是重传所有的问题
SACK方法
SACK Selective Acknowledgement 选择性确认
需要在TCP头部选项中加一个SACK
字段 将缓存的地图发送给发送方
只重传丢失的数据
要支持SACK 在linux下
net.ipv4.tcp_sack
linux2.4之后默认打开
Duplicate SACK
使用SACK告诉发送方 有哪些数据被重复接受了
- ACK丢包
- 发现收到数据是重复的 返回SACK
- 网络延时
- SACK 与 ACK对比
- SACK > ACK 说明网络延迟 收到了重复的包
D-SACK好处
- 让发送方知道 是发出去的包丢了 还是接收方回应的ACK包丢