# HTTP 协议

# HTTP 原理

超文本传输协议 HTTP (HyperText Transfer Protocol) 主要用于从 WWW 服务器传输超文本到本地浏览器。

超文本传输协议 HTTP 是应用层协议

# 常用 HTTP 服务器

  1. 共享软件 APACHE Web 服务器

  2. Nginx 是一种高性能的 HTTP 和反向代理 web 服务器,支持高并发和负载均衡,以稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

  3. 微软公司的 Internet 信息服务器 IIS

# 实现状态记忆的方式

# Cookies

使用 Cookies 是最常见的方法之一。服务器可以在响应中设置一个包含状态信息的 Cookie,然后在后续的请求中,客户端会将该 Cookie 包含在请求头中发送给服务器。服务器通过解析 Cookie 可以获取先前存储的状态信息,例如购物车中的商品。

# Session

服务器端的 Session 机制也是一种常见的状态管理方式。服务器在收到客户端的请求时,为每个客户端创建一个唯一的会话标识(Session ID),并将该标识发送给客户端,通常通过 Cookie。服务器会维护一个存储状态信息的数据结构,通过 Session ID 来关联每个客户端的状态信息。这样,客户端每次请求时,服务器都能根据 Session ID 获取对应的状态信息,实现状态的保持。

# URL 参数

在 URL 中包含状态信息也是一种简单的方式。例如,将用户的标识或其他状态信息直接作为 URL 参数的一部分传递。但要注意,这可能导致一些安全性和隐私问题,因为 URL 参数可能被记录在日志文件或浏览器历史记录中。

# 隐藏域

在 HTML 表单中添加隐藏字段(Hidden Form Fields)也是一种传递状态信息的方法。通过将状态信息包含在表单中的隐藏字段中,这些信息将在表单提交时一并发送到服务器。

# Web Storage

使用浏览器端的 Web Storage(localStorage 或 sessionStorage)也是一种在客户端存储状态信息的方法。这些存储空间允许在浏览器本地存储数据,可以在不同的页面间保持状态。

# Web 页面

# 静态页面

  • 特点: 静态页面是指内容在服务器上预先生成,用户访问时呈现相同的内容。它们一般由 HTML、CSS 和 JavaScript 等静态资源组成,不涉及服务器端的动态处理。
  • 优点: 简单、快速,适用于内容不经常变化的场景。
  • 缺点: 不支持个性化、实时性差,需要手动更新内容。

# 动态页面

  • 特点: 动态页面是在用户请求时动态生成的,服务器端通过处理请求、查询数据库等动态生成页面的内容。通常使用服务器端脚本语言(如 PHP、Python、Ruby)或框架实现。
  • 优点: 可以根据用户请求生成个性化内容,实时性更好。
  • 缺点: 处理请求的时间相对较长,对服务器压力较大。

# 活动页面

  • 特点: SPA 是一种现代化的 Web 应用架构,页面加载后,只在用户与应用交互时更新页面的部分内容,而不是整页刷新。通常使用 JavaScript 框架(如 React、Angular、Vue)实现。
  • 优点: 用户体验更流畅,避免了整页刷新,提高了应用的性能。
  • 缺点: 首次加载时可能需要较长时间,对搜索引擎的友好性相对较差。

# URL

URL(Uniform Resource Locator)是统一资源定位符的缩写,用于定位互联网上的资源。它是互联网上标识资源位置的地址,包括了访问资源所需的协议、主机名、端口号、路径等信息。

一个标准的 URL 包括以下几个部分:

  1. 协议(Protocol): 表示访问资源所使用的协议,例如 HTTP、HTTPS、FTP 等。
  2. 主机名(Host): 表示资源所在的服务器的域名或 IP 地址。
  3. 端口号(Port): 表示访问服务器的端口号,如果未指定,默认使用协议的默认端口(如 HTTP 的默认端口是 80)。
  4. 路径(Path): 表示资源在服务器上的具体路径或位置。
  5. 查询参数(Query Parameters): 表示传递给服务器的额外参数,以键值对的形式出现,多个参数之间使用 "&" 符号分隔。
  6. 片段标识符(Fragment): 表示资源中的一个具体部分,通常在页面内部用于定位特定的位置。

# HTTP 通信方式

HTTP 1.1 的持久连接: 为了提高效率,HTTP 1.1 引入了持久连接(也称为长连接)。在这种方式下,客户端和服务器之间的连接不会在每次请求和响应之间关闭,而是保持打开状态,多个请求和响应可以在同一个连接上进行。这减少了连接的建立和关闭次数,提高了性能。

  • 管道化(Pipeline): HTTP 1.1 还支持管道化,即在同一个连接上发送多个请求而不等待响应。这可以减少请求和响应之间的等待时间。
  • 分块传输编码(Chunked Transfer Encoding): 允许服务器将响应主体分成多个块(chunk)传输,每个块都带有块的大小信息。这种方式允许在还未接收完整个响应主体的情况下开始处理部分内容,提高了效率。

# HTTP 通信过程

  1. 建立连接: 客户端通过 TCP 连接与服务器建立连接。
  2. 发送请求: 客户端向服务器发送 HTTP 请求,包括请求行、请求头和请求体。
  3. 处理请求: 服务器接收到请求后,根据请求的内容进行处理,生成相应的响应。
  4. 发送响应: 服务器向客户端发送 HTTP 响应,包括响应行、响应头和响应体。
  5. 关闭连接: 在短连接中,连接在请求和响应完成后会立即关闭;在持久连接中,连接可以保持打开状态,以备下一次请求。

通常有 3 种通信方式

  1. 点对点方式
    点对点方式是最简单的传输方式,用户经过请求与源服务器间通过 HTTP 建立起点对点的连接
  2. 使用中继服务器
    中间服务器系统充当通信中继功能,客户发出的请求通过中继到达相关的服务器,同样服务器的响应也要通过中继才能返回给客户
  3. 缓存方式
    缓存方式暂时保存一定时间内的客户请求及该客户请求所对应的服务器响应,这样的缓存便于处理新的客户请求,节省网络流量和当地计算资源。

# HTTP 特点

  • 简单 HTTP 协议在客户与服务器连接后,要求客户必须传送的信息只是请求方法和路径。
  • 无连接性 HTTP 是一个无连接性协议 (HTTP 1.0),每次连接只处理一个请求,并且客户接到服务器应答后立即断开连接
  • 无状态性 无状态性使 C 与 S 连接通信运行速度快,服务器应答也快。但无状态性使协议对事务处理没有记忆和且是独立的。
    为满足后续事务处理需要前面事务的有关信息的情况,这些前面事务的有关信息必须在协议外面保存,这便导致每次连接要传送较多的信息。
  • 元信息 HTTP 协议对所有事务处理都加了首部,我们称之为元信息,即关于信息的信息。

# HTTP 常用请求方法

# GET 方法

GET 方法的目的是取回由 URL 指定的资源

# HEAD 方法

HEAD 方法要求服务器查找某对象的元信息而不是对象本身,仅要求服务器返回关于文档的信息,而非文档本身。例如用户想知道对象的大小,对象的最后一次修改的时间等。

# POST 方法

POST 方法从客户向服务器传送数据,用来请求 HTTP 服务器将附带的数据当作 HTTP 服务器一个新的记录来接收。

# PUT 方法

PUT 方法是用来请求将这个请求中所发送的数据储存到请求消息中表明的资源处。
如果数据已存在,则此数据将被看成已存在数据的修改。
与 POST 方法的不同之处:数据的目标位置可以规定好

# DELETE 方法

DELETE 方法是用来请求 HTTP 服务器删除在请求消息中表明的资源。这个方法可能被人工干预或 HTTP 服务器上的安全设置所超越。仅当服务器同意删除这个资源时,才会发送一个成功应答。

# TRACE 方法

TRACE 方法用来确保 HTTP 服务器所接收到的数据是正确的。
TRACE 的回答是实际的 HTTP 请求,允许对 HTTP 请求进行测试和调试。

# CONNECT 方法

CONNECT 方法被保留为安全接口层 SSL 隧道所用。

# HTTP 断点续传

使用 Range 请求头,指定第一个字节位置和最后一个字节位置

使用到 Content-Range 响应头

# 基本过程

  1. 客户端发送请求:客户端发送一个带有 Range 头部的 HTTP 请求,指定需要续传的文件范围。

    1
    2
    3
    GET /path/to/file HTTP/1.1
    Host: example.com
    Range: bytes=500-999

  2. 服务器响应:服务器收到带有 Range 头部的请求后,会根据指定的范围生成一个部分响应(Partial Content),只包含指定范围的文件内容。

1
2
3
4
5
HTTP/1.1 206 Partial Content
Content-Range: bytes 500-999/2000
Content-Length: 500

[Partial file content]

  1. 客户端接收:客户端接收到部分响应后,将其保存在本地。如果下载中断,客户端可以通过发送新的带有更新的 Range 头部的请求来继续下载。

1
2
3
4
GET /path/to/file HTTP/1.1
Host: example.com
Range: bytes=1000-1499