当前位置: 首页 > news >正文

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握手核心目的:
  1. 协商加密套件(Cipher Suite)。
  2. 验证服务器身份(可选验证客户端身份)。
  3. 安全地交换对称加密密钥(Session Key)。
简化握手过程:
  1. Client Hello (Client -> Server)

    • 客户端支持的TLS版本。
    • 客户端生成的随机数 Random_C
    • 客户端支持的密码套件列表(如RSA, ECDHE)。
  2. Server Hello (Server -> Client)

    • 选择的TLS版本和密码套件。
    • 服务器生成的随机数 Random_S
    • 服务器的数字证书(包含公钥)。
  3. 验证与预主密钥 (Client)

    • 客户端验证证书的合法性(是否可信CA签发、域名是否匹配、是否过期)。
    • 客户端生成第三个随机数 Pre-Master Secret,用证书中的服务器公钥加密,发送给服务器。
  4. 生成会话密钥 (Client & Server)

    • 客户端和服务器使用 Random_CRandom_SPre-Master Secret,根据约定的算法各自独立生成相同的对称会话密钥(Session Key)。后续通信都用这个密钥加密。
  5. 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攻击,限制资源加载来源,指定允许执行的脚本源。

  1. 必背题
    • GET和POST的区别(安全、幂等、Body、缓存、历史记录)。
    • 常见状态码的含义(200, 301, 302, 304, 400, 401, 403, 404, 500, 502)。
    • 强缓存和协商缓存的流程和相关Header
  2. 必会分析
    • 能完整描述TLS握手过程,并解释为什么需要交换随机数、为什么最终使用对称加密。
    • 能根据请求和响应头分析一次HTTP请求的缓存行为
  3. 深入问题
    • 对称加密和非对称加密的区别?TLS为什么两者都用?
    • 数字证书的作用是什么?它里面包含了什么?(公钥、所有者信息、CA的签名)
    • HTTP/1.1 vs HTTP/2 的主要改进是什么?(多路复用、头部压缩、服务器推送)

总结

HTTP/HTTPS是现代Web的基石:

  • HTTP协议:无状态请求-响应协议,方法多样,状态码丰富
  • 缓存机制:提高性能,减少网络流量,多种缓存策略
  • HTTPS安全:TLS加密,证书验证,保护数据传输安全
  • 最佳实践:安全头部,性能优化,正确配置

4.Socket编程

//TODO: keep learning.


文章转载自:

http://O3391rpO.kdrLy.cn
http://Oksds1Yz.kdrLy.cn
http://O5jJSGcj.kdrLy.cn
http://RlpR7lAL.kdrLy.cn
http://VB9hBEl3.kdrLy.cn
http://8goOl4eH.kdrLy.cn
http://x9FTCgtq.kdrLy.cn
http://foCeBzqy.kdrLy.cn
http://uHstF0HQ.kdrLy.cn
http://3dk8fi9u.kdrLy.cn
http://DANj0Cur.kdrLy.cn
http://w2N1m5sM.kdrLy.cn
http://qi12UDg1.kdrLy.cn
http://ZJ8MFUyH.kdrLy.cn
http://1GzJXkDs.kdrLy.cn
http://5mxJX7nV.kdrLy.cn
http://e9mko2Dz.kdrLy.cn
http://fv7WtPZ3.kdrLy.cn
http://d7OIl4AC.kdrLy.cn
http://ufy1qgbP.kdrLy.cn
http://KIPO10ck.kdrLy.cn
http://Tv2f5NC7.kdrLy.cn
http://Js78o5x4.kdrLy.cn
http://6j0qhSZ6.kdrLy.cn
http://TolbUx3Y.kdrLy.cn
http://4R5N83k1.kdrLy.cn
http://ZKcEDm6J.kdrLy.cn
http://D18Aok6a.kdrLy.cn
http://WAS6xJxR.kdrLy.cn
http://KDSV6lxz.kdrLy.cn
http://www.dtcms.com/a/374505.html

相关文章:

  • 【Leetcode hot 100】146.LRU缓存
  • Android 图片 OOM 防护机制设计:大图加载、内存复用与多级缓存
  • Kubernetes 实战练习指南
  • 滴滴二面准备(一)
  • 机器人控制器开发(部署——软件打包备份更新)
  • 企业级CI/CD全流程实战指南
  • VMware与cpolar:虚拟机跨网络协作的无缝解决方案
  • 【深度学习计算机视觉】03:目标检测和边界框
  • IP 访问限制选型指南(含实现示例与存储策略)
  • 思瑞浦 3PEAK ASN:高效率低成本多路音频传输方案,车规级音频芯片国产突破
  • c primer plus 第四章复习题和练习题
  • ES+MySQL实时搜索架构实战解析
  • ​人脸表情识别检测数据集​:近4k图像,8类,yolo标注
  • 【智能协同云图库】基于统一接口架构构建多维度分析功能、结合 ECharts 可视化与权限校验实现用户 / 管理员图库统计、通过 SQL 优化与流式处理提升数据
  • Linux使用-MySQL的使用
  • Linux grep 命令使用说明
  • 双引擎驱动!中新赛克AI安全方案入选网安创新大赛优胜榜单
  • Day42 PHP(mysql注入、跨库读取)
  • 开源 C++ QT Widget 开发(十四)多媒体--录音机
  • 小白成长之路-jenkins使用pipline部署
  • Elasticsearch面试精讲 Day 15:索引别名与零停机更新
  • vscode中使用git、githup的基操
  • Elasticsearch面试精讲 Day 12:数据建模与字段类型选择
  • 【Visual Studio 2017 和 2019下载】
  • 领码方案·AI狂潮:3天极速塑造高可用电商核心架构——从需求到上线,用智能驱动架构革新,打造可扩展、可维护、可复用的电商系统新范式
  • SpringCloud gateway配置predicates的匹配规则
  • Win系统下配置PCL库第一步之下载Visual Studio和Qt 5.15.2(超详细)
  • 腾讯云负载均衡增加访问策略后访问失败
  • 【Java EE进阶 --- SpringBoot】Spring DI详解
  • 内存中读写文件:设计原理与C/C++实现