http(Hyper Text Transfer Protocol)是什么
- “超文本传输协议”,它可以拆成三个部分,分别是:“超文本”“传输”和“协议”。
- 超文本
- 图片、音频、视频、甚至是压缩包,在 HTTP 眼里都可以算做是“文本”。所谓“超文本”,就是“超越了普通文本的文本”,它是文字、图片、音频和视频等的混合体,最关键的是含有“超链接”,能够从一个“超文本”跳跃到另一个“超文本”,形成复杂的非线性、网状的结构关系。
- HTTP 是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范”。
http不是什么
- HTTP 不是互联网。互联网(Internet)是遍布于全球的许多网络互相连接而形成的一个巨大的国际网络,在它上面存放着各式各样的资源,也对应着各式各样的协议,例如超文本资源使用 HTTP,普通文件使用 FTP,电子邮件使用 SMTP 和 POP3 等。
- HTTP 不是编程语言。HTTP 不是 HTML,这个可能要特别强调一下,千万不要把 HTTP 与 HTML 混为一谈,虽然这两者经常是同时出现。
- HTTP 不是一个孤立的协议。HTTP 通常跑在 TCP/IP 协议栈之上,依靠 IP 协议实现寻址和路由、TCP 协议实现可靠数据传输、DNS 协议实现域名查找、SSL/TLS 协议实现安全通信。此外,还有一些协议依赖于 HTTP,例如 WebSocket、HTTPDNS 等。这些协议相互交织,构成了一个协议网,而 HTTP 则处于中心地位。
常见状态码

1xx
类状态码属于提示信息,是协议处理中的一种中间状态,实际用到的比较少。
2xx
类状态码表示服务器成功处理了客户端的请求,也是我们最愿意看到的状态。
- 「200 OK」是最常见的成功状态码,表示一切正常。如果是非
HEAD
请求,服务器返回的响应头都会有 body 数据。
- 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 body 数据。
- 「206 Partial Content」是应用于 HTTP 分块下载或断点续传,表示响应返回的 body 数据并不是资源的全部,而是其中的一部分,也是服务器处理成功的状态。
3xx
类状态码表示客户端请求的资源发生了变动,需要客户端用新的 URL 重新发送请求获取资源,也就是重定向。
- 「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
- 搜索引擎会逐渐将原网址的权重转移到新网址
- 永久更改网页的 URL
- 从 HTTP 切换到 HTTPS
- 「302 Found」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
- 想要对网页的功能或设计进行 A/B 拆分测试
- HTTP/1.0 规范(1996 年发布)仅包含用于临时重定向的状态代码 302。尽管规定客户端不允许更改重定向请求的请求方法,但大多数浏览器忽略了该标准,并且始终对重定向 URL 执行 GET。这就是 HTTP/1.1(1999 年发布)引入状态代码 303 和 307 的原因,以明确客户端应如何反应。
- 303(“see other”)告诉客户端资源在不同位置暂时可用,并明确指示客户端在新 URL 上发出 GET 请求,无论最初使用哪种请求方法。
- 状态代码 307(“Temporary Redirect”)指示客户端使用另一个 URL 重复请求,同时使用与原始请求中相同的请求方法。例如,一个 POST 请求几乎必须使用另一个 POST 请求重复。
301 和 302 都会在响应头里使用字段 Location
,指明后续要跳转的 URL,浏览器会自动重定向新的 URL。
- 「304 Not Modified」不具有跳转的含义,表示资源未修改,重定向已存在的缓冲文件,也称缓存重定向,也就是告诉客户端可以继续使用缓存资源,用于缓存控制。
4xx
类状态码表示客户端发送的报文有误,服务器无法处理,也就是错误码的含义。
- 「400 Bad Request」表示客户端请求的报文有错误,但只是个笼统的错误。
- 「403 Forbidden」表示服务器禁止访问资源,并不是客户端的请求出错。
- 「404 Not Found」表示请求的资源在服务器上不存在或未找到,所以无法提供给客户端。
5xx
类状态码表示客户端请求报文正确,但是服务器处理时内部发生了错误,属于服务器端的错误码。
- 「500 Internal Server Error」与 400 类型,是个笼统通用的错误码,服务器发生了什么错误,我们并不知道。
- 「501 Not Implemented」表示客户端请求的功能还不支持,类似“即将开业,敬请期待”的意思。
- 「502 Bad Gateway」通常是服务器作为网关或代理时返回的错误码,表示服务器自身工作正常,访问后端服务器发生了错误。
- 「503 Service Unavailable」表示服务器当前很忙,暂时无法响应客户端,类似“网络服务正忙,请稍后重试”的意思。
常见字段
Host字段
客户端发送请求时,用来指定服务器的域名。
Content-Length 字段
服务器在返回数据时,会有 Content-Length
字段,表明本次回应的数据长度。
Connection 字段
Connection
字段最常用于客户端要求服务器使用「HTTP 长连接」机制,以便其他请求复用。
HTTP/1.1 版本的默认连接都是长连接,但为了兼容老版本的 HTTP,需要指定 Connection
首部字段的值为 Keep-Alive
。
Content-Type 字段
Content-Type
字段用于服务器回应时,告诉客户端,本次数据是什么格式。
Content-Encoding 字段
Content-Encoding
字段说明数据的压缩方法。表示服务器返回的数据使用了什么压缩格式
Accept-Encoding
用 Accept-Encoding
字段说明自己可以接受哪些压缩方法。
常见方法
方法名 |
安全性 |
幂等性 |
GET |
是 |
是 |
HEAD |
是 |
是 |
OPTIONS |
是 |
是 |
DELETE |
否 |
是 |
PUT |
否 |
是 |
POST |
否 |
否 |
RESTful的四个方法:GET,PUT,POST,DELETE
安全的方法不会修改资源状态,尽管多次调用的返回值可能不一样(被其他非安全方法修改过)。
幂等性:指该方法多次调用返回的效果(形式)一致,客户端可以重复调用并且期望同样的结果。
安全的方法都是只读的方法(GET、HEAD、OPTIONS),不会改变资源状态,显然,这三个方法也是幂等
PUT请求的幂等性可以这样理解,将A修改为B,它第一次请求值变为了B,再进行多次此操作,最终的结果还是B,与一次执行的结果是一样的,所以PUT是幂等操作。
同理可以理解DELETE操作,第一次将资源删除后,后面多次进行此删除请求,最终结果是一样的,将资源删除掉了。
POST不是幂等操作,因为一次请求添加一份新资源,二次请求则添加了两份新资源,多次请求会产生不同的结果,因此POST不是幂等操作。
GET 请求可以带 body 吗?
RFC 规范并没有规定 GET 请求不能带 body 的。理论上,任何请求都可以带 body 的。只是因为 RFC 规范定义的 GET 请求是获取资源,所以根据这个语义不需要用到 body。
另外,URL 中的查询参数也不是 GET 所独有的,POST 请求的 URL 中也可以有参数的。
URI和URL
URI(Uniform Resource Identifier),中文名称是 统一资源标识符,使用它就能够唯一地标记互联网上资源。URI 另一个更常用的表现形式是 URL(Uniform Resource Locator), 统一资源定位符,也就是我们俗称的“网址”,它实际上是 URI 的一个子集,不过因为这两者几乎是相同的,差异不大,所以通常不会做严格的区分

键入网址再按下回车,后面究竟发生了什么
HTTP 协议基于底层的 TCP/IP 协议,所以必须要用 IP 地址建立连接;
如果不知道 IP 地址,就要用 DNS 协议去解析得到 IP 地址,否则就会连接失败;
建立 TCP 连接后会顺序收发数据,请求方和应答方都必须依据 HTTP 规范构建和解析报文;
为了减少响应时间,整个过程中的每一个环节都会有缓存,能够实现“短路”操作;
虽然现实中的 HTTP 传输过程非常复杂,但理论上仍然可以简化成实验里的“两点”模型。
- 键入网址后,浏览器会对 URL 进行解析,生成 HTTP 请求消息,并委托操作系统发送给 Web 服务器
- 发送 HTTP 请求之前,需要通过 DNS 服务器查询 Web 服务器的 IP 地址,这个过程可能涉及多个 DNS 服务器的查询和转发。
- HTTP 请求消息经过 TCP、IP、MAC 等协议的封装,形成网络包,通过网卡、交换机、路由器等网络设备的转发,最终到达目标 Web 服务器。
- Web 服务器收到网络包后,会解析 HTTP 请求消息,并根据请求的文件名返回相应的网页内容,封装成 HTTP 响应消息
- HTTP 响应消息经过类似的过程,重新封装成网络包,沿着原路返回给客户端浏览器。
- 浏览器收到网络包后,解析 HTTP 响应消息,并渲染网页内容,显示在屏幕上。