tcp的滑动窗口

今天阅读了TCP中滑动窗口部分的内容,总结如下:

滑动窗口:又叫缓冲区,是两台主机间传送数据时的缓冲区。每台TCP/IP主机支持两个滑动窗口:一个用于接收数据,另一个用于发送数据。
窗口尺寸表示计算机可能缓冲的数据量大小。 

为什么要有滑动窗口
a)每次只发送出一个数据包。
b)为什么不一次发送完所有数据包?
在Internet中,可能同时存在着数百万条TCP连接。如果这些连接同时无节制的发送数据包,那么整个网络都会被堵死,没有数据包能到达目的地。
因此TCP需要根据网络状况,每次发送若干数据包。

1、滑动窗口的意义:

       因特网中有数以万计的TCP连接,它们需要共享带宽,缓存等网络资源。 TCP希望能最大效率的利用网络资源,

       并将资源公平的分配到每条TCP连接上,还要尽量保证不让网络超负荷。滑动窗口机制有效的解决了这些问题。

2、滑动窗口的作用:
        滑动窗口机制是TCP用来控制发送数据包速率的。 发送方每次只能发送滑动窗口内部的数据包。


3、滑动窗口的运行方式:
        每收到一个新的确认(ack),滑动窗口的位置就向右移动一格。
        滑动窗口大小,受拥塞窗口(cwnd)和通告窗口(awnd)的制约。swnd = min [ cwnd , awnd ]。
        拥塞窗口是为了不造成阻塞,网络对发送方发包数量的限制。
        通告窗口是接收方TCP缓存当前的大小。它阻止由于发包数量过多,超出接收方缓存的容量。


滑动窗口设计的原则:
1.滑动窗口过大:带宽利用率较高,容易产生丢包现象的网络,则需要多次发送重复的数据,会造成重传太多,也同样耗费了网络带宽,通信效率严重下降
2.滑动窗口过小:则需要在网络上频繁的传输确认信息,占用了大量的网络带宽;也会造成通信效率下降

### 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`. --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值