Go 进阶 · 分布式爬虫实战
郑建勋
Go 语言技术专家,《Go 语言底层原理剖析》作者
15839 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 58 讲
Go 进阶 · 分布式爬虫实战
15
15
1.0x
00:00/00:00
登录|注册

17|巨人的肩膀:HTTP协议与Go标准库原理

你好,我是郑建勋。
在正式开始这节课之前,我想给你分享一段话。
学校教给我们很多寻找答案的方法。在我所研究的每一个有趣的问题中,挑战都是寻找正确的问题。当 Mike Karels 和我开始研究 TCP 拥堵时,我们花了几个月的时间盯着协议和数据包的痕迹,问 :“为什么会失败?”。
有一天,在迈克的办公室里,我们中的一个人说:“我之所以搞不清楚它为什么会失败,是因为我不明白它一开始是怎么工作的。”这被证明是一个正确的问题,它迫使我们弄清楚使 TCP 工作的 “ack clocking”。在那之后,剩下的事情就很容易了。
这段话摘自《Computer Networking A Top-Down Approach 6th》这本书,它启发我们,解决网络方面的问题,核心就是要搞懂它的工作原理。
在上节课,我介绍了一个最简单的 HTTP 请求,了解了一个网络数据包是如何跨过千山万水到达对端的服务器的。不过就像前面引文说的那样,这是不够的。所以这节课,让我们更近一步,来看看当数据包到达对端服务器之后,操作系统和硬件会如何处理数据包,同时我将介绍 HTTP 协议,带你理清 Go HTTP 标准库高效处理网络数据包的底层设计原理。

操作系统处理数据包流程

当数据包到达目的地设备后,数据包需要经过复杂的逻辑处理最终到达应用程序。数据包的处理过程大致可以分为 7 步,我们可以根据下面这张流程图一层一层来理解。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了HTTP协议与Go标准库原理,以及操作系统处理数据包流程。文章首先介绍了操作系统处理数据包的7个步骤,包括硬件中断处理、内核处理、以及操作系统与应用程序的交互。接着,文章详细解析了HTTP协议的处理过程,包括TCP协议在操作系统内核的实现以及应用层HTTP协议在应用程序中的处理。作者通过curl命令访问外部网站,并逐行解读了HTTP请求和响应的细节,帮助读者更好地理解HTTP协议。最后,文章推荐了几本深入学习HTTP协议的书籍,为读者提供了进一步学习的方向。 通过深入的技术分析,帮助读者了解了HTTP协议与Go标准库原理的底层设计原理,以及操作系统处理数据包的流程。读者可以从中获得对网络协议处理的深入理解,以及对HTTP协议细节的全面认识。文章内容涵盖了操作系统数据包处理、HTTP协议细节、Go标准库实现方式等多个方面,为读者提供了全面的技术视角和深入的学习资源推荐。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 进阶 · 分布式爬虫实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 木杉
    贴那么多书单 还不如多粘贴一些代码 可以学习呢
    2022-11-17归属地:上海
    17
  • 范飞扬
    这一讲的内容应该出现在真正需要使用到该讲的知识的时候,而不是现在就把理论一股脑抛出来。个人觉得,没有实战结合的理论,就是凭空增加认知负荷
    2022-11-19归属地:上海
    1
    11
  • kkgo
    到现在还没有进入爬虫的设计,太多基础了
    2022-11-17归属地:广东
    11
  • 周龙亭
    浅尝辄止的铺垫太多了,还不如几句话带过
    2023-01-24归属地:上海
    3
  • Geek_crazydaddy
    1.没想到啥不妥的地方,连接池的连接数量?比如大量并行请求可能会有建立大量连接? 2.保留的连接数量以及连接何时释放
    2022-11-17归属地:江苏
    3
  • 大毛
    在设计自己的爬虫框架的时候,为了解耦将所有网络请求都封装到了自己的 spiderClient 中,管理爬虫对 http 的请求。 spiderClient 组合了标准库的 http.Client,此时需要注意在并发情况下 spiderClient 是否会出现性能问题,其中感觉最关键的就是需要知晓 http.Client 是否管理了连接池,如果没有,那需要自己实现这部分。 文章说 http.Client 管理了连接池,这个问题也有久了答案。 第二个问题:Go 标准库使用了连接池,你觉得实现一个连接池应该考虑哪些因素? 连接的创建:什么时候需要创建新的连接,什么时候倾向等待其他链接的释放,是否要预创建连接 连接的销毁:什么时候自动销毁,当连接池占用的资源过多的时候是否主动释放,如果主动释放,淘汰策略是怎样的 对每个链接的控制:连接是否健康 连接池的控制:连接总数是否要限制,连接如何回收
    2024-01-25归属地:新疆
  • book尾汁
    确实都是这些理论,没必要讲操作系统 网络原理这些知识,本来这门课的定位就是实战课,大家也都是想跟着练手一个项目,真去学这些基础理论知识,肯定深入学习一点,这样花这么多篇幅介绍,实在没有必要
    2024-01-10归属地:北京
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部