TCP的流量控制

1.TCP的滑动窗口

       为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认。

       TCP的两端都有发送/接收缓存和发送/接收窗口。TCP的缓存是一个循环队列,其中发送窗口可以用3个指针表示。而发送窗口的大小受TCP数据报中窗口大小的影响,TCP数据报中的窗口大小是接收端通知发送端其还可以接收多少数据,所以发送窗口根据接收的的窗口大小的值动态变化。

       以下的几张图片就帮助理解一下滑动窗口的机制:

       注意上图中的3个指针P1、P2、P3!此时接收窗口中接收的数据可能是失序的,但是也先存储在接收缓存之中。发送确认号的时候依然发送31,表示B期望接收的下一个数据报的标示符是31。

       当B收到31后连同之前接收到的数据报,发送确认号34,此时A的滑动窗口可以向前移动了。

       如果发送窗口中的数据报都属于已发送但未被确认的话,那么A就不能再继续发送数据,而需要进行等待。

2.TCP流量控制

       所谓流量控制就是让发送发送速率不要过快,让接收方来得及接收。利用滑动窗口机制就可以实施流量控制。

       原理这就是运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。

       考虑一种特殊的情况,就是接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零窗口大小的报文,但是这个报文在中途丢失的,那么发送方的发送窗口就一直为零导致死锁。

       解决这个问题,TCP为每一个连接设置一个持续计时器(persistence timer)。只要TCP的一方收到对方的零窗口通知,就启动该计时器,周期性的发送一个零窗口探测报文段。对方就在确认这个报文的时候给出现在的窗口大小(注意:TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段)。

3.传输效率及Nagle算法

       TCP的数据传输分为交互数据流和成块数据流,交互数据流一般是一些交互式应用程序的命令,所以这些数据很小,而考虑到TCP报头和IP报头的总和就有40字节,如果数据量很小的话,那么网络的利用效率就较低。

       数据传输使用Nagle算法,Nagle算法很简单,就是规定一个TCP连接最多只能有一个未被确认的未完成的小分组。在该分组的确认到达之前不能发送其他的小分组。

       但是也要考虑另一个问题,叫做糊涂窗口综合症。当接收方的缓存已满的时候,交互应用程序一次只从缓存中读取一个字节(这时候缓存中腾出一个字节),然后向发送方发送确认信息,此时发送方再发送一个字节(收到的窗口大小为1),这样网络的效率很低。

素以要解决这个问题,可以让接收方等待一段时间,使得接收缓存已有最够的空间容纳一个最长报文段,或者等到接收缓存已有一半的空间。只要这两种情况出现一种,就发送确认报文,同时发送方可以把数据积累成大的报文段发送。

 

### TCP流量控制的实现方式 TCP流量控制的核心目标是确保发送方的数据传输速率不会超过接收方的处理能力,从而避免数据丢失和网络拥塞。以下是TCP流量控制的主要实现方式: #### 1. 滑动窗口机制 TCP通过滑动窗口机制来实现流量控制。接收方在确认消息中会告知发送方当前可用的接收窗口大小(即 `Window Size`),该值表示接收方还能接收多少字节的数据[^1]。发送方根据接收方提供的窗口大小调整自身的发送速率,以确保不会发送超出接收方处理能力的数据量。 #### 2. 动态调整窗口大小 早期的TCP协议中,接收窗口的大小是固定的,但随着网络的发展,固定大小的窗口变得不灵活,成为性能瓶颈之一。现代TCP协议通过动态调整窗口大小来适应网络条件的变化。例如,当接收方缓存空间充足时,可以增大窗口大小;当缓存接近满载时,则减小窗口大小[^2]。 #### 3. 确认与反馈机制 TCP使用确认机制(ACK)来实现可靠的数据传输。每当接收方成功接收到数据后,会向发送方发送一个确认消息,并附带当前的接收窗口大小。发送方根据这些反馈信息调整自己的发送策略[^5]。 #### 4. 缓冲区管理 接收方维护一个接收缓冲区,用于暂时存储尚未被应用层读取的数据。如果接收方的应用程序读取数据的速度较慢,导致缓冲区逐渐填满,接收方会通过减小窗口大小通知发送方降低发送速率。反之,如果缓冲区有足够空间,接收方会增大窗口大小以允许发送方加快传输速度[^4]。 #### 5. Nagle算法的影响 Nagle算法是一种优化小数据包传输的机制,它会将多个小数据包合并成一个较大的数据包再发送,从而减少网络开销。然而,这种机制可能会引入延迟,因为发送方需要等待确认消息才能发送后续数据。虽然Nagle算法主要用于解决小数据包问题,但它也可能间接影响流量控制的效果[^4]。 ```python # 示例:简单模拟TCP滑动窗口机制 class TCPFlowControl: def __init__(self, window_size): self.window_size = window_size # 接收窗口大小 self.buffer = [] # 接收缓冲区 def receive_data(self, data): if len(data) <= self.window_size - len(self.buffer): self.buffer.extend(data) return True else: return False # 超出窗口大小,拒绝接收 def read_data(self, size): data = self.buffer[:size] del self.buffer[:size] return data # 使用示例 tcp = TCPFlowControl(window_size=100) data_received = tcp.receive_data(b"Hello World") # 尝试接收数据 if data_received: print("Data received successfully.") else: print("Failed to receive data due to window size limitation.") ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值