TCP的滑动窗口

TCP的滑动窗口用于流量控制和确保可靠性。它涉及到RTT和RTO的计算,窗口数据的计算涉及LastByteAcked、LastByteSent等参数。接收端和发送端各有不同状态的数据处理,接收窗口大小的调整影响发送端的流量。滑动窗口通过窗口移动管理已发送、未发送及允许发送的数据,确保TCP连接的有效性和流量适配。

RTT和RTO

  • RTT:发送一个数据包到收到对应的ACK,所花费的时间
  • RTO:重传时间间隔 ——> 重传机制

TCP的滑动窗口的作用

TCP使用滑动窗口做流量控制与乱序重排
1、保证TCP的可靠性
2、保证TCP的流控特性

窗口数据的计算过程

在这里插入图片描述
发送端:
LastByteAcked:已经发送并且收到回复的最后一个序号位置
LastByteSent:已经发送但还没有收到回复的最后一个序号位置
LastByteWritter:已经准备好的但还没发送的最后一个序号位置

接收端:
LastByteRead:收到并已经回复的最后一个位置
NextByteExcepted:收到的连续最大的sequence的位置(已经收到但还没有发送回复ACK)
LastByteRcvd:已收到的最后一个字节的位置

计算:

AdvertisedWindow = MaxRcvBuffer - (LastByteRcvd - LastByteRead)
EffectiveWindow = AdvertisedWindow - (LastByteSent - LastByteAcked)

其中:AdvertisedWindow(接收方还可以处理的量)、MaxRcvBuffer(接收方能接收的最大数据量,或接收端缓存区的大小)、EffectiveWindow(窗口内剩余可发送数据大小)

滑动窗口的基本原理

TCP会话的发送方:
在这里插入图片描述
任何时候,在其发送缓存内的数据都可以分为四类:
1、已经发送,并且得到端的回应;
2、已经发送,但还没收到端的回应;
3、未发送,但对端允许发送;
4、未发送,且由于达到window的大小,对端不允许发送。

在这里插入图片描述

(1)假设起始状态:[32-45] [46-51]共同构成了滑动窗口,其中前一部分是已发送的还没收到确认的,后一部分是可发送还没发的;
(2)假设发送的片段[32~35],发送端收到接收端的ACK回复,那么滑动窗口即可向右移动4个字节;
(3)此时可以将[46-51]发送出去,并且[52~55]由不可发送变为可发送,整个滑动窗口向右移动了4个字节的位置。

TCP会话的接收方:
在这里插入图片描述
某一时刻,在其接收缓存内存在三种状态:
1、已接收,并且已发送回执;
2、未接收,但可以接收(此段空间称为:接收窗口);
3、未接收,并且不能接收。
tips:由于ACK直接由TCP栈回复,默认没有应用延迟,不存在已接收但未回复ACK的状态

注:
应用会根据自身处理能力的变化,通过本端TCP接收窗口大小的控制来实现对端的发送窗口进行流量限制。

### 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、付费专栏及课程。

余额充值