【校招VIP】计算机网络—滑动窗口

11月06日 收藏 0 评论 0 java开发

【校招VIP】计算机网络—滑动窗口

转载声明:文章来源https://blog.csdn.net/seeseeyoua/article/details/127637575

背景

当网络通信中每个数据包都需要确认应答,那么包的往返时间越长,网络的吞吐量就会越低,所以TCP引入了窗口这个概念。

窗口大小

窗口大小就是无需确认等待应答的最大连续发送的数据量。窗口大小由TCP头部的Window字段决定。

窗口传输丢包

假设此时发送三个数据包,分别为1,1461和2921三个,那么这三个数据包不需要等待ack包确认就可以发送下一个数据包,这样即使中间有一个ack丢失了,只要后续的ack能传输到,也能证明丢失的回应对应的数据包已经被接收到了。那么假设如果发送的数据包真丢失了怎么办?这就是上篇文章说到的快速重发机制,当1包丢了,对方都不会确认应答ack为1461,而是在后续包接收的ack回应中设置为1,提示三次发送方1包丢了,这就是快速重发机制。

Window字段

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

滑动窗口指针

接收窗口的RCV.NXT表示窗口开始的字节所在位

发送窗口的SND.UNA表示发送窗口开始所在位,SND.NXT为可以开始发送的首个字节所在位。

流量控制

流量控制是滑动窗口的一种保障机制。收发双方每次接收和发送包的时候都会像对方进行确认,有时候接收方不会立马确认,而是等待一会再确认(这里涉及处理糊涂窗口)

举个栗子:

假设此时接收方能接收的窗口大小为200字节。那么就会告知发送方window=200,seq=xxx。

发送方接收到后将自己的滑动窗口设置为200,然后发送第一个包,假设大小80字节,seq=yyy,ack=xxx+1,此时发送方的SND.NXT右移80位。

接收方拿到80数据包后,立马读取完毕,将滑动窗口右移80字节,此时RCV.NXT也就是滑动窗口数据流第一个指针指向xxx+81,随后发送seq=xxx+81。

而发送方此时还没有接收到回应的ack,紧接着又发送了120字节的数据包,ack=xxx+81,发送方的SND.NXT右移120位。此时发送方发送并且没得到回应的数据共有200字节,不在发送数据。

而接收方还没有接收到最新的ack时,这时发送方接收到了第一个ack,将滑动窗口右移80字节,SND.UNA右移80位,从yyy+81开始,而yyy+81 ---- yyy+200的数据已经发送完了,窗口大小为200,那么此时可以发送yyy+200—yyy+281的数据(此时发送方能处理的也是200不会溢出)。于是发送了seq=xxx+201,长度为80的数据包,此时发送方的SND.NXT右移80位。

接收方此时接收到了120字节的数据,读取成功后,又接收到了80字节的数据,也读取成功了,然后就将两个回应包合并成了一个,直接回应seq=xxx+281,表示下次包数据从281开始。

发送方接收到后将SND.UNA右移200位,由于没有发送数据所以SND.NXT不动。

调整窗口大小

只有接收方才知道自己的整体窗口容量大小,而发送方只知道目前接收方能处理的数据量大小。

比如接收方一开始可以接收200字节的数据,于是将window设置为200,发送方接收到后就会将可发送的数据量设置为200,然后发送200字节以内的数据。

假设发送方发送了140字节的数据,那么接收方可能接收到了,但程序还没有冲缓存区中读取完,只读取了50字节,那么此时留在窗口中的就还有90字节,那么接收方回应的时候就会回应,消息处理完了,window=110,那么接下来发送方就会认为这140个字节处理完毕了,下次发送能发送的数据就只有110个字节。

C 0条回复 评论

帖子还没人回复快来抢沙发