3.HTTP/HTTPS:报文格式、方法、状态码、缓存、SSLTLS握手
HTTP/HTTPS:报文格式、方法、状态码、缓存、SSL/TLS握手
1. HTTP报文格式
1.1 HTTP请求报文(Request)
GET /api/v1/users HTTP/1.1 // 请求行:方法、URI、协议版本
Host: api.example.com // 请求头 (Headers)
User-Agent: Mozilla/5.0...
Accept: application/json
Content-Type: application/json
Authorization: Bearer xxxx...// 空行 (CRLF),分隔头部和体
{"name": "John"} // 请求体 (Body),GET请求通常没有Body
- 请求行:定义了请求类型、资源路径和HTTP版本。
- 请求头:包含关于客户端、请求本身的各种元信息。
- 请求体:包含发送给服务器的数据(常用于POST, PUT等方法)。
1.2 HTTP响应报文(Response)
HTTP/1.1 200 OK // 状态行:协议版本、状态码、状态消息
Content-Type: application/json // 响应头 (Headers)
Content-Length: 123
Cache-Control: max-age=3600
Set-Cookie: sessionId=abc123;...// 空行 (CRLF),分隔头部和体
{"id": 1, "name": "John"} // 响应体 (Body),包含请求的资源或数据
- 状态行:告知客户端请求的处理结果。
- 响应头:包含关于服务器、响应本身的各种元信息。
- 响应体:包含服务器返回给客户端的实际数据。
1.3 报文解析代码示例
# 简单的HTTP解析示例
def parse_http_request(request_data):lines = request_data.split('\r\n')# 解析请求行request_line = lines[0]method, path, version = request_line.split(' ')# 解析头部headers = {}for line in lines[1:]:if line == '': # 空行,头部结束breakif ': ' in line:key, value = line.split(': ', 1)headers[key] = value# 解析主体body = ''if '\r\n\r\n' in request_data:body = request_data.split('\r\n\r\n', 1)[1]return {'method': method,'path': path, 'version': version,'headers': headers,'body': body}
2. HTTP方法(Methods)
2.1 常用方法
方法 | 作用 | 幂等性 | 安全性 |
---|---|---|---|
GET | 只读,获取资源 | 是 | 是 |
POST | 创建资源 | 否 | 否 |
PUT | 更新资源 | 是 | 否 |
DELETE | 删除资源 | 是 | 否 |
HEAD | 获取头部 | 是 | 是 |
PATCH | 部分更新 | 否 | 否 |
OPTIONS | 查询支持方法 | 是 | 是 |
重点:
- 幂等性 (Idempotent):多次执行相同的请求,产生的效果与一次执行相同。(GET, PUT, DELETE是幂等的;POST不是)。
- 安全性 (Safe):方法不会修改服务器上的资源。(GET, HEAD是安全的)。
2.2 方法特性详解
# RESTful API设计示例
class UserAPI:# GET /users - 获取用户列表def get_users(self):pass# POST /users - 创建新用户def create_user(self, data):pass# GET /users/123 - 获取特定用户def get_user(self, user_id):pass# PUT /users/123 - 更新整个用户def update_user(self, user_id, data):pass# PATCH /users/123 - 部分更新用户def patch_user(self, user_id, data):pass# DELETE /users/123 - 删除用户def delete_user(self, user_id):pass
3. HTTP状态码(Status Codes)
3.1 状态码分类
状态码 | 类别 | 常见状态码及含义 |
---|---|---|
1xx | 信息性 | 100 Continue(客户端应继续发送请求体) |
2xx | 成功 | 200 OK(成功) 201 Created(资源创建成功) 204 No Content(成功,但无内容返回) |
3xx | 重定向 | 301 Moved Permanently(永久重定向) 302 Found(临时重定向) 304 Not Modified(资源未修改,使用缓存) |
4xx | 客户端错误 | 400 Bad Request(请求语法错误) 401 Unauthorized(需要身份认证) 403 Forbidden(服务器拒绝请求) 404 Not Found(资源不存在) 429 Too Many Requests(请求过于频繁) |
5xx | 服务器错误 | 500 Internal Server Error(服务器内部错误) 502 Bad Gateway(网关错误) 503 Service Unavailable(服务不可用) 504 Gateway Timeout(网关超时) |
4. HTTP缓存机制
缓存是Web性能优化的核心手段,主要分为强缓存和协商缓存。
1. 强缓存
浏览器直接判断缓存是否过期,未过期则直接使用本地缓存,不发请求到服务器。
- 响应头:
Cache-Control: max-age=3600
(相对时间,单位秒,优先级更高)Expires: Wed, 21 Oct 2024 07:28:00 GMT
(绝对时间,HTTP/1.0)
2. 协商缓存
浏览器发现缓存已过期,发送请求询问服务器资源是否还能用。如果可用,服务器返回304,浏览器继续用缓存。
- 请求/响应头:
Last-Modified
(服务器告知的资源最后修改时间) /If-Modified-Since
(浏览器再次询问时带上的时间)Etag
(服务器告知的资源唯一标识,如哈希值) /If-None-Match
(浏览器再次询问时带上的标识,优先级更高)
缓存流程:
graph TDA[浏览器请求资源] --> B{是否有缓存?}B -- 无 --> C[直接向服务器请求]B -- 有 --> D{强缓存是否过期?}D -- 未过期 --> E[直接使用磁盘缓存]D -- 已过期 --> F[携带If-None-Match/If-Modified-Since<br>向服务器发起验证]F --> G{服务器验证资源是否变化?}G -- 未变化 304 --> H[更新缓存头,使用缓存]G -- 已变化 200 --> I[返回新资源,更新缓存]
5. SSL/TLS握手过程
HTTPS = HTTP + SSL/TLS,在TCP和HTTP之间增加了一个安全层。
SSL/TLS握手核心目的:
- 协商加密套件(Cipher Suite)。
- 验证服务器身份(可选验证客户端身份)。
- 安全地交换对称加密密钥(Session Key)。
简化握手过程:
-
Client Hello (Client -> Server)
- 客户端支持的TLS版本。
- 客户端生成的随机数
Random_C
。 - 客户端支持的密码套件列表(如RSA, ECDHE)。
-
Server Hello (Server -> Client)
- 选择的TLS版本和密码套件。
- 服务器生成的随机数
Random_S
。 - 服务器的数字证书(包含公钥)。
-
验证与预主密钥 (Client)
- 客户端验证证书的合法性(是否可信CA签发、域名是否匹配、是否过期)。
- 客户端生成第三个随机数
Pre-Master Secret
,用证书中的服务器公钥加密,发送给服务器。
-
生成会话密钥 (Client & Server)
- 客户端和服务器使用
Random_C
、Random_S
和Pre-Master Secret
,根据约定的算法各自独立生成相同的对称会话密钥(Session Key)。后续通信都用这个密钥加密。
- 客户端和服务器使用
-
Finished
- 双方交换加密后的Finished消息,验证握手过程是否成功,加密通道是否已正确建立。
核心思想:非对称加密(RSA/ECDHE)用于安全地交换对称加密的密钥(AES)。因为非对称加密计算开销大,不适合加密大量数据。
常见问题
Q1: GET和POST的区别?
答:GET用于获取资源,幂等,参数在URL中,有长度限制;POST用于创建资源,非幂等,参数在body中,无长度限制。
Q2: HTTP缓存机制如何工作?
答:通过Cache-Control、Expires、ETag、Last-Modified等头部控制,包含强制缓存和协商缓存两种机制。
Q3: TLS握手为什么需要4次往返?
答:需要交换随机数、协商参数、验证证书、交换密钥,确保通信的安全性和完整性。
Q4: 301和302重定向的区别?
答:301是永久重定向,浏览器会缓存;302是临时重定向,浏览器不会缓存。
Q5: Content-Security-Policy的作用?
答:防止XSS攻击,限制资源加载来源,指定允许执行的脚本源。
- 必背题:
- GET和POST的区别(安全、幂等、Body、缓存、历史记录)。
- 常见状态码的含义(200, 301, 302, 304, 400, 401, 403, 404, 500, 502)。
- 强缓存和协商缓存的流程和相关Header。
- 必会分析:
- 能完整描述TLS握手过程,并解释为什么需要交换随机数、为什么最终使用对称加密。
- 能根据请求和响应头分析一次HTTP请求的缓存行为。
- 深入问题:
- 对称加密和非对称加密的区别?TLS为什么两者都用?
- 数字证书的作用是什么?它里面包含了什么?(公钥、所有者信息、CA的签名)
- HTTP/1.1 vs HTTP/2 的主要改进是什么?(多路复用、头部压缩、服务器推送)
总结
HTTP/HTTPS是现代Web的基石:
- ✅ HTTP协议:无状态请求-响应协议,方法多样,状态码丰富
- ✅ 缓存机制:提高性能,减少网络流量,多种缓存策略
- ✅ HTTPS安全:TLS加密,证书验证,保护数据传输安全
- ✅ 最佳实践:安全头部,性能优化,正确配置
4.Socket编程
//TODO: keep learning.