流量控制
流量控制的原因在于, 传输中接收端的接受能力是有限的, 如果发送的数据过多, 就会出现接受端缓冲区塞满, 数据被迫丢弃, 造成丢包问题, 浪费资源.
TCP协议中, 为了控制这种情况的出现, 引入了流量控制.
发送端和接收端, 互相在传输中, 协商缓冲区大小, 控制发送的数据量, 合理的利用网络资源.
- 接收端在返回给发送端的响应中, 在TCP报头中放入自己的剩余缓冲区大小
- 发送端根绝接收端发送给自己的缓冲区剩余大小, 动态的调整每次发送的数据的多少
- 如果接收端的缓冲区已经满了, 就会返回给发送端一个缓冲区为0的报文, 发送端也就不会再发送了
- 发送端每隔一段时间, 向接收端发送一个探测数据段来探测接收端的缓冲区是否可以进行接收了.如果缓冲区空间有了, 就继续发送
上面的几条概念, 就是整个流量控制的基本逻辑
此处借用 《图解TCP/IP》书中插图来说明
拥塞控制
拥塞控制产生的原因在于, 网络同时传输的资源是有限的, 虽然每个人都有自己的流量控制了, 但是当大家只想着自己的数据传输, 而不考虑别人, 如果同时发送的人过多, 就会超过网络传输的上限, 大家都不能正确的发送数据, 所以引入了流量控制.
TCP协议中为了解决问题, 引入了拥塞控制
- 拥塞控制通过拥塞窗口和慢启动来实现
- 拥塞窗口和发送数据的滑动窗口一样, 只是限制了发送数据的缓冲区大小
- 慢启动是一个方法, 来动态的管理拥塞窗口
慢启动
拥塞窗口一开始的大小是1个数据段(1个数据段是1460个字节,这个是以太网的标准),之后开始发送数据, 通过慢启动来动态调整拥塞窗口大小.
丢包重发有两种形式:
第一种: (丢包后, 发送端因为长时间没有收到接收端的响应, 就会重新发送数据, 超过3次, 表明发送超时)
第二种: (同样丢包了, 但是发送端重新发送了, 然后接收到了接收端的确认报文, 表明发送到了, 只不过多发送了几次, 这就是重复确认应答)
- 拥塞窗口在慢启动时, 会先指数增长, 如果增长中发送数据, 出现数据的超时丢包, 就会设置一个拥塞阀值, 大小为当前拥塞窗口的1/2,并从最小拥塞窗口开始慢启动
- 当有了拥塞阀值后, 拥塞窗口增长大小超过了拥塞阀值, 就会以线性增长, 而不会指数增长了.
- 而当出现了重复确认应答后, 就会将拥塞阀值设置为1/2. 并将拥塞窗口设置为拥塞阀值+3个数据段, 然后再次进行慢启动.
- 如此往复, 以为网络环境是冬天变化的,所以大小也是这样动态变化的.