全网最强TCP/IP拥塞控制总结( 二 )


全网最强TCP/IP拥塞控制总结

文章插图
 
流量控制和拥塞控制从汉语字面上并不能很好的区分 , 本质上这一对算法既有区别也有联系 。
维基百科对于流量控制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抓了一条:
全网最强TCP/IP拥塞控制总结

文章插图
 
我们以两个主机交互来简单理解流量控制过程:
全网最强TCP/IP拥塞控制总结

文章插图
 
接收方回复报文头部解释:
全网最强TCP/IP拥塞控制总结

文章插图
 
图中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/IP拥塞控制总结

文章插图
 
我们从一个更高的角度去看大量TCP连接复用网络链路的通信过程:
全网最强TCP/IP拥塞控制总结

文章插图
 
所以拥塞控制和每一条端到端的连接关系非常大 , 这就是流量控制和拥塞控制的深层次联系 , 所谓每一条连接都顺畅那么整个复杂的网络链路也很大程度是通畅的 。
全网最强TCP/IP拥塞控制总结

文章插图
 
在展开拥塞控制之前我们先考虑几个问题:
  • 如何感知拥塞
TCP连接的发送方在向对端发送数据的过程中 , 需要根据当前的网络状况来调整发送速率 , 所以感知能力很关键 。
在TCP连接的发送方一般是基于丢包来判断当前网络是否发生拥塞 , 丢包可以由重传超时RTO和重复确认来做判断 。
全网最强TCP/IP拥塞控制总结

文章插图
 
  • 如何利用带宽
【全网最强TCP/IP拥塞控制总结】诚然拥塞影响很大 , 但是一直低速发包对带宽利用率很低也是很不明智的做法 , 因此要充分利用带宽就不能过低过高发送数据 , 而是保持在一个动态稳定的速率来提高带宽利用率 , 这个还是比较难的 , 就像茫茫黑夜去躲避障碍物 。


推荐阅读