HTTP 协议极其庞杂,它影响着浏览器、爬虫、代理服务器、防火墙、CDN、Web 容器、微服务等诸多方面,自身的规范却并不统一,所要面对的各类软件的新旧版本也同时存在于网络上。在这种情况下,如果对 HTTP 没有一个深入的理解,就很容易被各种各样的网络问题难倒。

那么,如何才能快速掌握HTTP协议呢?

在我看来,需要从以下四个方面入手:

  1. 工欲善其事,必先利其器,首先我们先要掌握好抓包及相关的工具,这样在分析各种网络协议时也就更加得心应手。
  2. 先从架构入手,搞清楚 HTTP 协议到底想解决什么问题,面临哪些非功能性的约束,又是怎样一步步发展变迁至今的。
  3. 熟悉协议格式,对隧道或者正向代理下的 URI 格式、对多表述包体和不定长包体的传输格式要了解,对 DNS 的 QUESTION/ANSWER 也要了解。
  4. 掌握应用场景,跨域访问与同源策略到底在纠结什么?代理服务器上的共享缓存如何精细化控制?

先给大家分享我整理的 HTTP 学习知识图谱,你可以收藏起来,时不时地拿出来对照:

下面,我们来一一详述这四个方面。

1、用好工具

学好HTTP协议,至少要用到下面4个工具:

1.1 Chrome Network抓包面板

这个工具有4个优点:

  • 快速分析HTTP请求
  • 便捷卸载TLS/SSL内容
  • 可协助分析页面加载性能
  • 方便分析websocket内容

该工具包含5个面板,在过滤器的Filter输入栏中还支持复杂的属性过滤,在请求列表中可以看到请求的上下游,亦能看到每个请求的时间分布。

1.2 telnet

这个小工具主要用于构造原始的应用层协议,帮助我们理解HTTP实际在网络中传输的格式是什么样的。

1.3 curl

telnet有2个问题:

1、太过繁琐,每次要输入完整的请求。实际我们可能只是想改一下方法或者某个HEADER头部。

2、不支持HTTPS,不支持包体压缩,导致无法向某些站点发起请求。

而curl完美解决了这些问题。它也用于构造定制化的HTTP请求,并可以分析HTTP响应头部或者包体。

1.4 Wireshark

这是学习完整Web协议栈的必备工具,我们可以在服务器端用tcpdump抓包后,在可视化的Wireshark上便捷分析。

Wireshark功能极为强大:

  • 既支持BPF捕获过滤器,也支持分析时的显示过滤器;
  • 通过流跟踪或者会话图标,我们可以轻松的以session会话为单位进行分析;
  • 通过可配置的着色规则,但以不同的色彩帮助我们轻松找出有问题的报文;
  • 通过报文的标注及导出,以及文件的合并、时间的平移,可以轻松将多台机器上的抓到的报文放在一起分析对比;
  • 既可以通过Packet Detail中看到每层报文解析出的可读值,也能在Packet Byte中看到二进制流。
  • 支持报文统计,对大量HTTP报文的分析非常方便!

2、理解架构

要理解HTTP的架构,需要从以下4个方面入手:

2.1 HTTP协议想解决什么问题?

HTTP协议设计之初用于解决人与机器间的通讯,所谓“B/S架构”中的浏览器是我们必须考虑进的因素。

因此,HTTP协议需要传输超媒体数据(包括图片、视频等大粒度数据)。

当然,现在许多物联网中的设备也在使用HTTP协议,所以,它也在解决机器与机器间的通讯。

当然,网络爬虫也是HTTP协议要面对的问题,robots.txt这样的规范也应运而生。

2.2 HTTP协议面对哪些非功能性约束?

主要包括以下5个方面:

  • 高可扩展性,因为它需要面对全世界用户群体以及数十年以上的寿命
  • 低门槛,既有使用门槛也包括开发门槛,JavaApplet的式微与Javascript的如日中天就是极好的例证
  • 分布式环境下的大粒度数据传输
  • internet下无法控制的负载以及种类版本繁多的组件
  • 向前兼容,HTTP/1.1中的许多特性都需要照顾到还有仅支持HTTP/1.0的代理服务器在互联网上运行

2.3 遵循的架构设计方案是怎样的?

HTTP/1.1是完全遵循REST架构设计,而REST架构主要包含以下4个子架构:

  • LCS:空间上分层的客户端服务器,因此我们才有了隧道、代理、网关、CDN、负载均衡等产品;
  • CSS:无状态的客户端服务器,因此我们才有了Request/Response请求模式,才要求cookie头部或者URL不能超过4K等。
  • COD:按需代码,即将代码从服务器移至客户端再运行,今天的前端生态都是基于此架构下而生的Javascript衍伸的。
  • $:缓存,HTTP组件中无处没有缓存,共享缓存、私有缓存,没指明缓存时限还要预估一个缓存过期值。

2.4 HTTP协议特性有哪些?

首先,我们需要理解它在OSI概念模型的哪一层,它又是处在TCP/IP体系的什么位置。

其次,我们可以从上述架构中推导出它的定义:一种无状态的、应用层的、以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动!

3、熟悉协议格式

学习HTTP协议格式时,应从以下3个方面入手:

3.1 扩充巴科斯-瑙尔范式:ABNF元语言

元语言可用于描述协议格式,而ABNF就严谨定义了HTTP的格式。

ABNF并不复杂,只需要我们花10分钟即可学会,它包括操作符和核心规则2大部分,这里不再列出。

3.2 HTTP协议格式

掌握HTTP协议格式需要理清一个树状知识图,参见本文末尾我整理的HTTP知识图谱。

3.3 DNS协议格式

我们需要掌握3个方面的知识:

  • DNS报文是基于UDP的,它的通用格式是固定的,需要理解各字段含义
  • Questions部分需要重点看QNAME域名是如何编码的,以及QTYPE的含义
  • Answers部分字段更多,特别是对NAME及RDATA部分的偏移表示法要有所了解

4、掌握应用场景

HTTP的应用场景极其广泛,下面我列出常见的9个场景,在协议格式中提到的各方法、响应码、头部、包体编码方式都与具体场景相关。

4.1 内容如何协商

响应式协商由于RFC规范不明少有使用,而主动式协商关于语言、编码、媒体类型等是我们日常打交道的常见方式。

4.2 FORM表单如何提交

表单提交虽然有3种编码方式,但最常用的还是boundary分隔的多表述共存于单一包体的方式,waf防火墙必须考虑如何应用这种包体内的SQL注入攻击。

4.3 Range请求的使用

传输大文件所用到的断点续传和多线程下载,都需要使用Range规范,为防止多请求下载过程中服务器端更新的情况,还引入条件请求If-Range。

4.4 Cookie与Session的设计

Set-Cookie中有许多属性,既有限制有效期的expires-av、max-age-av,也有限制使用范围的domain-av、path-av,还有限制协议的secure-av或是限制使用对象的httponly-av。

这种种限制都在针对浏览器使用cookie是否安全,而同时为了便利性浏览器也支持第三方cookie,这更是为厂商搜集用户信息提供了方便。

4.5 浏览器同源策略与跨域请求

同源策略是浏览器所做的限制,如果我们直接基于网络库处理响应是不受此限制的。所以,这个同源策略的有效性非常依赖浏览器的实现。当然,同源策略中不包含防范CSRF攻击,服务器通常基于token策略解决CSRF攻击。

安全与便利是必须权衡取舍的,为了增加便利性,必须允许AJAX的跨域请求,于是CORS便诞生了。

4.6 条件请求

条件请求不只可应对多线程下载时的资源中途变量,也可针对多人协作的wiki系统生效,同时也能用于缓存更新。实际在Restful API设计中它大有发挥余地。

4.7 共享缓存与私有缓存

当下的互联网上缓存无处不在,即使服务器上没有配置某些资源可以缓存,浏览器也在想尽办法预估出一段时间缓存资源。因为,缓存能够极大的提升用户体验、降低网络负载!能够控制缓存的HTTP头部非常多,它不只控制缓存的有效期,也在控制缓存依据的关键字。

4.8 重定向的应用

关于重定向我们需要从2个维度4个象限去理解:可更改方法 | 不可更改方法、可缓存|不可缓存

这便引出了301、302、303、307、308这5种不同的响应状态码。

4.9 网络爬虫

爬虫无处不在,远不只久远的搜索引擎爬虫,当下在出行(例如12306火车票或者亚航)、电商、社交(新浪微博)等都广受爬虫骚扰,爬虫不只爬取信息,还模拟人类制造行为,例如许多抢票机、僵尸粉都如此。而另一方面,为了欢迎google/baidu的爬虫,又诞生了各种SEO策略及教程,还有许多利用PageRank漏洞提升关键词排名的商家在以此盈利。所以,理解爬虫的工作方式也是非常重要的。

当然,HTTP应用场景远不止这些,但彻底掌握这些场景将使我们完全理解HTTP协议中常见的方法、头部、响应码等等。

HTTP 协议是 Web 协议里非常重的一块,作为程序员,无论你是前后端工程师,还是运维测试,如果想面试更高的职位,或者要站在更高的角度去理解技术业务架构,并能在问题出现时快速、高效地解决问题,Web 协议一定是你绕不过去的一道坎。熟练掌握各种常用 Web 协议,可以帮你在工作中轻松应对各种网络难题。

基于此,我和极客时间合作推出了《Web 协议详解与抓包实战》视频课,完全从实战出发,在关键场景中结合抓包工具进行实战分析,为你深入浅出地讲解常见 Web 协议涉及到的核心知识,并彻底掌握这些协议。

如何快速掌握HTTP协议?相关推荐

  1. python爬虫入门教程--快速理解HTTP协议(一)

    http协议是互联网里面最重要,最基础的协议之一,我们的爬虫需要经常和http协议打交道.下面这篇文章主要给大家介绍了关于python爬虫入门之快速理解HTTP协议的相关资料,文中介绍的非常详细,需要 ...

  2. 网络编程懒人入门(三):快速理解TCP协议一篇就够

    1.前言 本系列文章的前两篇<网络编程懒人入门(一):快速理解网络通信协议(上篇)>.<网络编程懒人入门(二):快速理解网络通信协议(下篇)>快速介绍了网络基本通信协议及理论基 ...

  3. 计算机网络资料篇(二)——快速理解网络协议

    <网络编程懒人入门(一):快速理解网络通信协议(上篇)> <网络编程懒人入门(二):快速理解网络通信协议(下篇)> 一:五层模型 物理层.数据链路层.网络层.传输层.应用层 1 ...

  4. 如何快速理解TCP协议

    目录 什么是TCP TCP的报文格式 TCP的如何保证可靠性 确认应答(ACK)机制 超时重传机制 连接管理机制(三次握手和四次挥手) 三次握手 四次挥手 流量控制 拥塞控制 TCP如何提高性能 滑动 ...

  5. 原子级操作快速自制modbus协议

    原子级操作手把手搞懂modbus协议 文章目录 @[toc] 1 modbus协议基础概念 1.1 使用场所 1.2 主从协议站 1.3 modbus帧描述 1.4 数据模式 1.5 modbus状态 ...

  6. 使用httpie快速访问https协议站点

    博文背景 在使用httpie时有命令行工具http使用,并且在协议缺省时使用的是http协议,但是它却没有https命令,那么如何使其具有https命令呢? 具体操作 $ alias https='h ...

  7. 曼普拉斯MPMGS200-F01磁传感器快速配置RS485modbus协议

    参数 配置 这里用485-MUDBUS协议通信 如图: 举例初始化指令:功能码10 设备地址 功能码 起始地址(高位) 起始地址(低位) 寄存器个数(高位) 寄存器个数(低位) 字节数 配置设备地址 ...

  8. 快速理解raft协议(附件动画演示)

    正文   raft是工程上使用较为广泛的强一致性.去中心化.高可用的分布式协议.在这里强调了是在工程上,因为在学术理论界,最耀眼的还是大名鼎鼎的Paxos.但Paxos是:少数真正理解的人觉得简单,尚 ...

  9. 互联网协议 — QUIC 快速 UDP 互联网连接

    目录 文章目录 目录 QUIC QUIC 的特性 基于 UDP 可靠性 数据流 有序交付 快速握手 安全性 连接迁移 解决队头阻塞 HTTP/3 支撑 QUIC 的工作原理 连接 数据流 用户态实现 ...

最新文章

  1. Android驱动开发读书笔记六
  2. linux mysql卸载_Linux环境搭建
  3. 不懂算法,还想进大厂?做梦吧
  4. L2-002 链表去重 (25 分) 船新方法
  5. MySQL 之 information_schema
  6. 1.6 编程基础之一维数组 11 大整数减法
  7. TensorFlow框架案例实战
  8. 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新。
  9. Linux内核的编译方法及如何往内核中增加程序
  10. Vue学习--MVVM模型
  11. 2021-08-3116. 最接近的三数之和 排序+双指针
  12. 曲奇云盘资源搜索引擎_曲奇云盘资源共享群组
  13. Bzoj 4173 数学
  14. 基于矩阵分解的PCA 白化ZCA白化
  15. mysql strtolower_自己写的mysql类_PHP教程 - strtolower
  16. 【苹果群发】苹果推iMessage接口筛选应用程序利用密钥箱生成CSR文书
  17. 《AR与VR开发实战》导读
  18. 使用ch.ethz.ssh2中sess.execCommand方法导致线程卡死的原因分析
  19. 【Web项目】点餐系统
  20. 99、插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法...

热门文章

  1. 阿里巴巴构架重大调整:六个子公司变七大事业群
  2. Layui父页面和子页面直接互相传值
  3. 智能锁忘记密码怎么办
  4. js的三大家族(offset/scroll/client)和一个事件对象(event)///正则
  5. rstudio 导出结果_R语言数据导入与导出
  6. 案例分享 | TensorFlow 在贝壳找房中的实践
  7. 树莓派4正式发布!TYPE-C,USB3.0,支持4K双屏,售价35美金起
  8. 松果在线报名系统网站源码
  9. 基本面分析:原理、类型和使用方法
  10. JAVA基础知识(用已知,释新知道)