直观明了的总结TCP滑动窗口机制原理及作用

一. 原理

TCP是全双工通信,因此每一方的滑动窗口都包括了接收窗口+发送窗口,接收窗口负责处理自己接收到的数据,发送窗口负责处理自己要发送出去的数据。滑动窗口的本质其实就是维护几个变量,通过这些变量将TCP处理的数据分为几类,同时在发送出一个报文、接收一个报文对这些变量做一定的处理维护

发送窗口如上图 :

(1)N是发送窗口的起始字节,也就是说:字节序号 < N的字节都已经发送出去且已经收到ack,确认无误了;

(2)nextSeq就是下一次发送报文的首部Seq字段(Seq即第一个字节的序号,这些这里不讲了),表示字节序号在 [N,nextSeq)区间的都已经使用过,发送出去了,但是还未收到ack确认;

(3) N+size就是窗口的最后一个可用字节序号,size是发送窗口的大小,就是每次接收到的报文中的Win字段的值,Win字段其实就是对方接收窗口的大小。

如何让维护这几个值呢?

(1)每接收到一个一个报文要做如下事情:检查接收报文的ack,将N 置为 ack,即往前移到ack这个值;读取报文中的Win字段值,即对方的最新接收窗口大小,从而更新N+size的值。

(2)每发送一个报文,就更改nextSeq的值,发送了多少个字节就把nextSeq往前移多少,但是不要超出N+size。

下面看接收窗口

同样是维护几个关于字节序号的变量,与发送窗口类似,只不过接收窗口的字节序号都是接收到的字节。几个变量的意义如下:

(1)J1表示:字节序号 < J1的字节已经接收到了,即已经发出ack确认了,也可以说可以给程序使用了。

(2)J2表示:[J1,J2)区间的字节已经完整、有序的接收到了,随时可以供程序读取,但只是还没有发出ack,进行确认

(3)J3就是接收窗口的最后一个可接收字节,超过J3的字节发来是拒绝接收的(一般也不会收到,因为发送窗口的大小是根据接收窗口来的,不可能回超过)。

如何维护呢?

(1)发送一个报文时:将J2的值填入报文首部的ack字段,然后J1移动到J2,告诉对方你发来的字节序号小于J2的那些,我已经都正确接收到且使用了;将 (J3-J2) 的差值填入首部Win字段,告诉对方我还有多 大空间可以接收。

(2)接收到一个报文时,如果报文顺序没出错,则将移动J2,接收到多少字节就移动多少。如果报文按序到达,下一个收到的报文的Seq值就应该等于J2,如果不相等说明中间有报文丢失了,就不移动J2,从   而接下来发送的报文ack一直是同一个:J2,也就是重复确认,相应的又有快重传(扯远了,不详细说了)。

3. 滑动窗口原理总结

因为窗口的起始值在开始后就会慢慢的增加,也就是右移,所以这也是滑动窗口名字的由来。实际上就是在接收报文、发送报文维护几个关于ack 、字节序号、seq(报文起始字节序号)的变量值。关于ack、seq、WinSize总结如下:

(1)发送报文ack是怎么来的,接收到报文时ack又是怎么用的:

   发送报文时从接收窗口拿J2的值填到报文首部的 ack;接收报文时拿到ack后将发送窗口的起始值N更新为ack。

(2)发送报文seq是怎么来的,接收到报文时seq又是怎么用的:

发送报文时从发送窗口拿到nextSeq的值填到报文首部的seq字段;接收到报文后查看报文的seq字段是否是接收窗口的J2,是就根据报文长度将J2连续右移。

(3)发送报文Win是怎么来的,接收到报文时Win又是怎么用的:

发送报文时,从接收窗口拿到 (J3-J2)的这个差值填到首部的Win字段;接收到报文时拿到首部的Win字段的值,假设为size,则更新发送窗口的结束位置为 N+size

二. 作用

我们知道,网络层实际上就是一个数据报网络,本身是不面向连接的,也不提供可靠有序完整的服务。udp直接使用数据报网络,所以它只是提供尽力交付的服务,在传输过程中数据包可能会丢失。那么为什么TCP同样是使用数据报网络,却能够实现面向连接的可靠传输服务呢?实际上,是因为TCP的可靠传输不是依靠下层的网络层完成的,完全是在传输层上,在软件层面完成的,具体体现在TCP协议有收到确认、有超时重传、有重复确认-快重传等额外步骤。

正是因为收发数据报相比于udp多了这么多限制,所以才实现了可靠传输的服务,这些额外的步骤也带来了不少问题:需要在首部字段多设置不少的字段用来完成那些步骤,多做的步骤会有时间、资源开销等。这些首部字段最重要的就是 ack 、字节序号、seq,这是保证能正确的重传丢失报文的基础。

但是,有了这些也只能这样做:发送报文,等待对方确认,收到确认后继续发下一报文,效率非常低。而有了滑动窗口,通信双方就不用发送一个报文后,收到此报文的确认后再发送下一个报文,而是可以连续发送多个报文,只要别超过窗口大小限制;还有就是:TCP开销比udp大,一旦网络拥塞或报文丢失又会造成报文重发,而这些重发又加重了拥塞,所以TCP里要严格控制发送速率防止网络拥塞,滑动窗口根据接收方的Win大小很好的限制了发送方的发送速率。

总结就是:(1)滑动窗口允许发送方连续发送多个报文(2)根据对方接收窗口大小限制发送方的发送速率,防止拥塞

(注意:实际中并不一定按对方接收窗口rwnd大小来决定发送速率,因为没有考虑网络拥塞情况。拥塞控制中同样会决定发送窗口cwnd大小,最后发送时取 MIN(cwnd,rwnd))

三. 过程示例

给个书上的示例:

B发送的的rwnd就是报文头部Win字段的值。解释个小问题:为什么前面说发送窗口的结束位置是N+size,而不是nextSeq+size?因为[N,nextSeq)这些字节是发送出去但未收到确认的,是随时有可能重发的,因此结束位置要从N算起,到N+size。

原文地址:https://www.cnblogs.com/shen-qian/p/12111666.html

时间: 2024-11-03 21:32:49

直观明了的总结TCP滑动窗口机制原理及作用的相关文章

TCP滑动窗口机制的简洁模型

模型图: 我们可以大概看一下上图的模型: 首先是AB之间三次握手建立TCP连接.在报文的交互过程中,A将自己的缓冲区大小(窗口大小)3发送给B,B同理,这样双方就知道了对端的窗口大小. A开始发送数据,A连续发送3个单位的数据,因为他知道B的缓冲区大小.在这一波数据发送完后,A就不能再发了,需等待B的确认. A发送过来的数据逐渐将缓冲区填满. 这时候缓冲区中的一个报文被进程读取,缓冲区有了一个空位,于是B向A发送一个ACK,这个报文中指示窗口大小为1.A收到B发过来的ACK消息,并且知道B将窗口

TCP的滑动窗口机制【转】

原文链接:http://www.cnblogs.com/luoquan/p/4886345.html      TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的传输协议就需要对数据进行确认.TCP协议里窗口机制有2种:一种是固定的窗口大小:一种是滑动的窗口.这个窗口大小就是我们一次传输几个数据.对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送:同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允

TCP 滑动窗口的简介(写得太好,转载过来的)

TCP 滑动窗口的简介 POSTED BY ADMIN ON AUG 1, 2012 IN FLOWS34ARTICLES | 0 COMMENTS TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性.同时滑动窗口机制还体现了TCP面向字节流的设计思路.TCP 段中窗口的相关字段. TCP的Window是一个16bit位字段,它代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16-1=65535个字节. 另外在TCP的选项字段中还包含了一个TCP窗口扩大因子

TCP/IP(十一)TCP滑动窗口和用赛控制

目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大多数情况下只是做小流量的数据交换,比如说按一下键盘,回显一些文字等等.(2)数据成块类型,例如ftp,这种类型的协议要求TCP能尽量的运载数据,把数据的吞吐量做到最大,并尽可能的提高效率.针对这两种情况,TCP给出了两种不同的策略来进行数据传输. 1.TCP的交互数据流 对于交互性要求比较高的应用,

TCP 滑动窗口和 拥塞窗口

转http://coolshell.cn/articles/11609.html 滑动窗口 -- 表征发送端和接收端的接收能力 拥塞窗口-- 表征中间设备的传输能力 TCP滑动窗口 需要说明一下,如果你不了解TCP的滑动窗口这个事,你等于不了解TCP协议.我们都知道,TCP必需要解决的可靠传输以及包乱序(reordering)的问题,所以,TCP必需要知道网络实际的数据处理带宽或是数据处理速度,这样才不会引起网络拥塞,导致丢包. 所以,TCP引入了一些技术和设计来做网络流控,Sliding Wi

TCP 滑动窗口(发送窗口和接收窗口)

TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性.同时滑动窗口机制还体现了TCP面向字节流的设计思路. TCP的Window是一个16bit位字段,它代表的是窗口的字节容量,也就是TCP的标准窗口最大为2^16-1=65535个字节. 另外在TCP的选项字段中还包含了一个TCP窗口扩大因子,option-kind为3,option-length为3个字节,option-data取值范围0-14.窗口扩大因子用来扩大TCP窗口,可把原来16bit的窗口,扩大为31b

TCP滑动窗口控制流量的原理

TCP滑动窗口控制流量的原理 TCP的滑动窗口机制       TCP这个协议是网络中使用的比较广泛,他是一个面向连接的可靠的传输协议.既然是一个可靠的传输协议就需要对数据进行确认.TCP协议里窗口机制有2种:一种是固定的窗口大小:一种是滑动的窗口.这个窗口大小就是我们一次传输几个数据.对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送:同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收.这样通过调整发送方窗口和接收方窗口的大小

TCP滑动窗口

TCP的滑动窗口解决了端到端的流量控制问题,允许接受方对传输进行限制,直到它拥有足够的缓冲空间来容纳更多的数据.滑动窗口的大小由接收方确定,接收方在发送确认信号给发送方的同时告诉发送方自己的缓冲区大小(在TCP头部字段中),发送方根据此大小确定窗口大小,从而控制数据发送量.同时,滑动窗口协议允许发送方在停止并等待确认前可以连续发送多个分组,由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输. 下面是一个例子: 在建立连接时,双方都告知了对方自己的MSS为1024,所以在传输

TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在TIME_WAIT状态中,如果TCP client端最后一次发送的ACK丢失了,它将重新发送.TIME_WAIT状态中所需要的时间是依赖于实现方法的.典型的值为30秒.1分钟和2分钟.等待之后连接正式关闭,并且所有的资源(包括端口号)都被释放. [问题1]为什么连接的时候是三次握手,关闭的时候却是四次