response, err := client.Do(reqest)
defer response.Body.Close()
当我client.Do(reqest) 完了以后,所有数据是已经在内存里面了吗?
ioutil.ReadAll(response.Body) 还是这个才是从服务网GET数据下来?
如果我想控制下载的速度,是不是就是在read这一步 限制下读取速度?(前提是read的时候,是从服务器上拉数据...,代码在下面..)
buf := make([]byte, 1024)
for {
n, err := r.Body.Read(buf)
if err != nil {
break
}
}
如果 buffer 满了,客户端会通过 winsize=0 告知服务端 buffer 满了,这时服务端不会再发送数据,而是会检测客户端啥时候buffer酉空间了(或客户端酉空间了告知服务端)。因此,从这个意义上来说,可以通过控制读取速度来控制从服务器拉数据的速度。
Linux TCP socket buffer 相关的知识:
socket buffer size缺省为64 kB.
理论上,最优的buffer大小为<bandwidth>*<round-trip delay>
可以通过下列命令改变其大小(如256KB)
% sysctl -w net.core.rmem_max=262144 ;最大的接收缓冲区大小(tcp连接)
% sysctl -w net.core.wmem_max=262144 ;最大的发送缓冲区大小(tcp连接)
% sysctl -w net.core.rmem_default=262144;缺省的接收缓冲区大小(tcp连接)
% sysctl -w net.core.wmem_default=262144;缺省的发送缓冲区大小(tcp连接)
这些参数在proc/sys下面可以看到;
sysctl -p | grep mem:显示当前缓冲区设置
round-trip delay 可由ping命令得到。
#5
更多评论
嗯,是这样的。网络 IO,读的时候才会获取数据。
相关跟代码:[transfer.go?s=7038:7050#L290](http://docs.studygolang.com/src/pkg/net/http/transfer.go?s=7038:7050#L290)
#1
HTTP 请求一旦发出,服务端不管你读不读,都会响应数据,也就是数据会传输过来,不过,这时候数据是在操作系统实现的协议栈的buffer中,也就是操作系统保存了。
从 resp.Body 中读,只是从协议数据中把数据读到当前程序中。不会影响网路数据的传输。
#2