轻松搞懂 HTTP 原理

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志——苏轼

HTTP 概述

HTTP 是什么

HTTP 全称 HyperText Transfer Protocol 译为超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是互联网应用最广泛的一种网络协议,是万维网的数据通信的基础。

HTTP 协议是在 Web 上进行数据交换的基础,是一种 “客户端-服务器端” 协议。也就是说,请求通常是由像浏览器这样的接受方发起的。一个完整的 Web 文档通常是由不同的子文档拼接而成的,像是文本、布局描述、图片、视频、脚本等等。

设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。

HTTP 协议的历史与标准

  • HTTP/0.9: 1991年制定,有严重设计缺陷,只支持GET方法,不支持MIME类型,很快被 HTTP/1.0 取代。
  • HTTP/1.0: 1996年制定,支持多种请求方法,支持多媒体对象,得到广泛应用。
  • HTTP/1.0+: 支持持久连接、虚拟主机、代理连接等新特性,成为非官方的事实标准。
  • HTTP/1.1: 1999年制定,校正 HTTP中 的设计缺陷,性能优化,删除一些不好的特性。
  • HTTP-NG(或HTTP/2.0): 关注 HTTP 协议的性能优化以及更强大的服务逻辑远程执行框架,研究工作仍在进行中。

HTTP 请求与响应消息

客户端和服务器端通过交换各自的消息(与数据流正好相反)进行交互。

  • 由像浏览器这样的客户端发出的消息叫做请求(requests)
  • 被服务器端回应的消息叫做响应(responses)

HTTP 的基本原理

HTTP 被设计于上20世纪90年代初期,是一种可扩展的协议。它是应用层的协议,通过TCP,或者是 TLS- 加密的 TCP 连接来发送,理论上任何可靠的传输协议都可以使用。因为其良好的扩展性,时至今日,它不仅被用来传输超文本文档,还用来传输图片、视频或者向服务器发送如 HTML 表单这样的信息。HTTP 还可以根据网页需求,仅获取部分 Web 文档内容更新网页。

基于 HTTP 的组件系统

概述

请求通过一个实体被发出,实体也就是用户代理。大多数情况下,这个用户代理都是指浏览器。

每一个发送到服务器的请求,都会被服务器处理并返回一个消息,也就是响应。

在这个请求与回应之间,还有许许多多的被称为 Proxies 的实体,他们的作用与表现各不相同。

客户端

user-agent 就是任何能够给为用户发起行为的工具。这个角色通常都是由浏览器来扮演。一些例外情况,比如是工程师使用的程序,以及 Web 开发人员调试应用程序。

浏览器总是作为发起一个请求的实体(近几年已经出现一些机制能够模拟有服务器发起的请求信息,例如 Node.js )。

浏览器首先发送一个请求来获取页面的 HTML 文档,再解析文档中的资源信息发送其他请求,获取可执行脚本或 CSS 样式来进行页面布局渲染,以及一些其它页面资源(如图片和视频等)。然后,浏览器将这些资源整合到一起,展现出一个完整的文档,也就是网页。

Web 服务器

在 HTTP 协议通信过程的另一端 ,是由 Web 服务器来服务井提供客户端所请求的文档。服务器只是虚拟意义上代表一个机器:它可以是共享负载(负载均衡)的一组服务器组成的计算机集群,也可以是一种复杂的软件,通过向其他计算机(如缓存,数据库服务器,电子商务服务器等)发起请求来获取部分或全部资源。

Web 服务不一定是一台机器,但一个机器上可以装载的众多 Web 服务。

代理(Proxies)

在浏览器和服务器之间,有许多计算机和其他设备转发了 HTTP 消息。由于 Web 栈层次结构的原因,他们大多都是出现在传输层、网络层和物理层上,对于 HTTP 应用层而言就是透明的,虽然它们可能会对应用层性能有重要影响。还有一部分是表现在应用层上的,被称为代理(Proxies)。代理(Proxies)既可以表现的透明,又可以不透明(“改变请求”会通过他们)。代理主要有如下几种作用:

  • 缓存(可以是公开的也可以是私有的,像浏览器的缓存)
  • 过滤(像反病毒扫描,家长控制)
  • 负载均衡(让多个服务器服务不同的请求)
  • 认证(对不同资源进行权限管理)
  • 日志记录(允许存储历史信息)

HTTP 的基本特性

  • HTTP 是简单的
  • 虽然下一代 HTTP/2 协议将 HTTP 消息封装到了帧中,HTTP 大体上还是被设计得简单易读。
    HTTP 报文能够被人读懂,还允许简单测试,降低了门槛。
  • HTTP 是可扩展的
    在HTTP/1.0中出现的HT TP headers让协议扩展变得非常容易。
  • HTTP 是无状态,有会话的
    在同一个连接中,两个执行成功的请求之间是没有关系的。这就带来了一个问题,用户没有办法在同一个网站中进行连续的交互。
  • HTTP 和连接
    一个连接是由传输层来控制的,这从根本上不属于 HTTP 的范围。

HTTP 能控制什么

以下是可以被 HTTP 控制的常见特性:

  • 缓存

  • 开放同源限制

  • 认证

    基本的认证功能可以直接通过 HTTP 提供,或用 HTTP Cookies 来设置指定的会话。

  • 代理和隧道

    通常情况下,服务器和/或客户端是处于内网的,对外网隐藏真实的 IP 地址。因此 HTTP 请求就要通过代理越过这个网络屏障。

  • 会话

HTTP 流

  1. 打开一个 TCP 连接:TCP 连接被用来发送一条或多条请求,以及接受回应消息。

  2. 发送一个 HTTP 报文:HTTP 报文 (在 HTTP/2 之前)是语义可读。

    GET /HTTP/1.1
    Host: developer.mozilla.org
    Accept-Language:fr
    
  3. 读取服务端返回的报文信息:

    HTTP/1.1 200 OK
    Last-Modifiled: Tue, 01 Dec 2020 20:20:20 GMT
    Content-Length: 29769
    Content-Type:text/html
    
  4. 关闭连接或者为后续请求重用连接。

HTTP 消息

HTTP 消息是什么

HTTP 消息,又称为 HTTP 报文,是服务器和客户端之间交换数据的方式。

有两种类型的消息: 请求,由客户端发送用来触发一个服务器上的动作;响应,来洎服务器的应答。
HTTP 消息由采用 ASCII 编码的多行文本构成。在 HTTP/1.1 及早期版本中,这些消息通过连接公开地发送。在 HTTP/2 中,为了优化和性能方面的改进,曾经可人工阅读的消息被分到多个 HTTP 帧中。

HTTP/1.x 消息的缺点

HTTP/1.x 的消息在性能上有一些确定

  • 消息头不像消息主体一样会被压缩。
  • 两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。
  • 无法复用。当在同一个服务器打开几个连接时,TCP 热连接比冷连接更加有效。

HTTP 消息结构

HTTP 请求消息和响应消息具有相似的结果,由以下部分组成:

  1. start line: 一行起始行用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
  2. HTTP headers: 一个可选的 HTTP 头集合指明请求或描述消息正文。
  3. empty line: 一个空行指示所有关于请求的元数据已经发送完毕。
  4. body: 一个可选的包含请求相关数据的正文 (比如 HTML 表单内容), 或者响应相关的文档。正文的大小起始行的 HTTP 头来指定。

起始行和 HTTP 消息中的 HTTP 头统称为 “请求头”,而其有效负载被称为 “消息正文”。

请求消息与响应消息

  • HTTP 请求消息:由客户端发送用来触发一个服务器上的动作
  • HTTP 响应消息:来自服务器的回答

HTTP 请求格式如下图所示

image-20201219180046962
我们看一下百度的一个请求消息

image-20201219181620510

HTTP 请求响应如下图所示

img

看一下上面那个请求头的响应消息

image-20201219182558722

HTTP 请求方法和状态码

我们了解了 HTTP 的请求消息和响应消息以后,在我们真正学习请求消息和响应消息之前,我们来学习一下请求方法和状态码。

HTTP 请求方法

HTTP 定义了一组请求方法, 以表明要对给定资源执行的操作。指示针对给定资源要执行的期望动作. 虽然他们也可以是名词, 但这些请求方法有时被称为HTTP动词. 每一个请求方法都实现了不同的语义, 但一些共同的特征由一组共享。

HTTP/1.1 协议中共定义了八种方法来以不同方式操作指定的资源:

请求方法描述
GET向指定的资源发出“显示”请求。使用GET方法应该只用在读取数据,而不应当被用于产生“副作用”的操作中,例如在 Web Application 中。其中一个原因是GET可能会被网络蜘蛛等随意访问。
POST向指定资源提交数据,请求服务器进行处理(例如提交表单或者上传文件)。数据被包含在请求本文中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
PUT向指定资源位置上传其最新内容。
HEAD与 GET 方法一样,都是向服务器发出指定资源的请求。只不过服务器将不传回资源的本文部分。它的好处在于,使用这个方法可以在不必传输全部内容的情况下,就可以获取其中“关于该资源的信息”(元信息或称元数据)。
DELETE请求服务器删除 Request-URI 所标识的资源。
TRACE回显服务器收到的请求,主要用于测试或诊断。
OPTIONS这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用’*'来代替资源名称,向Web服务器发送OPTIONS请求,可以测试服务器功能是否正常运作。
CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的链接(经由非加密的HTTP代理服务器)。

HTTP 状态码

状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类

分类分类描述
1**信息,服务器收到请求,需要请求者继续执行操作
2**成功,操作被成功接收并处理
3**重定向,需要进一步的操作以完成请求
4**客户端错误,请求包含语法错误或无法完成请求
5**服务器错误,服务器在处理请求的过程中发生了错误
HTTP状态码列表
状态码中文描述
100继续。客户端应继续其请求
101切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议
200请求成功。一般用于GET与POST请求
201已创建。成功请求并创建了新的资源
202已接受。已经接受请求,但未处理完成
203非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
204无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
205重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
206部分内容。服务器成功处理了部分GET请求
300多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择
301永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
303查看其它地址。与301类似。使用GET和POST请求查看
304未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源
305使用代理。所请求的资源必须通过代理访问
306已经被废弃的HTTP状态码
307临时重定向。与302类似。使用GET请求重定向
400客户端请求的语法错误,服务器无法理解
401请求要求用户的身份认证
402保留,将来使用
403服务器理解请求客户端的请求,但是拒绝执行此请求
404服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面
405客户端请求中的方法被禁止
406服务器无法根据客户端请求的内容特性完成请求
407请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权
408服务器等待客户端发送的请求时间过长,超时
409服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突
410客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置
411服务器无法处理客户端发送的不带Content-Length的请求信息
412客户端请求信息的先决条件错误
413由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息
414请求的URI过长(URI通常为网址),服务器无法处理
415服务器无法处理请求附带的媒体格式
416客户端请求的范围无效
417服务器无法满足Expect的请求头信息
500服务器内部错误,无法完成请求
501服务器不支持请求的功能,无法完成请求
502作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
504充当网关或代理的服务器,未及时从远端服务器获取请求
505服务器不支持请求的HTTP协议的版本,无法完成处理

HTTP 的请求头和响应头

HTTP 的请求头和响应头是用于客户端和服务器端传递附加信息,一个请求头/响应头由名称(不区分大小写)后跟一个冒号“:”,冒号后跟具体的值(不带换行符)组成。该值前面的引导空白会被忽略。

HTTP 请求头信息

我们来看一下一般情况下请求头部信息具有哪些属性

HTTP请求中的常用消息头

  • Accept:浏览器通过这个头告诉服务器,它所支持的数据类型
  • Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
  • Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
  • Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
  • Host:浏览器通过这个头告诉服务器,想访问哪台主机
  • If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
  • Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的 防盗链
  • Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

HTTP 请求主体

请求消息的最后一部分 是请求主体。

  • 不是所有的请求都需要请求主体:例如获取资源的请求 GET、HEAD、DEL ETE 和 OPTIONS,通常它们不需要请求主体。
  • 有些请求将数据发送到服务器以便更新数据:常见的的情况是POST请求(包含HTML表单数据)。

请求主体大致可分为两类:

  1. 单一资源主体: 由一个单文件组成。该类型请求主体由两个 header 定义: Content-TypeContent-Length
  2. 多资源主体: 由多部分请求主体组成,每一部分包含不同的信息位。通常是和 HTML 表单连系在一起。

HTTP 响应头信息

我们来看一下一般情况下响应头部信息具有哪些属性

  • Location: 服务器通过这个头,来告诉浏览器跳到哪里
  • Server:服务器通过这个头,告诉浏览器服务器的型号
  • Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
  • Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
  • Content-Language: 服务器通过这个头,告诉浏览器语言环境
  • Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
  • Refresh:服务器通过这个头,告诉浏览器定时刷新
  • Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
  • Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
  • Expires: -1 控制浏览器不要缓存

HTTP 响应主体

响应消息的最后一部分是响应主体。不是所有的响应都需要响应主体:例如具有状态码的响应,通常不会有响应主体。

响应主体大致可分为两类:

  1. 单一资源主体: 由已知长度的单个文件组成。该类型响应主体由两个 header 定义: Content-TypeContent-Length
  2. 单一资源主体: 由未知长度的单个文件组成,通过将 Transfer-Encoding 设置为 chunked 来使用 chunks 编码。
  3. 多资源主体: 多部分响应主体组成,每部分包含不同的信息段。但这是比较少见的。

MIME 类型

MIME 类型 (全称为 Multipurpose Internet Mail Extensions媒体类型,用来表示文档、文件或字节流的性质和格式。所谓的 MIME 类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。

MIME 类型的通用结构如下所示

type/subtype

MIME 的组成结构非常简单;由类型与子类型两个字符串中间用 '/' 分隔而组成,不允许空格存在。MIME 类型对大小写不敏感,但是传统写法都是小写。

MIME 类型附加到响应对象的头部是非常重要的。

类型描述典型示例
text表明文件是普通文本,理论上是人类可读text/plain, text/html, text/css, text/javascript
image表明是某种图像。不包括视频,但是动态图(比如动态 gif )也使用image 类型image/gif, image/png, image/jpeg, image/bmp, image/webp, image/x-icon, image/vnd.microsoft.icon
audio表明是某种音频文件audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
video表明是某种视频文件video/webm, video/ogg
application表明是某种二进制数据application/octet-stream, application/pkcs12, application/vnd.mspowerpoint, application/xhtml+xml, application/xml, application/pdf

(完)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一碗周.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值