0x01 前言
终于考完了马原完成了大学的最后一门考试,可以愉快的写代码了~今天就来记录一下我的下载器中是如何实现限速的。
0x02 限速的对象
市面上常见的专业下载器都会提供下载/上传限速这个功能,那限速究竟是限的哪一个速度呢?
我们都知道HTTP/HTTPS的传输层协议是TCP,TCP是基于字节流的。字节流在Java中对应的就是InputStream和OutputStream。基于TCP的传输层下载/上传的步骤一般是
建立TCP连接,对应Java的Socket.connect()。这期间会经历三次握手,是一个耗时过程,可以使用连接复用优化(OKHttp已经做了连接池缓存)。
连接成功后就可以根据需要收发数据,利用Socket获取到连接的InputStream和OutputStream操作即可。
关闭连接。
以下载为例,首先连接步骤是不需要限速的,因为连接部分通常是很快的,并且往往都想要连接更加快速。所以,我们限速的对象肯定就是从socket的InputStream这一步骤。
0x03 如何“限速”?
首先,这里的限速并不是真的限制读写数据流每时每刻的速度。这里要分清高中物理学过的两个概念——瞬时速度和平均速度。
设
为
时刻下载的字节,