序号位数为n,所以可辨别的范围是2^n。所以不可能大于2^n。
若为2^n,从0开始发送发出了所有却未受到应答,对于2^n-1,对应的应该是ACK=0,可此时无法分辨这个0是2^n的下一个还是已发出去的第一个0。所以减一。避免出现重复号。
不是很懂的说,复制一个来先
滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。
如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。
滑动窗口本质上是描述接受方的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。
关于滑动窗口协议,还有三个术语,
窗口合拢:当窗口从左边向右边靠近的时候,这种现象发生在数据被发送和确认的时候。
窗口张开:当窗口的右边沿向右边移动的时候,这种现象发生在接受端处理了数据以后。
窗口收缩:当窗口的右边沿向左边移动的时候,这种现象不常发生。
TCP就是用这个窗口,慢慢的从数据的左边移动到右边,把处于窗口范围内的数据发送出去(但不用发送所有,只是处于窗口内的数据可以发送。)。这就是窗口的意义。窗口的大小是可以通过socket来制定的,4096并不是最理想的窗口大小,而16384则可以使吞吐量大大的增加。
滑动窗口协议,是TCP使用的一种流量控制方法。该协议允许发送方在停止并等待确认前可以连续发送多个分组。由于发送方不必每发一个分组就停下来等待确认,因此该协议可以加速数据的传输。
滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口;同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口。发送窗口和接收窗口的序号的上下界不一定要一样,甚至大小也可以不同。不同的滑动窗口协议窗口大小一般不同。发送方窗口内的序列号代表了那些已经被发送,但是还没有被确认的帧,或者是那些可以被发送的帧。
后退N 帧协议:假设发送窗口的大小为2n,发送方发送了0 号帧,接收窗口发送ACK1(0 帧以收到,希望接受1 号帧,但是ACK1 丢失),接着发送方发送了1 号帧,接收窗口发送ACK2(1 帧已收到,希望接受2 号帧,但是ACK2 丢失),以此类推,直到发送方发了第2n-1 号帧,接收方发送ACK2n(丢失),此时不能在发送数据了,因为已经发送了2n 个帧,但一个确认都没有收到,所以过一段时间帧0 的计时器会到达预定时间进行重发,此时发过去接收方是认为是新一轮的0 号帧还是旧一轮重传的呢?接收方并不知道,很有可能接收方就把该0 号帧当作新一轮的帧接受了,但实际上这个0 号帧是重传的,所以出现错误,即发送窗口的大小不可能为2n。现在假设发送窗口的大小为2n-1,情况和上面一样,发送方发送了0 到2n-2 号帧,接收方发送的确认帧都丢失了,如果没有丢失的话就应该接着传2n-1,但是丢失了,发送方应该发送0 号帧,但是这种情况接收方可以判断出来(即下一帧只要不是第2n-1 号帧就是重传),所以不会发生错误,如果发送窗口的小于2n-1 的话,那就更不会发生错误了。综上:后退N 帧协议的最大发送窗口是2n-1。