TCP-滑动窗口

TCP滑动窗口

术语
  • 窗口合拢:窗口左边沿向右边沿靠近
  • 窗口张开:窗口右边沿向右移动时将允许发送更多的数据
  • 窗口收缩:窗口右边沿向左移动
    窗口边沿的移动
    详细解释:
    • 窗口合拢发生在数据被发送和确认时
    • 窗口张开发生在对端接收进程读取已经确认的数据并释放了TCP的接受缓存
    • 窗口收缩的使用场景 结合糊涂窗口综合征
    • 窗口的左边沿受对端发送的确认序号的控制,因此不可能向左边移动。如果接收到一个指示窗口左边沿向左移动的ACK,则它被认为是一个重复ACK,并被丢弃
    • 如果左边沿到达右边沿,则称其为一个零窗口,此时发送方不能够发送任何数据
窗口控制

滑动窗口
  如上图:

  • 将字节从1到11进行编号
  • 接受方通告的窗口标识为提供的窗口,它覆盖了从第4到第9字节的区域,表明接受方已经确认了包含第3字节在内的数据,且通告大小为6
  • 窗口大小是与确认序号相对应的。发送方计算它的可用窗口,该窗口表明多少数据可以立即被发送
  • 接收方确认数据后,这个滑动窗口不时地向右移动。窗口两个边沿的相对运动增加或减少了窗口的大小
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP滑动窗口是一种流量控制机制,用于控制发送方和接收方之间的数据流量。它允许发送方在不等待确认的情况下发送多个数据包,而接收方可以根据自己的处理能力和可用缓冲区大小来控制数据的接收速度。 TCP滑动窗口的大小由接收方动态调整,以反映其可用的缓冲区大小。当接收方收到数据时,它会发送一个确认消息,其中包含一个窗口大小值。这个值告诉发送方可以发送多少数据,而不必等待确认消息。 发送方维护一个发送窗口,它是一个连续的字节序列,表示可以发送但尚未得到确认的数据。发送方根据接收方发送的窗口大小值来调整发送窗口的大小。如果接收方的窗口大小值为0,发送方将停止发送数据,直到接收方发送一个非零的窗口大小值。 当发送方收到一个确认消息时,它会将发送窗口向前滑动,以删除已确认的数据,并将新的未确认数据添加到发送窗口中。这个过程不断重复,直到所有数据都被确认。 下面是一个简单的TCP滑动窗口的例子: ```python # 假设接收方的窗口大小为10 window_size = 10 # 发送方的发送窗口 send_window = b"0123456789abcdefghijklmnopqrstuvwxyz" # 发送方已经发送但未确认的数据 unacked_data = b"" # 发送方已经发送并确认的数据 acked_data = b"" # 模拟发送数据 while send_window: # 如果接收方的窗口大小为0,停止发送数据 if window_size == 0: break # 计算可以发送的数据大小 data_size = min(len(send_window), window_size) # 从发送窗口中取出数据 data = send_window[:data_size] # 将数据添加到未确认数据中 unacked_data += data # 从发送窗口中删除已经发送的数据 send_window = send_window[data_size:] # 更新窗口大小 window_size -= data_size # 模拟发送数据 # send(data) # 模拟接收确认消息 while unacked_data: # 模拟接收确认消息 # ack = receive_ack() ack = True if ack: # 从未确认数据中删除已经确认的数据 acked_data += unacked_data[:window_size] unacked_data = unacked_data[window_size:] # 更新窗口大小 window_size += len(acked_data) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值