TCP的滑动窗口

TCP的滑动窗口

RTT和RTO

  • RTT(Round Trip Time,即往返时延),是指发送一个数据包到收到相应的ACK,所花费的时间。
  • RTO(Retransmission Timeout,即重传超时时间),是指重传时间间隔(当发送数据包时,数据发送方会启动一个重传计数器,若在重传计时器到时之前都没有接受到接收方返回的ACK报文,则重传数据,否则重传计时器自动失效);

注:RTO是由RTT计算得出的。

参考:

  1. TCP中RTT的测量和RTO的计算
  2. TCP-IP详解: RTT和RTO的计算方法

滑动窗口的作用

TCP会将数据拆分成段进行传输,而将数据段依次传输效率是极低的,需要对数据进行批量发送,因此TCP必须解决可靠传输和包乱序的问题。

TCP使用滑动窗口做流量控制与乱序重排。TCP的滑动窗口主要有两个作用:

  1. 保证TCP的可靠性;
  2. 保证TCP的流控特性。

TCP报头中的window字段,用于接收方通知发送方,自己还有多少缓冲区可以接收数据,因而发送方可以根据接收方的处理能力来发送数据,不会接收方处理不过来。

在这里插入图片描述

发送端:

LastByteAcked指向已经被接收端确认接收的最后一个字节序号;

LastByteSent表明已经向接收端发出,但是还没有接收到ACK回应;

LastByteWritten指向上层应用向本地TCP缓冲区写入的最后一个字节序号。


接收端:

LastByteRead指向上层应用已经从本地TCP缓冲区读完的最后一个字节序号;

NextByteExpected指向收到的最大sequence的最后一个字节序号,还没有向发送端发送ACK回应;

LastByteRcvd指向已经接收到并且已经向发送端发送ACK回应的最后一个字节序号。


AdvertisedWindow = MaxRcvBuffer - (LastByteRcvd - LastByteRead)

LastByteSent - LastByteAcked < AdvertisedWindow

EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked)

滑动窗口的基本原理

TCP发送方

在这里插入图片描述

TCP发送方的TCP缓存区有四类:

  • 第一类:已发送并且已接到接收方确认的;
  • 第二类:已发送但是未得到接收方确认的;
  • 第三类:未发送但是允许被发送的;
  • 第四类:未发送并且禁止被发送的。

其中第二类和第三类缓冲区被称为发送窗口

在这里插入图片描述

当收到接受方对于原滑动窗口字节的确认时,滑动窗口就会向后滑动。如上图所示:

  • 31及之前的字节位于第一类缓冲区,表示已经被发送并且已收到接收方确认的数据,它们位于滑动窗口之前;
  • 32~35之间的字节位于第二类缓冲区,表示已经被发送但是未得到接受方确认的数据,它们位于滑动窗口之内;
  • 36~51之间的字节位于第三类缓冲区,表示未发送但是允许被发送的数据,它们位于滑动窗口之内;
  • 52及之后的字节位于第四类缓冲区,表示未发送并且被禁止发送的数据,因为他们位于原滑动窗口之后,必须等待32~35之间的字节全都被确认后才能向后移动滑动窗口;

TCP接受方

在这里插入图片描述

TCP接受方的TCP缓存区有三类:

  • 第一类:已接收并且已发送ACK确认回执的;
  • 第二类:未接收但是准备接收的;
  • 第三类:未接受并且禁止接收的。

其中第二类被称为接收窗口

### TCP滑动窗口协议的工作机制 TCP滑动窗口是一种流量控制机制,旨在优化网络性能并防止发送方过载接收方缓冲区。其核心思想是通过动态调整窗口大小来平衡数据传输速率与网络条件之间的关系。 #### 基本概念 滑动窗口的核心在于维护一个“窗口”,该窗口表示当前允许发送的数据量范围。这个窗口会随着确认消息的到来而向前移动[^1]。具体来说: - **发送窗口 (Send Window)**:定义了发送方可以在未收到确认的情况下连续发送多少字节的数据。 - **接收窗口 (Receive Window)**:由接收方通告给发送方,表明它可以接受的最大数据量。 当接收到新的ACK(Acknowledgment)包时,发送方更新自己的发送窗口位置,并继续发送新数据直到达到窗口边界。 #### 实现细节 以下是TCP滑动窗口的一些重要实现细节: 1. **序列号管理** 每个TCP报文段都有唯一的序号,这些序号用于跟踪哪些部分已被成功传递以及哪些需要重传。初始序列号通常随机生成以增强安全性。 2. **拥塞控制集成** 尽管严格意义上属于另一个领域,但实际应用中,TCP的拥塞控制算法(如慢启动、拥塞避免阶段等)直接影响到滑动窗口的行为模式。例如,在检测到丢包事件后可能会缩小cwnd(Congestion Window),从而间接影响rwnd(Receiver Window)。这种交互确保即使在网络状况不佳时也能维持一定程度的服务质量。 3. **超时处理与快速重传** 如果某个特定分组长时间未能得到回应,则触发定时器到期进而引发整个连接层面的动作——重新尝试传送丢失片段;与此同时如果接连收到三个重复ack则立即执行fast retransmit而不必等待timeout发生。 4. **双向通信特性支持** 不同于单向流控方案仅关注一方如何调节另一方行为,tcp swp同时考虑两端需求并通过各自独立却又相互关联的方式完成整体协调工作。 ```python class TCPSlidingWindow: def __init__(self, initial_seq_num=0, max_window_size=65535): self.send_base = initial_seq_num # Next byte expected to be acknowledged. self.next_seq_num = initial_seq_num # Next byte we can send. self.max_window_size = max_window_size # Maximum size of the window. def update_send_window(self, ack_number): """Update the sending window based on acknowledgment.""" if ack_number > self.send_base: self.send_base = ack_number def has_space_to_send(self): """Check whether there's space within the current window to transmit more data.""" return (self.next_seq_num - self.send_base) < self.max_window_size def advance_next_sequence(self, bytes_sent): """Advance sequence number after successfully transmitting some amount of data.""" self.next_seq_num += bytes_sent ``` 上述代码展示了一个简化版的TCP滑动窗口逻辑框架,其中包含了基本的操作函数比如`update_send_window`, `has_space_to_send` 和 `advance_next_sequence`. --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值