﻿---
title: Http Protocol
date: 2024-07-22
tags:
  - Web
  - Network
  - Internet
  - HTTP
  - TCP
  - Browser
cover: https://assets.vluv.space/cover/FrontEnd/http_protocol.webp
excerpt: "HTTP 是一种应用层协议，用于传输Hypermedia Documents，例如 HTML。它最初是为Web 浏览器与 Web 服务器之间的通信而设计的，但也可以用于其他用途，如机器间通信、API访问等。本文对其请求报文、响应报文以及版本进行介绍"
updated: 2026-05-08 22:34:07
---

<script data-swup-reload-script type="module" src="/js/components/tab.js"></script>

## HTTP 特点

- **基于请求/响应模型**： 所有的通信都是由客户端发起请求，服务器对请求进行响应
- **无状态 Stateless**： 服务器不会保存客户端的状态信息，每次请求都独立
- **无连接 Connectionless**： 客户端与服务器在完成一次请求-响应后，链接就会断开。但 `HTTP/1.1` 引入了 `Keep-Alive`，允许在同一连接中发送多个请求和响应，减少建立连接的开销

```http
Connection: keep-alive
Keep-Alive: timeout=30, max=100
```

## HTTP Message

HTTP 消息分为请求消息和响应消息，两者结构类似，如下图所示，都可以分为三部分：起始行 (Start Line)、头部 (Headers) 和可选的消息体 (Body)。
![http_message_0.webp](https://assets.vluv.space/http_message_0.webp)

### HTTP Request Message

#### Request Line

消息的第一行，包含

- Method: `GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH`
- Request Target: `/resource/user?id=10`
- Version: `HTTP/1.1`

##### Method
| **方法** | **是否幂等** | **是否有 body** | **常见用途** |
| -------- | ------------ | --------------- | ------------ |
| GET      | ✅            | ❌               | 查询         |
| POST     | ❌            | ✅               | 创建         |
| PUT      | ✅            | ✅               | 全量更新     |
| PATCH    | ⚠️            | ✅               | 部分更新     |
| DELETE   | ✅            | ❌/✅             | 删除         |
| HEAD     | ✅            | ❌               | 查元信息     |
| OPTIONS  | ✅            | ❌               | 探测能力     |

#### Request Headers

请求携带的元数据，每个 Header 占一行，用冒号分隔键和值，常见的 Header 有：

- Host: 请求的目标，如 `example.com`，`a.com:8080`, `localhost:4000`；Host 拼接 Request Target 即可确认请求资源的位置，例如 `example.com/index.html`

---

- User-Agent: 客户端软件信息，如浏览器类型和版本
- Referer: 来源页面的 URL

---

- Content-Type: 请求体的数据类型，如 `application/json`
- Content-Length: 请求体的长度（字节数）

---

- Authorization: 认证信息，如 `Bearer token`，`Basic base64encodedcredentials`
- Cookie: 客户端存储的 Cookie 数据

#### Request Body

可选部分，包含客户端发送给服务器的数据，格式根据 `Content-Type` 头部指定的类型而定

<x-tabs>

<x-tab title="application/json" active>

```http
{
	"username": "example",
	"password": "password123"
}
```

</x-tab>

<x-tab title="application/x-www-form-urlencoded">

```http
username=example&password=password123
```

</x-tab>

</x-tabs>

### HTTP Response Message

#### Status Line

消息的第一行，包含 HTTP 版本、状态码和状态文本，例如 `HTTP/1.1 200 OK`

> [!hint] HTTP Status Code
>
> ![http_protocol_status_code.webp](https://assets.vluv.space/http_protocol_status_code.webp)
>
> See more datails [HTTP 常见状态码总结（应用层） | JavaGuide](https://javaguide.cn/cs-basics/network/http-status-codes.html#_2xx-success-%E6%88%90%E5%8A%9F%E7%8A%B6%E6%80%81%E7%A0%81)

#### Response Headers

提供响应的元数据，`curl` 可以指定 `-I` 参数仅查看响应头部, 例如 `curl -I vluv.space`

常见的 Header 有：

- Server: 服务器软件信息，如 `Apache/2.4.41 (Ubuntu)`

---

- Cache-Control[^1]: 告诉客户端如何缓存响应，例如 `public`, `private` `no-cache`, `max-age=3600`
- Etag: 资源的唯一标识符，用于缓存验证；服务器在响应中返回 ETag，客户端在后续请求中通过 `If-None-Match` 头部携带该 ETag，服务器根据 ETag 判断资源是否被修改，如果没修改可以不发送响应体，并把状态码设为 `304 Not Modified`，从而节省带宽

---

- Content-Type & Content-Length: 响应体的数据类型和长度

#### Response Body

可选部分，包含服务器返回的实际数据；格式根据 `Content-Type` 头部指定的类型而定

[^1]: [What is cache-control? | Cache explained | Cloudflare](https://www.cloudflare.com/learning/cdn/glossary/what-is-cache-control/)
