TCP的滑动窗口是以字节为单位的。
对于A和B的连接,现在假设只有A在发送数据,而B给出确认。
发送窗口和接收窗口
发送缓存和发送窗口

A作为发送方存在一块发送缓存,发送缓存存放:
①发送应用程序传给发送方TCP准备发送的数据
②TCP已发送但未收到确认的数据
A的发送窗口:在没收到B的确认时,A可以连续把窗口内的数据都发送出去,已发送的数据在没收到确认时都要暂时保留用以超时重传。(个人理解发送窗口就是相对已确认的最后一个序号的偏移量,在这个偏移量之内的数据可以发送出去)

发送窗口通常只是发送缓存的一部分。已被确认的数据应该从发送缓存中移除,所以发送缓存和发送窗口的后沿是重合的。
发送窗口的位置由前沿和后沿的位置共同决定。后沿后面的部分表示已经发送并且收到了确认,前沿之前表示不允许发送的数据,前沿和后沿之间就是窗口大小。
接收缓存和接收窗口

B作为接收方存在一块接受缓存,接受缓存存放:
①按序到达尚未被接收应用程序读取的数据
②未按序到达的数据
B的接收窗口:从最后一个确认号算起,B还能够接收的数据。
滑动窗口
A向B发送连续的数据,如果B收到的数据是
(1) 按序到达的,则对最后一个序号发送确认
(2) 如果B没有按顺序收到数据,通常接收方会临时存放在接收窗口中,等待收到字节流中缺少的部分之后再按序交付上层应用进程
(3) 收到的分组检测到有差错,那么就丢弃该分组
如果A长时间收不到B发回确认,则A认为B没有收到这些数据,经过一段时间之后(由超时计时器控制)A就会重传未确认的数据,重新设置超时计时器,直到收到B的确认。当A收到的确认号落在发送窗口内,A就可以向前滑动发送窗口,并发送新的数据。
流量控制
接收方在给发送方发送确认时,会通告发送方接收窗口的大小,从而改变发送方的发送窗口,实现了控制发送方的发送速率。这就是流量控制。


