TCP 流量控制, 简单来说就是让数据传输端传输的速率不要太快, 让数据接收端来得及接收, 利用滑动窗口机制可以很方便的在 TCP 连接上实现对数据传输端的流量控制. TCP 的窗口单位是字节, 不是报文段, 数据传输端的发送窗口不能超过接收端给出的接收窗口的数值, 流量控制的机制是控制丢包率, 主要目的: 让数据传输端了解数据接收端当前的接收能力, 可灵活调整传输速率. 流量控制机制图如下图所示:
滑动窗口:
TCP 采用大小可变的滑动窗口进行流量控制, 窗口大小的单位是字节.
数据传输窗口在连接建立时由双方商定. 但在通信的过程中, 数据接收端可根据自己的资源情况, 随时动态地调整对方的传输窗口大小. 滑动窗口实例图如下图所示:
滑动窗口引进原由:
我们可以把窗口理解为缓冲区(但是有些窗口和缓冲区又不太一样).
如果没有这些 "窗口", 那么 TCP 每发送一段数据后都必须等到数据接收端确认后才能发送下一段数据, 这样做的话 TCP 传输的效率实在是太低了.
解决的办法就是在发送端等待确认的时候继续发送数据, 假设发送到第 X 个数据段是收到数据接收端的确认信息, 如果 X 在可接受的范围内那么这样做也是可接受的. 这就是窗口 (缓冲区) 引入的缘由.
滑动窗口:
A, 数据接收端窗口? X
接收端缓冲区大小. 接收端将此窗口值放在 TCP 报文的首部中的窗口字段, 传送给发送端.
B, 拥塞窗口 Y
发送端缓冲区大小
C, 数据传输窗口 Z
发送窗口的上限值 = Min [X, Y]
1 当 X < Y 时, 是接收端的接收能力限制数据传输窗口的最大值.
2 当 Y < X 时, 则是网络的拥塞限制数据传输窗口的最大值.
滑动窗口实例介绍:
数据传输端已发送了 400 字节的数据, 但只收到对前 200 字节数据的确认, 同时窗口大小不变. 还可发送 300 字节.
数据传输端收到了对方对前 400 字节数据的确认, 但对方通知数据传输端必须把窗口减小到 400 字节. 现在数据传输端最多还可发送 400 字节的数据.
滑动窗口需掌握的知识点:
A, 数据接收端将自己可以接受的缓冲区大小放入 TCP 首部中 "窗口大小" 字段, 通过 ACK 来通知数据传输端.
B, 窗口大小字段越大, 说明网络的吞吐率越高
C, 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值, 即就是说不需要数据接收端的应答, 可以一次连续的发送数据.
D, 操作系统内核为了维护滑动窗口, 需要开辟发送缓冲区, 来记录当前还有哪些数据没有应答, 只有确认应答过的数据, 才能从缓冲区删除. PS: 发送缓冲区如果太大, 会有空间开销.
E, 数据接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给数据传输端, 数据传输端收到这个值后, 就会减慢自己的发送速度.
F, 如果数据接收端发现自己的缓冲区满了, 就会将窗口大小设置为 0, 此时数据传输端不再传输数据, 但是需要在定期发送一个窗口探测数据段, 使数据接收端把窗口大小告诉数据传输端.
PS: 在 TCP 的首部, 有一个 16 为窗口字段, 此字段就是用来存放窗口大小信息的.
TCP 报文段发送时机的选择
1,TCP 维持一个变量, 它等于最大报文段长度 MSS, 只要缓存中存放的数据达到 MSS 字节就组装成一个 TCP 报文段发送出去.
2, 由发送方的应用程序指明要求发送报文段, 即 TCP 支持的推送操作.
3, 是发送方的一个计时器期限到了, 这时就把当前已有的缓存数据装入报文段发送出去.
来源: http://www.bubuko.com/infodetail-3156779.html