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://www.pswp.cn/pingmian/96040.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96040.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/96040.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【慢教程】Ollama4:ollama命令汇总

ℹ️教程说明 Ollama 是一款轻量级本地大模型部署工具&#xff0c;使用广泛&#xff0c;且容易上手&#xff0c;适合作为AI技术的入门。 &#x1f9e9;教程各部分链接&#xff1a; 第一课&#xff1a;ollama运行原理介绍及同类工具对比 ollama运行原理介绍及同类工具对比&am…

JAVA Predicate

简单来说&#xff0c;当我明确知道此次判断的逻辑时就可以直接使用if&#xff0c;但是我这次的判断逻辑可能会随着某个参数变化的时候使用Predicate比如当我想要判断某长段文字中是否包含list<String> 中的元素&#xff0c;并且包含的元素个数大于 list<String>最后…

什么是PFC控制器

一句话概括PFC控制器是一种智能芯片&#xff0c;它通过控制电路中的电流波形&#xff0c;使其与电压波形保持一致&#xff0c;从而减少电力浪费&#xff0c;提高电能的利用效率。PFC控制器IC的核心作用就是控制一颗功率MOSFET的开关&#xff0c;通过特定的电路拓扑&#xff08;…

【P03_AI大模型测试之_定制化 AI 应用程序开发】

git clone https://gitee.com/winner21/aigc-test.git 类似于joycoder的&#xff0c;可以安装在vscode上的通义灵码&#xff1a;https://lingma.aliyun.com/ 1、VSCODE上配置通义灵码 2、创建前后端文件&#xff0c;并引用AI编码代码 3、指定文件&#xff0c;利用AI进行代码优…

人工智能机器学习——决策树、异常检测、主成分分析(PCA)

一、决策树(Decision Tree) 决策树&#xff1a;一种对实例进行分类的树形结构&#xff0c;通过多层判断区分目标所属类别 本质&#xff1a;通过多层判断&#xff0c;从训练数据集中归纳出一组分类规则 优点&#xff1a; 计算量小&#xff0c;运算速度快易于理解&#xff0c;可…

服务器文件同步用哪个工具?介绍一种安全高效的文件同步方案

服务器作为企业核心数据和应用的载体&#xff0c;服务器文件同步已成为IT运维、数据备份、业务协同中不可或缺的一环。然而&#xff0c;面对多样的场景和严苛的需求&#xff0c;选择一个既高效又安全的服务器文件同步工具并非易事。本文将首先探讨服务器文件同步的常见场景、需…

LeetCode 004. 寻找两个正序数组的中位数 - 二分切分与分治详解

一、文章标题 LeetCode 004. 寻找两个正序数组的中位数 - 二分切分与分治详解 二、文章内容 1. 题目概述 题目描述&#xff1a;给定两个已按非降序排列的整数数组 nums1、nums2&#xff0c;设它们长度分别为 m 和 n&#xff0c;要求返回这两个数组合并后有序序列的中位数。…

预闪为什么可以用来防红眼?

打闪拍照红眼产生的原因 预闪可以用来防红眼&#xff0c;是基于人眼的生理特性和红眼现象的产生原理。在光线较暗时&#xff0c;人眼的瞳孔会放大。当使用闪光灯拍摄时&#xff0c;如果直接进行高强度闪光&#xff0c;由于瞳孔来不及缩小&#xff0c;闪光灯的光线会反射在眼球血…

Python程序使用了Ffmpeg,结束程序后,文件夹中仍然生成音频、视频文件

FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec&#xff0c;为了保证高可移植性和编解码质量&#xff0…

模块与包的导入

077-模块-06-模块搜索顺序_哔哩哔哩_bilibili 080-包-01-包的概念以及建立包的方式_哔哩哔哩_bilibili 088-文件操作-01-文件操作套路以及Python中的对应函数和方法_哔哩哔哩_bilibili 注&#xff1a; 1.import math和 from math import *区别 2. 模块&#xff08;Module…

Docker Compose 多种安装方式 (Alibaba Cloud Linux 3 环境)

Docker Compose 多种安装方式&#xff0c;适用于不同场景&#xff08;如依赖系统包管理器、使用 Python 工具链、集成 Docker 插件等&#xff09;。以下是常见的方案&#xff0c;尤其针对 Alibaba Cloud Linux 3 环境适配&#xff1a; 一、二进制包安装&#xff08;推荐&#…

Dubbo3序列化安全机制导致的一次生产故障

前言 记录一次 Dubbo 线上故障排查和原因分析。 线上 Dubbo 消费者启动有错误日志如下&#xff0c;但是不影响服务启动。 java.lang.TypeNotPresentException: Type org.example.model.ThirdParam not present ... Caused by: java.lang.ClassNotFoundException: org.example.m…

centos7 docker离线安装

介绍 本文主要讲了如何在完全没网的情况下安装docker&#xff08;适合于高网络安全要求的企业&#xff09; 本文适用的centos版本&#xff1a; [root0001 temp]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) 采用docker in docker下载依赖 实际试验后&…

东京本社招聘 | 财务负责人 多个日本IT岗位(Java/C++/Python/AWS 等),IT营业同步招募

大家好&#xff0c;本期为大家带来我司在东京GSD本社及其他会社千叶地区的招聘岗位。 涵盖 财务负责人、Java开发工程师、数据中心维护工程师、项目经理、IT营业 等多个职位。 欢迎有志之士加入&#xff01;&#x1f539; 财务负责人&#xff08;東京本社&#xff09;工作内容日…

四数之和

目录 一&#xff1a;题目链接 二&#xff1a;题目思路 三&#xff1a;代码实现 一&#xff1a;题目链接 理解题目需要注意&#xff0c;如果两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff0c;选择其中一个四元组即可。比如 [ 0 , 1 , 0 , 2] 和 [ 1 , …

【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架

Spring Cloud Task作为微服务架构中的轻量级任务调度框架&#xff0c;为开发人员提供了一种构建短生命周期微服务任务的便捷方式。它允许开发者快速创建、执行和管理一次性任务或短期批处理作业&#xff0c;任务执行完成后自动关闭以释放系统资源&#xff0c;避免了传统长期运行…

【1分钟速通】 HTML快速入门

HTML&#xff08;HyperText Markup Language&#xff0c;超文本标记语言&#xff09; 是构建网页的基础语言。它通过 标签&#xff08;Tag&#xff09; 来描述网页的结构和内容&#xff0c;常与 CSS&#xff08;负责样式 – <style></style>&#xff09;和 JavaScr…

【GeoServer】WMS GetFeatureInfo URL 逐个参数解释

我来把你构造的这个 WMS GetFeatureInfo URL 逐个参数解释一下&#xff0c;方便你理解&#xff1a;http://127.0.0.1:8090/geoserver/xxxx/wms? SERVICEWMS& VERSION1.1.1& REQUESTGetFeatureInfo& QUERY_LAYERSloess:yourLayer& LAYERSloess:yourLayer& …

OBS直播教程:点歌直播间怎么弄?直播点歌用什么软件?

OBS直播教程&#xff1a;点歌直播间怎么弄&#xff1f;直播点歌用什么软件&#xff1f; 第一步&#xff1a;安装OBS直播软件&#xff0c;如果你电脑已经安装了OBS&#xff0c;请直接看第二步 OBS直播软件下载地址①&#xff1a; https://d.obscj.com/obs-Studio-29.1.3-Full-…

【数据库】Redis详解:内存数据库与缓存之王

什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的、基于内存的数据结构存储系统&#xff0c;可以用作数据库、缓存和消息代理。它支持多种数据结构&#xff0c;如字符串、哈希、列表、集合、有序集合等&#xff0c;具有极高的性能和…