首页 > 其他分享 >夯实基础之tcp 滑动窗口

夯实基础之tcp 滑动窗口

时间:2022-09-23 14:44:42浏览次数:46  
标签:窗口 字节 tcp 发送 夯实 大小 滑动 接收 数据

滑动窗口

引入窗口概念的原因

我们都知道 TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。

这个模式就有点像我和你面对面聊天,你一句我一句。但这种方式的缺点是效率比较低的。

如果你说完一句话,我在处理其他事情,没有及时回复你,那你不是要干等着我做完其他事情后,我回复你,你才能说下一句话,很显然这不现实。

所以,这样的传输方式有一个缺点:数据包的往返时间越长,通信的效率就越低。

为解决这个问题,TCP 引入了窗口这个概念。即使在往返时间较长的情况下,它也不会降低网络通信的效率。

那么有了窗口,就可以指定窗口大小,窗口大小就是指无需等待确认应答,而可以继续发送数据的最大值。

窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。

窗口大小由哪一方决定

TCP 头里有一个字段叫 Window,也就是窗口大小。

这个字段是接收端告诉发送端自己还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能力来发送数据,而不会导致接收端处理不过来。

所以,通常窗口的大小是由接收方的窗口大小来决定的。

发送方发送的数据大小不能超过接收方的窗口大小,否则接收方就无法正常接收到数据。

发送方的滑动窗口

我们先来看看发送方的窗口,下图就是发送方缓存的数据,根据处理的情况分成四个部分,其中深蓝色方框是发送窗口,紫色方框是可用窗口:
image
1是已发送并收到 ACK确认的数据:1~31 字节
2是已发送但未收到 ACK确认的数据:32~45 字节
3是未发送但总大小在接收方处理范围内(接收方还有空间):46~51字节
4是未发送但总大小超过接收方处理范围(接收方没有空间):52字节以后

在下图,当发送方把数据「全部」都一下发送出去后,可用窗口的大小就为 0 了,表明可用窗口耗尽,在没收到 ACK 确认之前是无法继续发送数据了。
image

在下图,当收到之前发送的数据 32~36 字节的 ACK 确认应答后,如果发送窗口的大小没有变化,则滑动窗口往右边移动 5 个字节,因为有 5 个字节的数据被应答确认,接下来 52~56 字节又变成了可用窗口,那么后续也就可以发送 52~56 这 5 个字节的数据了。
image

接收方的滑动窗口

接下来我们看看接收方的窗口,接收窗口相对简单一些,根据处理的情况划分成三个部分:

1 + 2 是已成功接收并确认的数据(等待应用进程读取);
3 是未收到数据但可以接收的数据;
4 未收到数据并不可以接收的数据;
image

接收窗口和发送窗口的大小是相等的吗?

并不是完全相等,接收窗口的大小是约等于发送窗口的大小的。

因为滑动窗口并不是一成不变的。比如,当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。那么新的接收窗口大小,是通过 TCP 报文中的 Windows 字段来告诉发送方。那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系

标签:窗口,字节,tcp,发送,夯实,大小,滑动,接收,数据
From: https://www.cnblogs.com/aiverhua/p/16722679.html

相关文章

  • 【Firefox浏览器】关闭触摸板双指滑动进行前进后退的功能
    痛点本以为只是Chrome浏览器存在这一奇葩功能,没成想Firefox也沦陷了!有好一阵子在使用Firefox的时候,并未发现其存在这个功能。直到有一天,打开自己的博客,翻阅上篇《【Chrom......
  • TCP/IP协议簇
    0TCP/IP(TransmissionControlProtocol/InternetProtocol,传输控制协议/网际协议)是指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP和IP两个协......
  • TCP粘包
    1、案例服务端代码如下:funcprocess(connnet.Conn){deferconn.Close()reader:=bufio.NewReader(conn)varbuf[1024]bytefor{n,er......
  • 滑动窗口 & 双指针
    https://leetcode.cn/problems/longest-repeating-character-replacement/classSolution{public:intcharacterReplacement(strings,intk){if(s.emp......
  • TCP的三次握手与四次挥手理解
     序列号seq:占4个字节,用来标记数据段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号......
  • tcp wireshark 分析
     客户端超时,主动发起关闭。FIN    http主动超时断开    正常: ......
  • linux tcpdump
    tcpdump和ethereal可以用来获取和分析网络通讯活动,他们都是使用libpcap库来捕获网络封包的。​在混杂模式下他们可以监控网络适配器的所有通讯活动并捕获网卡所接收的所有......
  • 【TCP】维护可靠通信的方式
    数据分片:在发送端对用户数据进行分片,在接收端进行重组,由TCP确定分片的大小并控制分片和重组;到达确认:接收端接收到分片数据时,根据分片数据序号向发送端发送一个确认包;超时重......
  • 尚硅谷网络基础TCP三次握手
    1.简述TCP三次握手的过程。 访问过程是给序列号+1来进行沟通访问的常用的3个标志位SYN信包发起一个连接ACK确认标志位FIN释放连接linux通过netstat-......
  • 203-CH32V307(RISC-V)学习开发-以太网例程-TCP客户端-电脑网线直连
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/LearnCH32V307VCT6"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p> ......