Skip to main content

HTTP 详解

本文引用于 https://juejin.im/post/6874114366023663623MDN

HTTP 基本性质

HTTP 的是一个基于请求与响应、无状态有会话、灵活、简单可扩展的、应用层的协议

  1. HTTP 请求是无状态有会话

HTTP 因为是无状态的,所以在两个请求中,是完全没有任何关系的,那么这就带来了如果在购物网站上添加商品到购物车,再去另一个商品页面上点击添加购物车,这两次添加商品的请求没有任何关联,那么就会造成浏览器不知道用户选择了什么

对于这种事件,HTTP Cookies 就可以解决这个问题,把 Cookies 添加到请求头中,创建一个会话都能共享上下文信息,达成相同的状态

注意,HTTP 本质是无状态的,使用 Cookies 可以创建有状态的会话。

  1. HTTP 是简单的

虽然下一代 HTTP/2 协议将 HTTP 消息封装到了帧(frames)中,HTTP 大体上还是被设计得简单易读。HTTP 报文能够被人读懂,还允许简单测试,降低了门槛,对新人很友好。

  1. HTTP 是可拓展的

在 HTTP/1.0 中出现的 HTTP headers 让协议扩展变得非常容易。只要服务端和客户端就新 headers 达成语义一致,新功能就可以被轻松加入进来。

  1. HTTP 和 连接

一个连接是由传输层来控制的,这从根本上不属于 HTTP 的范围。HTTP 并不需要其底层的传输层协议是面向连接的,只需要它是可靠的,或不丢失消息的(至少返回错误)。在互联网中,有两个最常用的传输层协议:TCP 是可靠的,而 UDP 不是。因此,HTTP 依赖于面向连接的 TCP 进行消息传递,但连接并不是必须的。

在客户端(通常指浏览器)与服务器能够交互(客户端发起请求,服务器返回响应)之前,必须在这两者间建立一个 TCP 链接,打开一个 TCP 连接需要多次往返交换消息(因此耗时)。HTTP/1.0 默认为每一对 HTTP 请求/响应都打开一个单独的 TCP 连接。当需要连续发起多个请求时,这种模式比多个请求共享同一个 TCP 链接更低效。

为了减轻这些缺陷,HTTP/1.1 引入了流水线(被证明难以实现)和持久连接的概念:底层的 TCP 连接可以通过 Connection 头部来被部分控制。HTTP/2 则发展得更远,通过在一个连接复用消息的方式来让这个连接始终保持为暖连接。

为了更好的适合 HTTP,设计一种更好传输协议的进程一直在进行。Google 就研发了一种以 UDP 为基础,能提供更可靠更高效的传输协议 QUIC。

HTTP 结构

浏览器首先要做的事就是根据 URL  把数据取回来,取回数据使用的是 HTTP  协议,它的主要结构如下图所示

HTTP 是纯粹的文本协议,它是规定了使用 TCP 协议来传输文本格式的一个应用层协议, TCP  协议是一条双向的通讯通道, HTTP  在其基础上规定了 Request-Response  的模式,这个模式决定了通讯必定是由浏览器端首先发起的

大部分情况下,浏览器的实现者只需要用一个 TCP  库,甚至一个现成的 HTTP  库就可以搞定浏览器的网络通讯部分