TCP是如何保证可靠传输的?来看看滑动窗口~-~
1、什么是滑动窗口?
TCP的滑动窗口是以字节为单位的。
现假定A收到了B发来的确认报文段,其中窗口是20字节,而确认号是31.根据这两个数据,A构造出了自己的发送窗口
发送方A的发送窗口表示:在没有收到B的确认的情况下,A可以连续把窗口内的数据都发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用。
发送窗口的位置由窗口前沿和后沿的位置共同确定:
-
后沿不动——没有收到新的确认
-
后沿前移——收到了新的确认
-
前沿前移——收到新的确认,或者接收方的窗口大小变大
-
前沿不动——没有收到新的确认,接收方的窗口大小不变 ,或者收到了新的确认,但接收方的窗口缩小
小于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已经发送但尚未收到确认的数据。
发送窗口只是发送缓存的一部分。已经被确认的数据应当从发送缓存中删除。发送缓存和发送窗口的后沿是重合的。
《2》接收缓存和接收窗口
接收缓存用来暂时存放按序到达的、但尚未被接收应用程序读取的数据;为按序到达的数据;
如果应用程序不及时读取缓存数据,那接收缓存最终就会被填满,使接收窗口减小到零;
如果应用程序即使读取缓存数据,接收窗口就可以增大,但最大不超过接收缓存的大小。
3、根据以上内容,强调以下3点:
(1)虽然A的发送窗口是根据B的接收窗口设置的,但在同一时刻,A的发送窗口大小并不总和B的接收窗口一样大,这是因为网络传送窗口值需要一定的时间滞后。
(2)对于不按序到达的数据如何处理,TCP标准并无明确规定。通常TCP对不按序到达的数据是先临时存放在接收窗口中,等到字节流中所缺少的字节收到后,再按序交付上层的应用程序。
(3)TCP要求接收方必须有累积确认的功能,这样可以减少传输开销。