下面的图表是从发送方的角度拍摄的快照。咱们可以将数据分为4组:
第3类也称为可用窗口,由于这是发送方可以经常使用的窗口。
发送窗口包含黄色和绿色局部。这些字节要么曾经被发送,要么可以被发送。
1*OqqxQKu4ZGasXzIlUZ9lyw.png
可用窗口在发送方发送了21-25字节并经常使用了可用窗口中的一切字节时或者为空。发送窗口坚持不变。
1*JdTCgvYpVPRDcLyVb8Rwsg.png
当发送方接纳到16-19字节确实认时,发送窗口向右滑动4个字节。队列中的接上去的字节会有一个降级的可用窗口。
1*9zFu_scvenahSK6m-khSjw.png
一些定义可以协助咱们更好地理解本文前面的复杂状况:
1*IYBc3_OiPWAZ7JCvIaktkA.png
基于这些定义,咱们可以用以下公式示意可用窗口的大小。
1*SbgJAvyVKyXYvPLuoBbGtA.png
接纳窗口分为3个类别:
第2类被称为接纳窗口,也可以称为RCV.WND。
与发送窗口相似,有一个指针RCV.NXT,示意接纳窗口的第一个字节。
1*u3KoxvVK-rrM1g4gX6fbZQ.png
接纳窗口并非静态。假设主机运转得高效,接纳窗口可以扩展。否则,它或者会增加。
接纳方经过在TCP段头中的窗口字段中批示大小来传播其接纳窗口。当发送方收到它时,这个窗口大小就成为了可用窗口。
发送和接纳段须要期间。因此,接纳窗口在特定时辰不等于可用窗口。
让咱们模拟一次性恳求和照应,以更好地理解滑动窗口的上班原理。
有两个修正简化了咱们的计算。
1*sAF4A2TyNeItzw2yK0xI9g.png
下面是一个显示了10个步骤示例的图表。
客户端恳求一个资源,主机以三个段照应它:
每一方都可以同时是发送方和接纳方。
咱们假定客户端的发送窗口(SND.WND)为300字节,接纳窗口(RCV.WND)为150字节。因此,主机的SND.WND为150字节,RCV.WND为300字节。
1*cU9TEaEoezDwvw__3G1DFw.png
这是客户端的起始形态。
咱们假定它之前曾经从主机接纳了300字节,因此RCV.NXT指向301。
由于它还没有发送任何内容,SND.UNA和SND.NXT都指向1。
1*IYBc3_OiPWAZ7JCvIaktkA.png
依据这个公式,客户端的可用窗口大小是1 + 300 - 1 = 300。
1*kfa6ZdhSR_VJggJ2abUSAQ.png
这是主机的起始形态,反映了另一侧的形态。
由于它曾经发送了300字节,SND.UNA和SND.NXT都指向301。
由于客户端还没有发送任何恳求,RCV.NXT指向1。
主机的可用窗口是301 + 150 - 301 = 150。
如今,第1步开局了。
客户端发送了第一个100字节的恳求。在这一刻,窗口出现了变动。
可用窗口变为1 + 300 - 101 = 200。
1*ug0laVIMWQ3HGG-kPjZ0KA.png
在第2步,咱们关注了主机。
可用窗口变为301 + 150 - 351 = 100。
1*GAZqLwbVGj2yqUnm5DyI4w.png
移动到客户端。
可用窗口变为101 + 300 - 101 = 300。
1*50UitYxS9XW3N4XV2Z7tOg.png
再次移动到主机的一端。
可用窗口是100字节。主机可以发送80字节的段。
可用窗口变为301 + 150 - 431 = 20。
1*soNJeyvqRj0zqDDrtBL9Fg.png
客户端接纳了文件的第一局部并立刻发送了ACK。
可用窗口坚持在300。
1*QJKwuY3HvslR9601ZRWCxA.png
此时,主机在发送第2步时接纳到ACK时。
1*thuJ7lCYqreqxsL8nMz_ag.png
在第4步中,主机发送了文件的第一个80字节局部,并再次收到了ACK确认。
可用窗口的计算变为431 + 150 - 431 = 150。
1*8sS5S0OkW0I2Vbp40nkkZQ.png
在第8步,主机发送了文件的第二局部,共100字节。
可用窗口的计算变为431 + 150 - 531 = 50。
1*qXP9BCX80vPpkplc5utP6Q.png
接上去,轮到客户端。
可用窗口坚持不变。
1*LkQ7tG-_1XQROjOZ3vTC9g.png
最后,主机接纳了前一个照应的ACK。
可用窗口的计算变为531 + 150 - 531 = 150。
在之前,咱们假定发送窗口和接纳窗口坚持不变。但在实践状况中,这个假定是不正确的,由于两个窗口中的字节存在于操作系统缓冲区中,而缓冲区中的可用空间可以调整。当咱们的运行程序不可极速读取缓冲区中的字节时,可用空间会减小。
让咱们看看窗口出现变动的状况,以及它如何影响可用窗口。
1*qyjkUdkAdsfrkRkqVlPClw.png
为了简化,本例重点关注客户端的可用窗口。在这个示例中,客户端一直是发送方,主机是接纳方。
1*u3KoxvVK-rrM1g4gX6fbZQ.png
当主机发送ACK时,它还包含了降级后的窗口大小。
1*pkiC_TWGpIZF3aSPOz6lcA.png
一开局,客户端发送了一个150字节的恳求。
1*zs4VuHChJJ-7vWFmXyr8Ug.png
当主机接纳恳求时,运行程序读取了前50字节,剩下的100字节依然在缓冲区中,从接纳窗口中占用了100字节的可用空间。因此,接纳窗口增加到了200字节。
接上去,主机发送了一个带有降级后的200字节接纳窗口的ACK。
1*SZDl6q22CB6kzY3P-CCHFA.png
客户端接纳ACK并将其发送窗口大小降级为200。
此时,可用窗口与发送窗口相反,由于一切150字节都已获取确认。
1*6gKYyaDUdOQSEGfHh6SWdA.png
再次,客户端发送了另一个200字节的恳求,经常使用了可用窗口中的一切可用空间。
1*uJiRzHmdV4kT8lPW62bz0g.png
在主机接纳了这200字节之后,运行程序依然运转缓慢,总共只读取了70字节,将280字节留在缓冲区中。这造成接纳窗口再次增加,如今只剩下20字节。
在ACK信息中,主机与客户端分享了降级后的窗口大小。
1*xnUjR-R45hPoGO7qhvCHKg.png
再次,客户端在收到ACK后将其发送窗口降级为20字节,可用窗口也变为20字节。
在这种状况下,假设没有更多来自主机的信息,客户端将中止发送大于20字节的恳求,直到在后续信息中收到另一个窗口降级。
那么,假设没有更多信息来自主机,咱们会被困在20字节的可用窗口吗?
不会。为了防止这种状况,客户端的TCP活期检测窗口大小。
一旦监禁更多的空间,
可用窗口就会扩展,可以发送更多的数据。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载联系作者并注明出处:https://www.duobeib.com/diannaowangluoweixiu/8622.html