TCP 滑动窗口(快速重传)
目录
一、滑动窗口的来由
二、滑动窗口
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 滑动窗口(快速重传)相关推荐
- TCP滑动窗口(发送窗口和接受窗口)
TCP窗口机制 TCP header中有一个Window Size字段,它其实是指接收端的窗口,即接收窗口.用来告知发送端自己所能接收的数据量,从而达到一部分流控的目的. 其实TCP在整个发送过程中, ...
- TCP滑动窗口原理终于清楚了!
我们在学习计算机网络的时候,遇到很多知识点.即便是背的滚瓜烂熟,让你去辨别知识点背后的深层逻辑的时候,可能就手足无措了. 比如小邱去面A公司的时候就被问到: 事实上,这个问题很大程度弥补我计算机网络的 ...
- TCP滑动窗口协议与流量控制
谈到TCP的滑动窗口协议与流量控制,便会想起当年面试时的场景.那时刚刚毕业,匆匆学了一点TCP的皮毛,仅仅是知道了TCP是面向连接的协议,以对每个报文都进行确认+超时重传的机制来保证端到端的可靠传输: ...
- TCP 滑动窗口是个什么东西?这篇讲清楚
今天我们来看TCP的滑动窗口问题,无论是在工作中,还是在笔试面试中,滑动窗口都是非常重要的概念,今天,图文并茂给大家讲清楚,一起来看看. 一.TCP的优势 TCP经过多年厮杀,早已确立了坚实的江湖基础 ...
- 互联网协议 — TCP — 滑动窗口
目录 文章目录 目录 TCP ARQ 协议 TCP 的滑动窗口 Sender 滑动窗口 Receiver 滑动窗口 滑动窗口处理流程 窗口探测 TCP ARQ 协议 ARQ(Automatic Rep ...
- 计算机网络:TCP滑动窗口的流量控制和拥塞控制
1. 前言 最近在研究网络通信底层通信原理,所以不得不复习一波计算机网络传输控制协议.那么对于程序开发人员,了解底层网络通信原理,对于我们理解BIO.NIO网络通信十分重要.所以对于程序开发人员来说, ...
- TCP三次握手和四次挥手?TCP如何保证可靠性?什么是TCP滑动窗口?
TCP三次握手和四次挥手? 三次握手 tcp3handshake.gif tcp3handshake2.gif tcp3handshake3.gif tcp3handshake4.gif 四次挥手 t ...
- TCP/IP(十一)TCP滑动窗口和拥塞控制
目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...
- TCP滑动窗口机制(附图例)
文章目录 前言 一.滑动窗口的引出 二.流量控制 2.1 16位窗口大小 2.2 发送缓冲区 2.3 逐步解析滑动窗口运作 三.快重传机制 四.拥塞控制(仅供参考) 五.延迟应答与捎带应答(略) 总结 ...
- TCP滑动窗口、流量控制及拥塞控制详解
一.TCP滑动窗口 TCP虽然是面向字节流的,但是TCP传输的单元确实报文段.一个TCP报文段分为首部和数据部分.TCP首部前20个字节是固定的,后面有4N个字节是可选的.因此,TCP首部最小字节数是 ...
最新文章
- Swift extension 扩展实用Tips
- 这份宝典火了,小哥学后加薪30W+
- java encodedurl_Java ParseUtil.fileToEncodedURL方法代码示例
- 并发基础(十) 线程局部副本ThreadLocal之正解
- C++容器的选择和详细操作方法总结(有自己总结)
- SpringBoot_web开发-简介
- 分治法在二叉树遍历中的应用(JAVA)--二叉查找树高度、前序遍历、中序遍历、后序遍
- 基于Hadoop 2.6.0运行数字排序的计算
- Unity3D技术之优化图形性能绘制调用批处理浅析
- python elasticsearch模块_Python3 操作 elasticsearch
- 浏览器 html 看层级,浏览器视图层级中的“根”:html和body的属性研究
- Gzip, Bzip2,Xz压缩
- arduino 停止程序_Arduino用ISD1820语音录放模块制作留言机
- codeforce 贪心1
- modulenotfounderror python_你所不知道的 【ModuleNotFoundError: No module named ''; '' is not a package】...
- matlab进化树的下载,mega进化树软件-mega下载 v7.0.14--pc6下载站
- 关于Qt Creater中资源文件和文件路径的记录
- python 生成二维码图片
- 项目管理知识体系指南(五)项目时间管理
- 服务器vga转hdmi显示器不亮,手把手教你排除HDMI转VGA常见故障