开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第22天
什么是TCP中的滑动窗口
TCP使用流水线传输和滑动窗口协议(以字节为单位)实现高效、可靠的传输。
发送窗口和接收窗口
发送窗口: 发送方维持一个发送窗口,位于发送窗口内的分组都可以被连续发送出去,而不需要等待对方的确认。在没有收到确认的情况下,发送方可以连续把窗口内的数据全部发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便在超时重传时使用
接收窗口: 只允许接收落入窗口内的数据
举例:假设A为发送方,B为接收方,A就会根据B的接收窗口大小来构建自己的发送窗口,窗口内的数据都是允许发送的,窗口越大,对方确认前可以一次性发送过去的数据就越多,传输效率也就越高。但注意窗口也不宜过大,若传输中出现差错,窗口越大,需要重传的数据也越多。所以需要根据实际情况来确定窗口大小
前沿与后沿中间就是我们的窗口,为防止重复发送现象,前沿一般情况下禁止收缩
接收窗口视角:
如在接收时,32、33字节已到,但31并未收到,这时B就会发送确认号为31的报文,表示下一次数据传输希望从31开始接收(也就是从出错的地方开始重传)
当A接收到确认号为31的报文,就会从31号数据开始向B传输,如果传输给B 31、32、33三个字节,那么B的窗口就会向前移动三位,向A回复确认号为34的报文。当A收到确认后,A的窗口也会向前移动三位,就这样不断发送、确认、移动,来完成数据的传输
因为数据是成批传输的,所以我们需要设置缓存来暂时存放一部分数据:
发送缓存:
- 发送应用程序传送给发送方TCP准备发送的数据
- TCP已发送出但尚未收到确认的数据
缓存中的字节数 = 发送应用程序最后写入缓存的字节 - 最后被确认的字节
接收缓存:
- 按需到达,但尚未被接收应用程序读取的数据
- 未按序到达的数据