mouse老师,我想问一下http库里请求相关的一些实现原理,求解答
来源:1-1 Google资深工程师深度讲解go语言

Barrel
2021-07-02
问:
我使用http.get()请求一个1G左右的文件,和请求1mb左右的文件执行的速度差不多这是为什么呢?只有在真正读取数据到内存的时候才会体现快慢,这里面是什么样的原理呢?
resp, _ := http.get(url) // 这里文件不管是1G or 1M执行的都非常快
ioutil.ReadAll(resp.Body) // 这里读取的时候1G or 1M的速度才不一样
答:
难道是懒惰执行之类的?只有在用到数据的时候才会去拿?求解答
写回答
1回答
-
这个问题很好,它的确是这样,所以api才设计成返回一个类型是Reader的Body,而不是直接返回获取的内容。这样用户可以边读取边处理,而不是等一个很大的请求完全返回后才处理。
它在http.get时只是建立连接,在Body.Read的时候才开始真正读取数据。我在http.Get及resp.Body.Read之间sleep了30秒,做了个抓包实验:
我们看到初始的数据读完之后,它把Window的size设成了0,并不断发送这个zero-window的消息,以维持链接。待30秒到了以后,更新window size后开始收取数据。
具体实现的细节非常多,我这里找了两篇比较低层的文章共参考:
https://www.cnblogs.com/lshs/p/6038654.html
https://segmentfault.com/a/1190000024584420
112021-07-04
相似问题