TCP学习笔记2 滑动窗口

TCP连接的每一端都可以收发数据,这些收发数据的管理是通过滑动窗口的结构来来维护的

发送窗口

TCP协议以字节为单位来维护窗口,其中可以为分为三个部分

  1. 已经发送并且已经收到ACK 的部分
  2. 已经发送但是未收到ACK 和 即将发送的部分
  3. 窗口移到该位置前都不可以发送的部分

随着时间的推移,发送端不断的发送和接收到ACK,并且接收到接收端的窗口通告,发送端的窗口会不算的往右移动,

下面的三个属于描述了窗口的移动情况

  1. 关闭 窗口的左边界右移,当接收到已经发送数据的ACK的时候,窗口会减小
  2. 打开 即窗口的右边界右移,使得可以发送的数量增大,这通常是因为接收端的处理了数据,缓存区变大,发送了一个更大的窗口通告。
  3. 收缩 即窗口的右边界左移,

TCP的每个报文都包含ack号和窗口通告信息,TCP发送端可以根据这些信息调节窗口的大小,窗口的左边界不能向左移动,因为左边界记录的是接收端的确认信息,具有累计性不能返回。

接收窗口

接收端也维护了一个接收窗口,窗口记录了已经接收并且确认的数据,以及能接收到的最大序列号,接收端希望避免存储重复接收的数据和已经确认的数据,并且避免存储不应该接收的数据(超过右边界的数据)

如果接收到了窗口左边界以左的数据,接收到的数据将会被丢弃,因为这些数据已经被确认接受过,超过了右边界的数据被认为无法处理也会被丢弃。只有当接收数据的序列号到等于左边界的时候,数据才会被接收处理,窗口才会向前滑动,对于使用了SACK的报文来说,这个窗口内的其他的报文也能被接收,但是只有接收到等于左边的数据时,窗口才会移动。

窗口通告

通过窗口通告,TCP 的接收方可以有效的控制发送端的发送速率,当当前的窗口为零的时候,可以有效的阻止发送端发送新的数据。当接收端已经成功处理了接收到的数据,有重新可用的缓存空间的时候,就可以发送一个窗口通告给发送方,来恢复发送。这样的窗口通告通常都不包括数据,成为纯ACK,窗口通告通常采用不可靠的方式传输。

在接收端发送一个窗口通告的同时,发送方还可以通过窗口探测的方式查询当前可用窗口,发送方发送的窗口探测包括一个有效的字节,采用TCP的可靠传输(丢失重传),这样就避免了由窗口通告丢失导致的零窗口死锁。