# HTTP与HTTPS

## 目录
- [HTTP协议](#http协议)
- [HTTPS协议](#https协议)
- [HTTP/2](#http2)
- [HTTP/3](#http3)
- [请求方法](#请求方法)
- [状态码](#状态码)
- [请求头与响应头](#请求头与响应头)
- [安全机制](#安全机制)
- [面试常见问题](#面试常见问题)

---

## HTTP协议

### HTTP 简介

```java
// HTTP：HyperText Transfer Protocol
// 超文本传输协议
// 应用层协议
// 基于 TCP/IP
```

### HTTP 特点

1. **无状态**：每次请求独立，不保存状态
2. **请求-响应**：客户端请求，服务器响应
3. **明文传输**：数据不加密（HTTPS 加密）

### HTTP 请求格式

```
请求行：方法 路径 协议版本
请求头：键值对
空行
请求体：数据（可选）

示例：
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
```

### HTTP 响应格式

```
状态行：协议版本 状态码 状态描述
响应头：键值对
空行
响应体：数据

示例：
HTTP/1.1 200 OK
Content-Type: text/html
Content-Length: 1234

<html>...</html>
```

---

## HTTPS协议

### HTTPS 简介

```java
// HTTPS：HTTP over SSL/TLS
// 安全的 HTTP 协议
// 使用 SSL/TLS 加密
```

### HTTPS 工作原理

```
1. 客户端请求 HTTPS 连接
2. 服务器返回证书
3. 客户端验证证书
4. 客户端生成对称密钥，用服务器公钥加密
5. 服务器用私钥解密，获得对称密钥
6. 使用对称密钥加密通信
```

### SSL/TLS 握手

```java
// SSL/TLS 握手过程
// 1. Client Hello：客户端发送支持的加密算法
// 2. Server Hello：服务器选择加密算法，返回证书
// 3. Client Key Exchange：客户端生成密钥，用服务器公钥加密
// 4. Change Cipher Spec：切换到加密通信
// 5. Finished：握手完成
```

---

## HTTP/2

### HTTP/2 特性

1. **多路复用**：一个连接可以处理多个请求
2. **头部压缩**：压缩请求头和响应头
3. **服务器推送**：服务器可以主动推送资源
4. **二进制分帧**：使用二进制格式

### HTTP/2 vs HTTP/1.1

| 特性 | HTTP/1.1 | HTTP/2 |
|------|----------|--------|
| 连接 | 多个连接 | 单个连接 |
| 多路复用 | ❌ | ✅ |
| 头部压缩 | ❌ | ✅ |
| 服务器推送 | ❌ | ✅ |

---

## HTTP/3

### HTTP/3 特性

1. **基于 UDP**：使用 QUIC 协议
2. **更快连接**：减少握手时间
3. **更好的拥塞控制**
4. **连接迁移**：切换网络不断开连接

---

## 请求方法

### GET

```java
// GET：获取资源
// 参数在 URL 中
// 幂等性：是
// 安全性：是（不修改资源）

GET /user?id=1 HTTP/1.1
```

### POST

```java
// POST：创建资源
// 参数在请求体中
// 幂等性：否
// 安全性：否（修改资源）

POST /user HTTP/1.1
Content-Type: application/json

{"name": "John", "email": "john@example.com"}
```

### PUT

```java
// PUT：更新资源（完整更新）
// 幂等性：是
// 安全性：否

PUT /user/1 HTTP/1.1
{"name": "Jane", "email": "jane@example.com"}
```

### PATCH

```java
// PATCH：更新资源（部分更新）
// 幂等性：否
// 安全性：否

PATCH /user/1 HTTP/1.1
{"name": "Jane"}
```

### DELETE

```java
// DELETE：删除资源
// 幂等性：是
// 安全性：否

DELETE /user/1 HTTP/1.1
```

---

## 状态码

### 2xx 成功

```java
// 200 OK：请求成功
// 201 Created：创建成功
// 204 No Content：成功但无内容
```

### 3xx 重定向

```java
// 301 Moved Permanently：永久重定向
// 302 Found：临时重定向
// 304 Not Modified：未修改（使用缓存）
```

### 4xx 客户端错误

```java
// 400 Bad Request：请求错误
// 401 Unauthorized：未授权
// 403 Forbidden：禁止访问
// 404 Not Found：资源不存在
```

### 5xx 服务器错误

```java
// 500 Internal Server Error：服务器错误
// 502 Bad Gateway：网关错误
// 503 Service Unavailable：服务不可用
```

---

## 请求头与响应头

### 常用请求头

```java
// Host：服务器地址
Host: www.example.com

// User-Agent：客户端信息
User-Agent: Mozilla/5.0

// Content-Type：请求体类型
Content-Type: application/json

// Authorization：认证信息
Authorization: Bearer token

// Cookie：Cookie 信息
Cookie: session_id=123
```

### 常用响应头

```java
// Content-Type：响应体类型
Content-Type: application/json

// Content-Length：响应体长度
Content-Length: 1234

// Set-Cookie：设置 Cookie
Set-Cookie: session_id=123; Path=/

// Cache-Control：缓存控制
Cache-Control: max-age=3600

// Location：重定向地址
Location: https://www.example.com/new
```

---

## 安全机制

### 1. HTTPS

```java
// 使用 HTTPS 加密传输
// 防止数据被窃听和篡改
```

### 2. 认证

```java
// Basic 认证
Authorization: Basic base64(username:password)

// Bearer 认证（Token）
Authorization: Bearer token

// OAuth 2.0
Authorization: Bearer access_token
```

### 3. CORS

```java
// 跨域资源共享
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Headers: Content-Type
```

---

## 面试常见问题

### Q1: HTTP 和 HTTPS 的区别？

**答案：**
- **HTTP**：明文传输，不加密
- **HTTPS**：使用 SSL/TLS 加密传输，更安全

### Q2: HTTP 请求方法？

**答案：**
- GET：获取资源
- POST：创建资源
- PUT：更新资源（完整）
- PATCH：更新资源（部分）
- DELETE：删除资源

### Q3: HTTP 状态码？

**答案：**
- 2xx：成功
- 3xx：重定向
- 4xx：客户端错误
- 5xx：服务器错误

### Q4: HTTP/2 的特性？

**答案：**
1. 多路复用
2. 头部压缩
3. 服务器推送
4. 二进制分帧

---

*最后更新：2024年*
