TCP可靠传输——滑动窗口

TCP是如何保证可靠传输的?来看看滑动窗口~-~


1、什么是滑动窗口?


TCP的滑动窗口是以字节为单位的。


现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31.根据这两个数据,A构造出了自己的发送窗口TCP可靠传输——滑动窗口

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


发送窗口的位置由窗口前沿和后沿的位置共同确定:

  • 后沿不动——没有收到新的确认

  • 后沿前移——收到了新的确认

  • 前沿前移——收到新的确认,或者接收方的窗口大小变大

  • 前沿不动——没有收到新的确认,接收方的窗口大小不变 ,或者收到了新的确认,但接收方的窗口缩小

现假定A发送了序号为31~41的数据。这时,发送窗口位置并未改变,但发送窗口内靠后面有11个字节表示已经发送但未收到确认。而发送窗口内靠前面的9个字节是允许发送但尚未发送的

TCP可靠传输——滑动窗口

小于P1的是已经发送并收到确认的部分,而大于P3的是不允许发送的部分

P3-P1 = A的发送窗口

P2-P1 = 已经发送但尚未确认的字节数

P3-P2 = 允许发送但尚未发送的字节数(可用窗口)

再来看一下B的接收窗口。B的接受窗口大小是20.在接收窗口外面,到30为止的数据是已经发送过确认,并且已经交付主机了。因此在B中可以不保留这些数据,接受窗口内的数据(31~50)是允许接收的。B已经收到32和33的数据,这些数据没有按序到达,因为序号31的数据没有收到,B只能对按序收到的数据中的最高序号给出确定,因此B发送的确认报文段中的确认号仍然是31.


2、窗口和缓存的关系

《1》发送缓存和发送窗口

TCP可靠传输——滑动窗口

发送缓存用来暂时存放发送应用程序传送给发送发TCP准备发送的数据;TCP已经发送但尚未收到确认的数据

发送窗口只是发送缓存的一部分。已经被确认的数据应当从发送缓存中删除。发送缓存和发送窗口的后沿是重合的。

《2》接收缓存和接收窗口

TCP可靠传输——滑动窗口

接收缓存用来暂时存放按序到达的、但尚未被接收应用程序读取的数据;为按序到达的数据

如果应用程序不及时读取缓存数据,那接收缓存最终就会被填满,使接收窗口减小到零;

如果应用程序即使读取缓存数据,接收窗口就可以增大,但最大不超过接收缓存的大小。


3、根据以上内容,强调以下3点:

(1)虽然A的发送窗口是根据B的接收窗口设置的,但在同一时刻,A的发送窗口大小并不总和B的接收窗口一样大,这是因为网络传送窗口值需要一定的时间滞后。

(2)对于不按序到达的数据如何处理,TCP标准并无明确规定。通常TCP对不按序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用程序。

(3)TCP要求接收方必须有累积确认的功能,这样可以减少传输开销。