Files
mkdocs/docs/android面试/网络编程/HTTP与HTTPS.md
2026-01-15 11:53:37 +08:00

339 lines
5.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# HTTP与HTTPS
## 目录
- [HTTP协议](#http协议)
- [HTTPS协议](#https协议)
- [HTTP/2](#http2)
- [HTTP/3](#http3)
- [请求方法](#请求方法)
- [状态码](#状态码)
- [请求头与响应头](#请求头与响应头)
- [安全机制](#安全机制)
- [面试常见问题](#面试常见问题)
---
## HTTP协议
### HTTP 简介
```java
// HTTPHyperText 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
// HTTPSHTTP 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
// CookieCookie 信息
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年*