gitbook/透视HTTP协议/docs/97822.md
2022-09-03 22:05:03 +08:00

8.4 KiB
Raw Blame History

开篇词To Be a HTTP Hero

你好我是罗剑锋Chrono一名埋头于前线辛勤“耕耘”了十余载的资深“码农”。

工作的这十多年来我开发过智能IC卡也倒腾过商用密码机做过政务项目也做过商务搜索写过网游核心引擎也写过CDN存储系统在Windows上用C/C++做客户端在AIX、Linux上用Java、PHP写后台服务……现在则是专注于“魔改”Nginx深度定制实现网络协议的分析与检测。

当极客时间的编辑联系我要我写HTTP专栏的时候我的第一反应是“HTTP协议好简单的有这个必要吗

你可能也会有同样的想法“HTTP不就是请求/响应、GET/POST、Header/Body吗网络上的资料一抓一大把有什么问题搜一下就是了。”

不瞒你说我当时就是这么想的在之前的工作中也是一直这么做的而且一直“感觉良好”觉得HTTP就是这个样子没有什么特别的地方没有什么值得讲的。

但在编辑的一再坚持下,我“勉为其难”接下了这个任务。然后做了一个小范围的“调查”,问一些周围的同事,各个领域的都有,比如产品、开发、运维、测试、前端、后端、手机端……想看看他们有什么意见。

出乎我的意料他们无一例外都对这个“HTTP专栏”有很强烈的需求想好好“补补课”系统地学习了解HTTP这其中甚至还包括有七、八年甚至更多工作经验的老手。

这不禁让我陷入了思考,为什么如此“简单”的协议却还有这么多的人想要学呢?

我想一个原因可能是HTTP协议“太常见”了。就像现实中的水和空气一样,如此重要却又如此普遍,普遍到我们几乎忽视了它的存在。真的很像那句俗语所说:“鱼总是最后看见水的”,但水对鱼的生存却又是至关重要。

我认真回忆了一下这些年的工作经历这才发现HTTP只是表面上显得简单而底层的运行机制、工作原理绝不简单可以说是非常地复杂。只是我们平常总是“KPI优先”网上抓到一个解决方法用过就完事了没有去深究里面的要点和细节。

下面的几个场景,都是我周围同事的实际感受,你是否也在工作中遇到过这样的困惑呢?你能把它们都解释清楚吗?

  • 用Nginx搭建Web服务器照着网上的文章配好了但里面那么多的指令什么keepalive、rewrite、proxy_pass都是怎么回事为什么要这么配置
  • 用Python写爬虫URI、URL“傻傻分不清”有时里面还会加一些奇怪的字符怎么处理才好
  • 都说HTTP缓存很有用可以大幅度提升系统性能可它是怎么做到的又应该用在何时何地
  • HTTP和HTTPS是什么关系还经常听说有SSL/TLS/SNI/OCSP/ALPN……这么多稀奇古怪的缩写头都大了实在是搞不懂。

其实这些问题也并不是什么新问题把关键字粘贴进搜索栏再点一下按钮搜索引擎马上就能找出几十万个相关的页面。但看完第一页的前几个链接后通常还是有种“懵懵懂懂”“似懂非懂”的感觉觉得说的对又不全对和自己的思路总是不够“Match”。

不过大多数情况下你可能都没有时间细想优先目标是把手头的工作“对付过去”。长此以来你对HTTP的认识也可能仅限于这样的“知其然而不知其所以然”实际情况就是HTTP天天用时时用但想认真、系统地学习一下梳理出自己的知识体系经常会发现无从下手。

我把这种HTTP学习的现状归纳为三点正式资料“少”、网上资料“杂”、权威资料“难”

第一个,正式资料“少”

上购书网站搜个Python、Java搜个MySQL、Node.js能出一大堆。但搜HTTP实在是少得可怜那么几本一只手的手指头就可以数得过来和语言类、数据库类、框架类图书真是形成了鲜明的对比。

现有的HTTP相关图书我都看过怎么说呢它们都有一个特点“广撒网捕小鱼”都是知识点可未免太“照本宣科”了理论有余实践不足看完了还是不知道怎么去用。

而且这些书的“岁数”都很大依据的都是20年前的RFC2616很多内容都不合时宜而新标准7230已经更新了很多关键的细节。

第二个,网上资料“杂”

正式的图书少而且过时那就求助于网络社区吧。现在的博客、论坛、搜索引擎非常发达网上有很多HTTP协议相关的文章也都是网友的实践经验分享“干货”很多很能解决实际问题。

但网上文章的特点是细小、零碎通常只“钉”在一个很小的知识点上而且由于帖子长度的限制无法深入展开论述很多都是“浅尝辄止”通常都止步在“How”层次很少能说到“Why”能说透的更是寥寥无几。

网文还有一个难以避免的“毛病”,就是“良莠不齐”。同一个主题可能会有好几种不同的说法,有的还会互相矛盾、以讹传讹。这种情况是最麻烦的,你必须花大力气去鉴别真假,不小心就会被“带到沟里”。

可想而知这种“东一榔头西一棒子”的学习方式用“碎片”拼凑出来的HTTP知识体系是非常不完善的会有各种漏洞遇到问题时基本派不上用场还得再去找其他的“碎片”。

第三个,权威资料“难”

图书少网文杂我们还有一个终极的学习资料那就是RFC文档。

RFC是互联网工程组IETF发布的官方文件是对HTTP最权威的定义和解释。但它也是最难懂的全英文看着费劲理解起来更是难上加难文档之间还会互相关联引用“劝退率”极高。

这三个问题就像是“三座大山”阻碍了像你这样的很多有心人去学习、了解HTTP协议。

那么怎么才能更好地学习HTTP呢

我为这个专栏定了一个基调“要有广度但更要有深度”。目标是成为含金量最高的HTTP学习资料新手可以由浅入深、系统学习老手可以温故知新、查缺补漏让你花最少的时间用最少的精力掌握最多、最全面、最系统的知识。

由于HTTP应用得非常广泛几乎涉及到所有的领域所以我会在广度上从HTTP尽量向外扩展不只讲协议本身与它相关的TCP/IP、DNS、SSL/TLS、Web Server等都会讲到而且会把它们打通串联在一起形成知识链让你知道它们之间是怎么联系、怎么运行的。

专栏文章的深度上我也是下足了功夫全部基于最新的RFC标准文档再结合我自己多年的实践体会力求讲清讲透能让你看了以后有豁然开朗的感觉。

比如分析HTTPS我会用Wireshark从建立TCP连接时就开始抓包从二进制最底层来分析里面的Record、Cipher Suite、Extension讲ECDHE、AES、SHA384再画出详细的流程图做到“一览无余”。

陆游有诗:“纸上得来终觉浅,绝知此事要躬行”。学习网络协议最重要的就是实践在专栏里我还会教你用Nginx搭建一个“麻雀虽小五脏俱全”的实验环境让你与HTTP零距离接触。

它有一个最大的优点自身就是一个完整的网络环境即使不联网也能够在里面收发HTTP消息。

我还精心设计了配套的测试用例最小化应用场景排除干扰因素你可以在里面任意测试HTTP的各种特性再配合Wireshark抓包就能够理论结合实践更好地掌握HTTP的知识。

每一讲的末尾,我也会留几个思考题,你可以把它当作是求职时的面试官问题,尽量认真思考后再回答,这样能够把专栏的学习由“被动地听”,转变为“主动地学”,实现“学以致用”。

当然了,你和我的“兴趣点”不可能完全一样,我在讲课时也难免“顾此失彼”“挂一漏万”,希望你积极留言,我会视情况做些调整,或者用答疑的形式补充没讲到的内容。

今年是万维网和HTTP诞生30周年也是HTTP/1.1诞生20周年套用莎翁《哈姆雷特》里的名句让我们在接下来的三个月里一起努力。

“To Be a HTTP Hero