TCP的稳定性:滑动窗口和流速控制是怎么回事?

TCP利用发送字节数和接收字节数,这个二元祖的唯一性保证顺序,那么如何在保证顺序的基础上,同时追求更高的吞吐量。

TCP 作为一个传输层协议,最核心的能力是传输,

传输需要保证可靠性,还需要控制流速,这两个核心能力均有滑动窗口提供

请求和响应模型

TCP中每个发送请求都需要响应,如果一个请求没有收到响应,发送方就会认为这次发送出现了故障,会触发重发。

每一个请求收到响应之后在发送下一个请求,吞吐量会很低,会产生网络的空闲时间,说白了就是浪费宽带,意味着可以同时发送更多的请求,接收更多的响应。

TCP 请求/响应模型(吞吐量低)

请添加图片描述

一种改进的方式就是让发送方有请求发送出去,而不是等待响应。通过这样的处理方式,发送的数据连接在一起了,响应的数据也连接在一起。吞吐量就提升了。

请添加图片描述

但是如果可以同时发送的数据真的非常多呢?比如成千个TCP段都需要发送,这个时候宽带可能不足,如下图,很多个数据封包都需要发送,该如何处理呢?

请添加图片描述

排队

这种情况下我们通常会考虑排队机制。

请添加图片描述

考虑这样一个模型,TCP实现一个队列,
1.新元素从队列的一端排队,作为一个未发送的数据封包。
2.开始发送数据封包,从队列的右侧离开,
3.这样就需要多个队列,我们将未发送的数据从队列中取出,加入发送中的队列,
4.然后将发送中的数据,收到ACK的部分取出,放入已接收的队列,而发送中的封包,

何时收到ACK是一件不确定的事情,这样使用队列似乎有一定的问题。

滑动窗口

算法

数组,少量的指针

请添加图片描述
如图所示

  • 深绿色代表已经收到ACK的段
  • 浅绿色代表发送了,但是没有收到ACK段
  • 白色代表没有发送的阶段
  • 紫色代表暂时不能发送的阶段。

不同类型封包的顺序

  • 将已发送的数据放在最左边
  • 发送中的数据放到中间
  • 未发送的数据放在右边

假设我们最多同时发送5个封包,也就是窗口的大小 = 5,窗口中被同时发送出去,然后等待ACK。如果一个封包ACK到达,我们标记位绿色

请添加图片描述
这时候滑动窗口可以向右滑动,如图所示

请添加图片描述

重传

发送过程中,部分数据没能收到ACK会怎么样呢?重传

如果发生下图这样的情况,段4迟迟没有收到ACK

请添加图片描述
滑动窗口右移一个位置

请添加图片描述
在这个过程中,

  • 如果后来4段重传成功(接收到ACK),那么窗口就会继续右移,
  • 如果4没有接收到ACK,那么接收方也会抛弃段5,段6,段7,这样从段4之后的数据都需要重发

快速重传

如果接收方想丢弃某一个段,可以选择不发ACK。发送端超时后,会重发这个TCP段。
而有时候希望催促发送方尽快补发某个TCP段,可以使用快速重传能力。

例如段1,段2,段4到了,但是段3没到,接收方可以发送多次段3的ACK,如果发送方收到多个段3的ACK,就会重发段3,这个机制快速重传。

窗口大小的单位?

窗口大小是TCP段的数量。

在实际操作中,每个TCP段的大小不同,限制数量会让接收方的缓冲区不好操作,因此实际操作窗口大小单位是字节数。

流速控制

发送,接收窗口的大小可以用来控制TCP协议的流速。窗口越大,如果数据发生错误,损失越大,因为需要重传越多的数据。

总结

为了提高传输速率,TCP协议选择将多个段同时发送,为了让这些段不至于被接收方拒绝服务,在发送前,双方要协商好发送的速率。但是我们不可能完全确定网速,所以协商的方式,就变成确定窗口大小。

  • 有了窗口,发送方利用滑动窗口算法发送消息;接收方构造缓冲区接收消息,并发送方ACK。

滑动窗口的实现只需要数组和少量的指针即可,是一个非常高效的算法

滑动窗口和流速控制是怎么回事?

滑动窗口是TCP协议控制可靠性的核心

  1. 发送方将数据拆包,变成多个分组,
  2. 然后将数据放入一个拥有滑动窗口的数组,依次发出,
  3. 仍然遵循先入先出的原则,但是窗口的分组是一次性发送,
  4. 窗口中序号最小的分组如果收到ACK,窗口会发生滑动
  5. 如果最小序号分组长时间没有收到ACK,就会触发整个窗口的数据重新发送。

在多次传输中,网络的平均延迟往往是相对国定的,这样TCP协议可以通过协商窗口大小控制流速。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值