1 TCP可靠传输的实现
1.1 以字节为单位的滑动窗口
TCP滑动窗口以字节为单位。如下图:
滑动窗口在网络传输中,逻辑表述分别是:左边界,右边界。
A收到B的确认好是31,这表示B已经成功接受前面30个字节的数据,即发送窗口后沿部分。并告诉A发送窗口大小为20个字节。
发送窗口的含义是:A接下来可以把窗口内的数据都发送出去。而且在A未收到B的确认前,A将根据超时重传机制,重发窗口内的数据(暂存未收到确认的数据,并设置计时器)。注意:A的发送窗口大小不能超过B的接受窗口的大小。
1.2 窗口后沿、前沿
发送窗口的位置,右前沿和后沿共同确定。例子中:窗口大小为:31 - 50 ,供20个字节。
后沿位置有两种情况:
- 后沿不动
表示一直没收到确认信息。 - 后沿向前移动
表示收到了发送窗口内的连续确认信息。
注意:后沿窗口不可能向后移动,这是因为不可能撤销已经确认的信息
前沿位置有可能也有两种情况:
- 向前移动
正常收到确认信息,通知的窗口大小不变,或者变大。
比如:收到2个字节的确认,即使通知的窗口大小不变,前沿也会向前移动2个字节。 - 不动
1,没有收到确认消息,对方通知的窗口大小也不变;
2,收到确认消息,但是对方通知的窗口变小
例如:收到2个字节的确认,通知窗口大小减少2个字节。这种情况下窗口大小刚好不变。 - 向后收缩
例如:收到2个字节的确认,但是对方的通知窗口大小减少3个字节。导致前沿位置向后收缩。
TCP标准强烈不赞成这样做。
1.2.1 滑动窗口原理
滑动窗口例子1.2.1.1 发送方
一个发送窗口的状态需要三个指针:P1,P2,P3;指针都指向字节的序号。几个部分的意义如下:
P3 - P1 = A发送窗口的大小;
P3 - P2 = 尚未发送的字节数,表示A的可用窗口;
P2 - P1 = 已发送,未收到确认的字节数;
1.2.1.2 接收方
如果B收到了序号为32,33的两个数据,所以,A的数据没有顺到达,序号为31的数据没有收到。B发送的确认报文段中,确认号仍然是31。
假如B收到了31序号的数据,那么B将31,32,33三个字节的数据交付上层应用程序。并从接收缓存中删除这些数据,并在返回报文中奖确认号修改为34(下次想收到的第一个字节的序号)。
当A收到确认报文后,将发送窗口向前移动3个字节,但指针P2不动。A的可用窗口变大了。
如下图所示,B的接收窗口前沿和A的发送窗口前沿都向前滑动了3个字节。并且B还收到了序号为37,38,40的字节。但因为不是连续的字节,并且起始序号不是34,所以B在接收缓存中缓存这部分数据。
B收到了连续的31,32,33序号的字节数据A继续发送完序号42-53的数据后,P2移动到和P3重合。这是A的可用窗口变为0,停止发送数据。
异常情况:A成功发送42-53的数据,B也收到了这些数据,并且B也给出了确认号为53的数据。但是因为B的确认信息,一直滞留在网络中。当A等待的时间,超过超时重传机制设置的定时器时间时,A将重传42-53的数据。知道收到B的确认号位置。
注意
B可以返回连续接收到的最大序号+1,作为确认号回复给A。
例如:B成功接收到34-40序号的数据(上次B缓存了37,38,40,然后B又收到了34,35,36序号的
字节的报文),B会给出去确认号为41的确认报文。A收到B确认号为41的报文后,A的发送窗口
前沿将向前移动7个字节,即P2不懂,待在54的地方,P3移动到61的地方。同理,P1移动到41
的位置(即B发送的确认号)。
从上面看得出来,A的可用窗口的大小表示A可以发送的字节数。B的P1指针是B返回的最新的确认号。
1.3 TCP缓存
缓存和窗口的关系发送缓存和接收缓存的大小都有限制,并可以重复使用。
1.3.1 发送缓存
从上图可以看出,发送缓存和发送窗口的后沿重合,并且被确认的数据应该从发送缓存中移除。
一般的关系是:
已发送 < 发送窗口 < 发送缓存
发送缓存用来存放:
1,发送应用程序传递给发送方TCP准备发送的数据;
2,TCP已发送,但是没有收到的确认的数据。
1.3.2 接收缓存
接收缓存用来存放:
1,按序到达,还未被接收应用程序读取的数据;
2,未按序到达的数据。
接收窗口的大小收到接收应用程序读取数据的速度,如果来不得读取,则接收缓存为被填满,而使接收窗口变为0。所以,接收应用程序读取数据的速度越快,接收窗口会越大。但是最大不能超过接收缓存的大小。
网友评论