目录

一、滑动窗口的来由

二、滑动窗口

1、滑动窗口模型

2、滑动窗口可能出现的状况

(1) 客户端发送的报文丢了(快重传机制)

(2) 服务端发送的ACK丢了(先收到了排序靠后的ACK)

三、滑动窗口大小为0时,何时才能继续发送数据?

1、策略一:发送方定期发送不携带数据的报文

2、策略二:接收方缓冲区一旦更新立马通知发送方

四、总结


一、滑动窗口的来由

TCP由于存在确认应答机制,在一方发出一条消息以后,另一方要发送ACK表明自己收到消息。如果按照下面这种形式,每次收到ACK才发出下一条消息,这种一发一收的效率太低。但是如果客户端不急着接收ACK,可以利用等待ACK的空挡直接发送下一批数据,这样就可以做到短时间内发送多批数据。这就是滑动窗口的基本思想。

窗口大小就是 这几批数据的所占字节数,以下面这个为例,窗口大小就是3000。在发送前三批数据的时候,可以不用等待ACK直接发送。

注意:一次不能发送太多,因为要看对方接收缓冲区的接受能力。

二、滑动窗口

假设发送缓冲区是一个大数组,数组的每一个位置是以字节为单位的。我们将发送缓冲区分为三个部分:

第一部分是存放已经发送而且收到ACK的数据,假设是0~1000个字节;

第二部分存放准备发送或者已经发送但没有收到ACK的数据,假设是1001~4000个字节;

第三部分存放尚未发送的数据(短时间内不会发送),假设是4001~ 5000 个字节;

1、滑动窗口模型

滑动窗口控制着我们每次所能发送的数据量,避免发送的数据量超出对方的接收能力。滑动窗口滑动的基本思想如下:

(1) 客户端将1001~4000 的数据分三批发送,即1001~2000、2001~3000、3001~4000。当客户端收到了1001~2000的ACK时,此时滑动窗口的左边界向右移动1000个字节;

(2) 如果ACK报文中的“16位窗口大小”的字段表明对方的接收缓冲区剩余空间为500字节,说明接收方还能再发500字节,那么滑动窗口的右边界向右移动500字节.

因此,滑动窗口就结果而言,看起来像是在滑动,其本质是 根据是否收到ACK以及对方接收缓冲区的大小来移动左右边界。

2、滑动窗口可能出现的状况

上面只是做了一个简单的介绍,实际过程中可能会遇到很多种情况,这里我们从两个问题来了解滑动窗口的作用过程:第一个点是,中间的报文丢了,即2001~3000的报文丢了;第二个点是后发送的先收到了ACK,即没有收到2001~3000,但是收到了3001~4000的报文的ACK。

(1) 客户端发送的报文丢了(快重传机制)

ACK确认应答机制中有一个很关键的点就是,接收方必须是按序回复。假设服务端收到了1001~2000、3001~4000的数据,但是没有收到2001~3000的数据。

- 服务端收到了1001~2000的数据,那就回复确认序号2001+ACK,表明2001之前的数据已经全部收到,下一次从2001的字节位置开始发;

- 服务端没有收到2001~3000,此时服务端不会发送ACK;

- 服务端即便收到了3001~4000的数据,等了一段时间依然没有收到2001~3000的数据,说明2001~3000的报文丢了。此时发送的确认序号不是4001,而是2001,表明目前只收到了2001之前的数据。

现在站在客户端的角度,客户端如果连续多次(一般是连续三次)收到了2001的确认应答,说明序号为2001之后的报文丢了,此时就会重传2001~3000的报文。服务端收到2001~3000的报文以后,由于之前已经收到了3001~4000 的报文(暂时存放在接收缓冲区),那么服务端相当于已经收到了全部的报文,此时服务端发送的确认序号是 4001,表明4001之前的报文已经全部收到,下一次可以从第4001个位置开始发。

这种重发机制被称为“快重传”,与超时重传不同的是,超时重传是等待60s以后还没有收到ACK,此时客户端就会重新发送报文;而快重传更注重效率,只要收到多个相同的确认序号,就立马重传。

(2) 服务端发送的ACK丢了(先收到了排序靠后的ACK)

现在服务端是正常收到了三批数据,并一一发送确认应答,但是客户端仅收到了1001~2000、3001~4000的ACK,说明2001~3000要么丢了,要么因为网络状况延迟到达。

- 客户端收到了1001~2000,此时滑动窗口的左边界向左移动1000个字节;根据缓冲区剩余空间大小移动右边界。

- 客户端没有收到2001~3000,但是收到了3001~4000的ACK。没关系,因为服务端必须是按序号回复的,如果服务端没有收到2001~3000的数据,根本不会发送3001~4000的ACK,因此可以认为 服务端已经收到了三批数据。此时滑动窗口的左边界向左移动至4001,同时根据对方接收缓冲区剩余空间大小移动右边界。

三、滑动窗口大小为0时,何时才能继续发送数据?

如果对方上层的处理速度较慢,导致对方接收缓冲区里的数据没有被取走,滑动窗口只有左边界在移动,滑动窗口的大小很快就会变成0。为了应对这种情况,TCP有两种策略。

1、策略一:发送方定期发送不携带数据的报文

发送方定期可以发送一个不携带数据的报文,报文不携带数据,也就不会占用服务端的缓冲区,接收方返回的ACK中会携带窗口大小,以此来判断是否可以继续发送数据。

2、策略二:接收方缓冲区一旦更新立马通知发送方

接收方的上层把数据取走的时候,服务端主动发送一个窗口更新的通知报文,该报文不携带任何数据,只是在报文首部设置了16位窗口大小

注意:在实际使用时,一般是两种方式同时使用。

四、总结

第一,滑动窗口是发送缓冲区的一部分,控制着每次所能发送数据量的最大值。

第二,滑动窗口的大小跟对方的接收能力有关,滑动窗口的大小不是固定的。如果对方上层一直不读取数据,对方的缓冲区剩余空间大小一直在减少,滑动窗口的大小也一直在减小。(其实接收能力还跟网络状况有关,这个就留到TCP拥塞控制说明)

TCP 滑动窗口(快速重传)相关推荐

  1. TCP滑动窗口(发送窗口和接受窗口)

    TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...

  2. TCP滑动窗口原理终于清楚了!

    我们在学习计算机网络的时候,遇到很多知识点.即便是背的滚瓜烂熟,让你去辨别知识点背后的深层逻辑的时候,可能就手足无措了. 比如小邱去面A公司的时候就被问到: 事实上,这个问题很大程度弥补我计算机网络的 ...

  3. TCP滑动窗口协议与流量控制

    谈到TCP的滑动窗口协议与流量控制,便会想起当年面试时的场景.那时刚刚毕业,匆匆学了一点TCP的皮毛,仅仅是知道了TCP是面向连接的协议,以对每个报文都进行确认+超时重传的机制来保证端到端的可靠传输: ...

  4. TCP 滑动窗口是个什么东西?这篇讲清楚

    今天我们来看TCP的滑动窗口问题,无论是在工作中,还是在笔试面试中,滑动窗口都是非常重要的概念,今天,图文并茂给大家讲清楚,一起来看看. 一.TCP的优势 TCP经过多年厮杀,早已确立了坚实的江湖基础 ...

  5. 互联网协议 — TCP — 滑动窗口

    目录 文章目录 目录 TCP ARQ 协议 TCP 的滑动窗口 Sender 滑动窗口 Receiver 滑动窗口 滑动窗口处理流程 窗口探测 TCP ARQ 协议 ARQ(Automatic Rep ...

  6. 计算机网络:TCP滑动窗口的流量控制和拥塞控制

    1. 前言 最近在研究网络通信底层通信原理,所以不得不复习一波计算机网络传输控制协议.那么对于程序开发人员,了解底层网络通信原理,对于我们理解BIO.NIO网络通信十分重要.所以对于程序开发人员来说, ...

  7. TCP三次握手和四次挥手?TCP如何保证可靠性?什么是TCP滑动窗口?

    TCP三次握手和四次挥手? 三次握手 tcp3handshake.gif tcp3handshake2.gif tcp3handshake3.gif tcp3handshake4.gif 四次挥手 t ...

  8. TCP/IP(十一)TCP滑动窗口和拥塞控制

    目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

  9. TCP滑动窗口机制(附图例)

    文章目录 前言 一.滑动窗口的引出 二.流量控制 2.1 16位窗口大小 2.2 发送缓冲区 2.3 逐步解析滑动窗口运作 三.快重传机制 四.拥塞控制(仅供参考) 五.延迟应答与捎带应答(略) 总结 ...

  10. TCP滑动窗口、流量控制及拥塞控制详解

    一.TCP滑动窗口 TCP虽然是面向字节流的,但是TCP传输的单元确实报文段.一个TCP报文段分为首部和数据部分.TCP首部前20个字节是固定的,后面有4N个字节是可选的.因此,TCP首部最小字节数是 ...

最新文章

  1. Swift extension 扩展实用Tips
  2. 这份宝典火了,小哥学后加薪30W+
  3. java encodedurl_Java ParseUtil.fileToEncodedURL方法代码示例
  4. 并发基础(十) 线程局部副本ThreadLocal之正解
  5. C++容器的选择和详细操作方法总结(有自己总结)
  6. SpringBoot_web开发-简介
  7. 分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍
  8. 基于Hadoop 2.6.0运行数字排序的计算
  9. Unity3D技术之优化图形性能绘制调用批处理浅析
  10. python elasticsearch模块_Python3 操作 elasticsearch
  11. 浏览器 html 看层级,浏览器视图层级中的“根”:html和body的属性研究
  12. Gzip, Bzip2,Xz压缩
  13. arduino 停止程序_Arduino用ISD1820语音录放模块制作留言机
  14. codeforce 贪心1
  15. modulenotfounderror python_你所不知道的 【ModuleNotFoundError: No module named ''; '' is not a package】...
  16. matlab进化树的下载,mega进化树软件-mega下载 v7.0.14--pc6下载站
  17. 关于Qt Creater中资源文件和文件路径的记录
  18. python 生成二维码图片
  19. 项目管理知识体系指南(五)项目时间管理
  20. 服务器vga转hdmi显示器不亮,手把手教你排除HDMI转VGA常见故障

热门文章

  1. XMPP协议和asmack
  2. PHP远程控制cmd,B374K PHP WEBSHELL:一款简单却功能强大的远程管理工具
  3. 科济药业冲刺港股上市:累计亏损超18亿元,高瓴资本突击入股
  4. 去耦电容和旁路电容的区别
  5. android飞机大战
  6. C语言中常量、变量和函数
  7. 数据处理(一):点到直线距离
  8. c语言for循环如何打印菱形
  9. win7打开资源管理器显示计算机而不是库
  10. sql连接显示未能连接服务器,SQL Server 2008无法连接到服务器的操作教程