目录
一、基本概念:
1.RTT和RTO:
RTT:(Round Trip Time)发送一个数据包收到对应的ACK,所花费的时间
RTO:(Retransmission TimeOut)重传时间间隔
二、TCP使用滑动窗口做流量控制与乱序重排的目的
1保证TCP的可靠性
2保证TCP的流控特性
->TCP报文头中的Window即指滑动窗口
三、滑动窗口数据的计算:
以下均为从左到右序号逐渐递增
发送端:
LastByteAcked:已经发送并且收到回复的最后一个序号位置
LastByteSent:已经发送但还没有时候到回复的最后一个序号位置
LastByteWritter:已经准备好的但还没发送的最后一个序号位置
接收端:
LastByteRead:收到并已经回复的最后一个位置
NextByteExcepted:收到的连续最大的sequence的位置(已经收到但还没有发送回复ACK)
LastByteRcvd:已收到的最后一个字节的位置
计算:
AdvertisedWindow = MaxRcvBuffer - (LastByteRcvd - LastByteRead)
EffectiveWindow = AdvertisedWindow - (LastByteSendt - LastByteAcked)
其中:AdvertisedWindow(接收方还可以处理的量)、MaxRcvBuffer(接收方能接收的最大数据量)、
EffectiveWindow(窗口内剩余可发送数据大小)
四、滑动窗口的基本原理
1.TCP发送方:
包含四个状态:发送并收到回复、发送还没收到回复、还没发送但是可发送、还没发送并且不可发送
(1)假设起始状态:[32~45][46~51]共同构成了滑动窗口,其中前一部分是已发送的还没收到确认的,后一部分是可发送还没发的。
(2)假设发送的片段[32~36],发送端收到接收端的ACK回复,那么滑动窗口即可向右移动5个字节
(3)此时可以将[46~51]发送出去,并且[52~56]由不可发送变为可发送,整个滑动窗口向右移动了5个字节的位置
2.TCP接收方:
包含三个状态:收到并且已回复、还没收到并且允许发送、还没收到也不允许发送
注:
1. 由于ACK直接由TCP栈回复,默认没有应用延迟,不存在已接收但未回复的状态
2.未接收但是可以接收的这段空间称为接收窗口
3。应用会根据自身处理能力的变化,通过本端TCP接收窗口大小的控制来实现对端的发送窗口进行流量限制