文章插图
流量控制和拥塞控制从汉语字面上并不能很好的区分 , 本质上这一对算法既有区别也有联系 。
维基百科对于流量控制Flow Control的说明:
In data communications, flow control is the process of managing the rate of data transmission between two nodes to prevent a fast sender from overwhelming a slow receiver.
It provides a mechanism for the receiver to control the transmission speed, so that the receiving node is not overwhelmed with data from transmitting node.
在数据通信中 , 流量控制是管理两个节点之间数据传输速率的过程 , 以防止快速发送方压倒慢速接收方 。它为接收机提供了一种控制传输速度的机制 , 这样接收节点就不会被来自发送节点的数据淹没 。
可以看到流量控制是通信双方之间约定数据量的一种机制 , 具体来说是借助于TCP协议的确认ACK机制和窗口协议来完成的 。窗口分为固定窗口和可变窗口 , 可变窗口也就是滑动窗口 , 简单来说就是通信双方根据接收方的接收情况动态告诉发送端可以发送的数据量 , 从而实现发送方和接收方的数据收发能力匹配 。
这个过程非常容易捕捉 , 使用wireshark在电脑上抓或者tcpdump在服务器上抓都可以看到 , 大白在自己电脑上用wireshark抓了一条:
文章插图
我们以两个主机交互来简单理解流量控制过程:
文章插图
接收方回复报文头部解释:
文章插图
图中RcvBuffer是接收区总大小 , buffered data是当前已经占用的数据 , 而free buffer space是当前剩余的空间 , rwnd的就是free buffer space区域的字节数 。
HostB把当前的rwnd值放入报文头部的接收窗口receive window字段中 , 以此通知HostA自己还有多少可用空间 , 而HostA则将未确认的数据量控制在rwnd值的范围内 , 从而避免HostB的接收缓存溢出 。可见流量控制是端到端微观层面的数据策略 , 双方在数据通信的过程中并不关心链路带宽情况 , 只关心通信双方的接收发送缓冲区的空间大小 , 可以说是个速率流量匹配策略 。
流量控制就像现实生活中物流领域中A和B两个仓库 , A往B运送货物时只关心仓库B的剩余空间来调整自己的发货量 , 而不关心高速是否拥堵 。
4.2 为什么需要拥塞控制前面我们提到了微观层面点到点的流量控制 , 但是我们不由地思考一个问题:只有流量控制够吗?答案是否定的 。
我们还需要一个宏观层面的控去避免网络链路的拥堵 , 否则再好的端到端流量控制算法也面临丢包、乱序、重传问题 , 只能造成恶性循环 。
文章插图
我们从一个更高的角度去看大量TCP连接复用网络链路的通信过程:
文章插图
所以拥塞控制和每一条端到端的连接关系非常大 , 这就是流量控制和拥塞控制的深层次联系 , 所谓每一条连接都顺畅那么整个复杂的网络链路也很大程度是通畅的 。
文章插图
在展开拥塞控制之前我们先考虑几个问题:
- 如何感知拥塞
在TCP连接的发送方一般是基于丢包来判断当前网络是否发生拥塞 , 丢包可以由重传超时RTO和重复确认来做判断 。
文章插图
- 如何利用带宽
推荐阅读
- 轻松学习http知识让枯燥的内容变得生动有趣:TCP/IP四层模型
- Java中的BigDecimal,你真的会用吗?最强指南
- 为何视频流/网游大都使用UDP协议,而不用TCP协议?
- TCP粘包、拆包与解决方案
- 地球最强悍的生物 超级地球上有生命
- ICMP ARP协议 TCP&UDP协议相关介绍,两分钟快速掌握
- TCP粘包的解决方案
- TCP 拥塞避免算法
- 看一遍忘一遍的网络七层模型与TCP/UDP,重新总结出来
- 世界上最烈的啤酒排名是什么?