TCP - 流量控制 and 拥塞控制

本文深入探讨TCP的流量控制和拥塞控制机制。流量控制通过滑动窗口机制确保接收方能处理发送的数据,防止数据丢失。拥塞控制则通过慢启动、拥塞避免、快重传和快恢复算法来避免网络拥塞。快重传允许在收到三个重复ACK时提前重传,而快恢复则在重传后避免慢启动阶段,直接进入拥塞避免阶段,提高网络性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


1. 流量控制 - Flow Control

序言:数据的传送与接收过程当中很可能出现收方来不及接收的情况,这时就需要对发方进行控制以免数据丢失。利用滑动窗口机制可以很方便的在TCP连接上实现对发送方的流量控制。TCP的窗口单位是字节,不是报文段,发送方的发送窗口不能超过接收方给出的接收窗口的数值。

流量控制

说明:使发送方暂停发送的状态将持续到主机B重新发出一个新的窗口值为止。B向A发送的三个报文段都设置了ACK=1。
  考虑一种特殊的情况,接收方若没有缓存足够使用,就会发送零窗口大小的报文,此时发送放将发送窗口设置为0,停止发送数据;之后接收方有足够缓存,发送了非零窗口大小的报文,但是这个报文中途丢失,那么发送方的发送窗口就一直为0导致死锁。为此,TCP为每一个连接设有一个持续计时器(Persistence Timer)。当TCP连接的一方收到对方的零窗口通知时就启动持续计时器。若持续计时器设置的时间到期,就发送一个零窗口探测报文段(携有1字节的数据),那么收到这个报文段的一方就重新设置持续计时器,给出现在的窗口值。
  TCP规定,即使设置为零窗口,也必须接收以下几种报文段:零窗口探测报文段、确认报文段和携带紧急数据的报文段。

1.1 传输效率问题
  可以用不同的机制控制TCP报文段的发送时机:
  [1]. TCP维持一个变量MSS,等于最大报文段长度。只要缓冲区存放的数据达到MSS字节时,就组装成了一个TCP报文段发送出去。
  [2]. 由发送方的应用进程指明要发送的报文段,即:TCP支持推送操作。
  [3]. 发送方的一个计时器期限到了,这时就把当前已有的缓存数据装入报文段(但长度不能超过MSS大小)发送出去

### TCP 流量控制拥塞控制的实现原理 #### 流量控制机制 流量控制旨在防止快速发送方淹没慢速接收方。具体来说,通过窗口大小通知发送方可以安全发送的数据量,从而调节发送速度以匹配接收能力[^1]。 ```python def tcp_flow_control(window_size, data_to_send): while window_size > 0 and data_to_send: chunk = min(data_to_send[:window_size], buffer_size) send(chunk) data_to_send = data_to_send[len(chunk):] ack = receive_acknowledgment() update_window_size(ack) ``` #### 拥塞控制机制 拥塞控制则关注整个网络的状态,确保不会因过度负载而影响整体性能。主要策略包括: - **慢启动**:初始阶段指数级增加拥塞窗口直到遇到丢包事件。 - **拥塞避免**:线性增长拥塞窗口,在接近带宽极限更加谨慎地调整。 - **快速重传**:当检测到三个重复确认立即重新传输丢失分组而不等待超计数器到期。 - **快速恢复**:在发生部分ACK的情况下保持较高吞吐量而不是完全回到慢启动状态。 ```python class CongestionControl: def __init__(self): self.cwnd = initial_cwnd def slow_start(self): if not recent_loss_event(): self.cwnd *= 2 def congestion_avoidance(self): increment = max_segment_size / self.cwnd self.cwnd += increment def fast_retransmit(self): if three_duplicate_acks_received(): retransmit_lost_packet() def fast_recovery(self): ssthresh = cwnd // 2 self.cwnd = ssthresh + 3 * mss ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值