其他分享
首页 > 其他分享> > 计算机网络-5-6-TCP可靠传输的实现

计算机网络-5-6-TCP可靠传输的实现

作者:互联网

TCP可靠传输的实现

以字节为单位的滑动窗口

TCP的滑动窗口是以字节为单位的。现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31(这表明B期望接收到的下一个序列号为31,而序号30为止的数据已经接收到了),根据这两个数据,A就构造出了自己的发送窗口,如图5-15所示。

我们首先讨论发送发A的发送窗口,发送窗口表示:在没有收到B确认的情况下,A可以连续的把窗口内的数据都发送出去。凡是已经发送出去的数据,在未收到确认之前都必须暂时保留,以便在重传时使用。

发送窗口里面的序号表示允许发送的序号,显然,窗口越大,发送方就可以在收到对方确认之前发送的数据就越多,因此就可以提高传输速率。前面讲过,接收方会把自己的接收窗口数值放在窗口字段中发送给对方。因此,A 的发送窗口一定不能超过 B 的接收窗口数值。在后面的我们将要讨论,发送方的发送窗口大小还要受到当时网络拥塞程度的制约。但在目前,我们暂不考虑网络拥塞的影响。

发送窗口后延部分表示已经已经发送且收到了确认。这些数据显然不在需要保留了,发送窗口前沿的部分表示不允许发送,因为接收方还没有为这部分数据提供缓存空间。

发送窗口的位置由窗口前沿和后延位置共同确定。发送窗口后沿的变化情况有两种可能,即不动(没有收到新的确认)和前移(收到了新的确认)。发送窗口后沿不可能向后移动,因为不能撤销掉已收到的确认。发送窗口前沿通常是不断向前移动,但也有可能不动。这对应于两种情况:一是没有收到新的确认,对方通知的窗口大小也不变;二是收到了新的确认但对方通知的窗口缩小了,使得发送窗口前沿正好不动。

发送窗口前沿也有可能向后收缩。这发生在对方通知的窗口缩小了。但 TCP 的标准强
烈不赞成这样做。因为很可能发送方在收到这个通知以前已经发送了窗口中的许多数据,现
在又要收缩窗口,不让发送这些数据,这样就会产生一些错误。
现在假定 A 发送了序号为 31 ~ 41 的数据。这时,发送窗口位置并未改变(图 5-16),
但发送窗口内靠后面有 11 个字节(灰色小方框表示)表示已发送但未收到确认。而发送窗
口内靠前面的9个字节(42~50)是允许发送但尚未发送的。

image

从以上所述可以看出,要描述一个发送窗口的状态需要三个指针:P1,P2和 P3(图 5-16)。指针都指向字节的序号。这三个指针指向的几个部分的意义如下:

再看一下B 的接收窗口。B 的接收窗口大小是 20。在接收窗口外面,到 30 号为止的数据是已经发送过确认,并且已经交付主机了。因此在 B 可以不再保留这些数据。接收窗口内的序号(31 ~ 50)是允许接收的。在图 5-16 中,B 收到了序号为 32 和 33 的数据。这些数据没有按序到达,因为序号为 31 的数据没有收到(也许丢失了,也许滞留在网络中的某处)。请注意,B只能对按序收到的数据中的最高序号给出确认,因此 B 发送的确认报文段中的确认号仍然是31(即期望收到的序号),而不能是32或33。
现在假定B收到了序号为31的数据,并把序号为31~33的数据交付主机,然后B删除这些数据。接着把接收窗口向前移动3个序号(图5-17),同时给A发送确认,其中窗口值仍为 20,但确认号是 34。这表明 B 已经收到了到序号 33 为止的数据。我们注意到,B还收到了序号为37,38和40的数据,但这些都没有按序到达,只能先暂存在接收窗口中。A 收到 B 的确认后,就可以把发送窗口向前滑动 3 个序号,但指针 P2不动。可以看出,现在 A 的可用窗口增大了,可发送的序号范围是 42~53。

image

A 在继续发送完序号 42 ~ 53 的数据后,指针 P2向前移动和 P3重合。发送窗口内的序号都已用完,但还没有再收到确认(图5-18)。由于A的发送窗口已满,可用窗口已减小到零,因此必须停止发送。请注意,存在下面这种可能性,就是发送窗口内所有的数据都已正确到达B,B也早已发出了确认。但不幸的是,所有这些确认都滞留在网络中。在没有收到B的确认时,A不能猜测:“或许B收到了吧!为了保证可靠传输,A只能认为B还没有收到这些数据。于是,A在经过一段时间后(由超时计时器控制)就重传这部分数据,重新设置超时计时器,直到收到 B 的确认为止。如果 A 收到确认号落在发送窗口内,那么 A 就可以使发送窗口继续向前滑动,并发送新的数据。

image

发送方的应用进程把字节流写入了TCP的发送缓存中,接收方的应用进程从TCP的接收缓存中读取字节流数据。下面我们就讨论窗口和缓存之间的关系.这里首先明确两点:

我们首先查看一下图5-19(a)发送方的情况:

发送缓存用来暂时存放:

发送窗口只是发送缓存的一部分,已被确认的数据应当从缓存中被删除。因此发送缓存和发送窗口的后延是重合的。发送应用程序最后写入发送缓存的字节减去最后被确认的字节,就是还保留在发送传中的被写入的字节数。发送应用进程必须控制写入缓存中的速度。不能太快,否则发送缓存就没有存放数据的空间。

再看一下图(b)接收方的情况。

接收缓存暂时用来存放:

如果收到的分组有差错,则要丢弃 。如果接收应用进程来不及读取收到的数据,接收缓存中就会被填满,使接收窗口减少到0。反之,如果接收应用程序接收到数据能够及时从接受缓存中读取到数据,接收窗口就可以增大,但最大就不能超过接收缓存的大小。图(b)还指出了下一个期待收到的字节号,这个字节号也是接收方给发送方的报文段中首部的确认号。

根据以上总结出:

最后强调:TCP通信是全双工通信。通信中的每一方都在发送和接收报文段,因此,每一方都有自己的发送窗口和接收窗口。在谈到这些窗口的时候,一定要分清楚。

标签:发送,发送窗口,收到,确认,TCP,计算机网络,传输,窗口,接收
来源: https://www.cnblogs.com/xiaomitu/p/15847622.html