HTTP协议知识体系(持续补充)

HTTP 应用如此广泛,我们确实必要好好学习下它,不仅有助于我们理解和解释工作中的强制刷新,防盗链等现象和原理,还让我们在设计开源中间件时会有所启发,比如在设计 MQ, Dubbo 这些组件时,第一要务就是要设计协议,在其中你或多或少能看到 HTTP 协议的影子,学习了 HTTP 能让你在设计中间件等组件协议时,提供很好的思路

先从网上荡一张漂亮的图

 

 

 

根据大家实践中遇到的问题,大致分为如下:

  1. 什么是 HTTP,它有什么特点,为什么说 HTTP 是万能的
  2. 为什么说反爬是个伪命题
  3. 简要介绍一下 HTTP 0.9, 1.1, 2.0, 3.0 的特点
  4. 曾经在我司有一位同事在大群里抛了一个问题:在浏览器的地址栏输入图片 url,想预览一下图片,结果却变成了下载图片,你能替他解释一下其中的原因吗
  5. DNS 协议了解多少,什么是 DNS 负载均衡
  6. HTTP 1.1 唯一一个要求请求头必传的字段是哪个,它有什么作用
  7. no-cache 真的是不缓存的意思?你对 HTTP 的缓存了解多少
  8. 为什么刷新了浏览器器却抓不到请求,而强制刷新却可以抓到,强制刷新到底做了什么事
  9. 301 和 302 的区别是啥
  10. 各种协议与 HTTP 的关系
  11. 老生常谈很多人的误解:GET 和 POST 的区别是啥

总体架构

  1. HTTP的概念及基础知识
  2. HTTP 的相关协议
  3. HTTP 内容协商
  4. HTTP 缓存
  5. HTTP 连接与HTTP 2的改进

一、HTTP的概念及基础知识

HTTP 全称 HyperText Transfer Protocol「超文本传输协议」,拆成三个部分来看,即「超文本」,「传输」,「协议」

 

超文本:即「超越了普通文本的文本」,即音视频,图片,文件的混合体,大家常见的网页很多就内嵌了 img, video 这些标签解析展现而成的图片,视频等,除了这些超文本内容外,最关键的是超文本中含有超链接,超链接意味着网页等文件内容的超文本上可以点击链接到其他页面上,互联网就是通过这样的超链接构成的。

 

传输: 传输意味着至少有两个参与者,比如 A,B,这意味着 HTTP 协议是个双向协议,一般是将「超文本」按照约定的协议以二进制数据包的形式从 A 传到 B 或 B 传到 A, A <===> B,我们把发起请求的叫请求方,接到请求后返回数据的那一方称为应答方,但需要注意的是传输也不限于两个参与者,允许中间有中转或者接力只要参与者间遵循约定的协议即可传输。

协议:HTTP 是一个协议,啥是协议?在日常生活中协议并不少见,比如我们租房时签订的租房协议,入职后和企业签订的劳动合同协议,「协」意味着至少有两人参与,「议」意味着双方要就某项条款达成一致,比如租房协议规定月付 xx 元,劳动合同协议规定月工资 xx 元,协议即对通信双方的约束,双方按照约定传输数据才能进行明白对方的意思,否则便是鸡同鸭讲。

经过以上解释,我们可以给 HTTP 下一个比较准确的定义了:

HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范。

二、HTTP 的相关协议

 HTTP 虽然在当今互联网通信中占据统计地位,但要让它生效还必须依赖其他协议或规范的支持

1. URI 和 URL

首先既然我们要在两点之间传输超文本,那这个超文本该怎么表示?超文本即资源,互联网上资源这么多,如何唯一标记互联网上的资源。

使用 URI(Uniform Resource Identifier) 即统一资源标识符就可以唯一定位互联网上的资源。URI 大家比较少听过,大家更熟悉的可能是 URL(Uniform Resource Locator),即统一资源定位符,URL 其实是 URI 的一种子集,区别就是URI 定义资源,而 URL 不单定义这个资源,还定义了如何找到这个资源。

URL 主要由四个部分组成:协议、主机、端口、路径

 

 

协议:即通信双方指定的传输协议,应用最广的当然是本文要介绍的 http 协议,除此之外还有 ftp, mailto,file 等协议。

主机名:存放资源的服务器主机名或 IP 地址,当前有时候服务器由于安全原因还需要对用户进行认证,需要提供用户名和密码,此时需要在 hostname前加 username:password。

端口:整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口,如 HTTP 默认用的 80 端口,HTTPS 用的 443 端口,传输层协议正是利用这些端口号识别本机中正在进行通信的应用程序,并准确地将数据传输。

路径:即资源在主机上的存放路径,一般表示主机的目录或文件地址

parameter:用于指定特殊参数的可选项。

query:查询字符串,可选,用于给动态网页或接口传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

fragment:浏览器专用,用于指定网络资源中的片断,指定后打开网页可直接定位到 fragment 对应的位置。

例子如下

 

2. TCP/IP 协议

 在上述 URL 地址中,如果你指定了「www.example.com 」 这样的主机名,最终会被 DNS 解析成 IP 地址然后才开始通信,为啥主机名最终要被解析成 IP 地址才能通信呢,因为 HTTP 协议使用的是 TCP/IP 协议栈,协议栈就是这样规定的,一起来看看 TCP/IP 协议栈各层的功能。

 

TCP/IP 协议栈总共有四层

  1. link layer: 链接层,负责在以太网,WIFI 这样的底层网络上发送原始数据包,工作在网卡这一层,使用 MAC 地址来标记网络上的设备,所以也叫 MAC 层
  2. Internet layer: 网络层,IP 协议即处于这一层,提供路由和寻址的功能,使两终端系统能够互连且决定最佳路径,並具有一定的拥塞控制和流量控制的能力。相当于传送邮件时需要地址一般重要
  3. transport layer: 传输层,该层的协议为应用进程提供端到端的通信服务,这层主要有 TCP,UDP 两个协议,TCP 提供面向连接的数据流支持、可靠性、流量控制、多路复用等服务,UDP不提供复杂的控制机制,利用 IP 提供面向无连接的简单消息传输
  4. application layer: 即应用层,前面三层已经为网络通信打下了坚实的基础,这层可发挥的空间就大很多了,应用层协议可以想象为不同的服务,每个应用层协议都是为了解决某一类应用问题而生的,每一个服务需要用不同的协议,规定应用进程在通信时所遵循的协议。

我们可以把前面三层认为是高速公路及其配套的基础设施,至于要传什么货物,高速公路是否要关闭等则由应用层决定。

利用 TCP/IP 协议族进行网络通信时,会通过分层顺序与对方进行通信。每个分层中,都会对所发送的数据附加一个首部,在这个首部中包含了该层必要的信息,如发送的目标地址以及协议相关信息。

 

 

 接收方收到数据后,同样的,每一层也会解析其首部字段,直到应用层收到相应的数据。

 

 

通过这样分层的方式,每个层各司其职,只要管好自己的工作即可,可扩展性很好,比如对于 HTTP 来说,它底层可以用 TCP,也可以用 UDP 来传输,哪天如果再出现了更牛逼的协议,也可以替换之,不影响上下层,这就是计算机中比较有名的分层理论:没有什么是分层解决不了的,如果有那就再分一层。

IP 包的首部中定义了32 位的源 IP 地址和目的 IP 地址,如下图所示址

 

 所以应用层在请求传输数据时必须事先要知道对方的 IP 地址,然后才能开始传输。

 

 

附录

51 张图助你彻底掌握 HTTP 协议

posted @ 2020-04-09 12:38  杨兮臣  阅读(160)  评论(0编辑  收藏  举报