3.HTTP/HTTPS:报文格式、技巧、状态码、缓存、SSLTLS握手

news/2025/9/24 21:05:40/文章来源:https://www.cnblogs.com/yxysuanfa/p/19109975

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 == '': # 空行,头部结束
break
if ': ' 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查询支持方法

重点

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. 强缓存

浏览器直接判断缓存是否过期,未过期则直接使用本地缓存,不发请求到服务器

2. 协商缓存

浏览器发现缓存已过期,发送请求询问服务器资源是否还能用。如果可用,服务器返回304,浏览器继续用缓存。

  • 请求/响应头
    • Last-Modified (服务器告知的资源最后修改时间) / If-Modified-Since (浏览器再次询问时带上的时间)
    • Etag (服务器告知的资源唯一标识,如哈希值) / If-None-Match (浏览器再次询问时带上的标识,优先级更高)

缓存流程

graph TD
A[浏览器请求资源] --> B{是否有缓存?}
B -- 无 --> C[直接向服务器请求]
B -- 有 --> D{强缓存是否过期?}
D -- 未过期 --> E[直接使用磁盘缓存]
D -- 已过期 --> F[携带If-None-Match/If-Modified-Since向服务器发起验证]
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.mzph.cn/news/916239.shtml

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

相关文章

keepalived服务器

keepalived服务器keepalived高可用原理:搭建主、备服务器一样配置,在keepalived中配置相同的vip;主服务器发送“心跳消息”给备服务器,主服务器宕机,“心跳消息”停止发送,备服务器会让vip生效,产生“IP漂移”,…

外部 Tomcat 部署详细 - 实践

外部 Tomcat 部署详细 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco"…

20231326《密码系统设计》第三周预习报告

20231326《密码系统设计》第三周预习报告20231326《密码系统设计》第三周预习报告 目录20231326《密码系统设计》第三周预习报告学习内容《Head First C 嗨翻 C 语言》第4章《Windows C/C++加密解密实战》第4章AI 对学…

吉林网站开发公司网站首页设计html代码

作者| Rohan Wadiwala、Mangesh More翻译 | 天道酬勤,编辑 | Carol出品| CSDN云计算(ID:CSDNcloud)在分析的世界中,网站的每次点击都是数据分析的候选对象,显然,这会涉及大量的数据生成。对于海…

做普工招聘网站上海汽车设计公司名单

静态长效代理IP和动态短效代理IP是两种常见的代理IP类型,它们在用途和适用场景上存在一定的差异。了解它们的特性以及使用场景有助于我们更好地利用代理IP,提高网络访问的效率和安全性。 一、静态长效代理IP 1. 用途 静态长效代理IP是指长期保持稳定的代…

深圳做网站专业的公司如何做英文网站推广

来源:数码之家文 | 禅哥这台机器在本人的eBay收藏夹里呆了很久,某日无意间扫了一眼收藏夹,突然发现卖家大降价,只要15刀,还有best offer选项。15刀你买不了吃亏,15刀你买不了上当。事不宜迟果断下手。根据非…

天津星创网站建设有限公司微信小商店分销系统

977. 有序数组的平方y 思路,原数组是有序的,但是因为负数平方后可能变无序了,因此利用双指针遍历原数组,比较 nums[left]*nums[left]和nums[right]*nums[right]谁更大,然后对新数组赋值 class Solution {public int…

FortiGate连接中国联通SDWAN

最近上线SAP,需要使用公司飞塔防火墙连接中国联通SDWAN,记录下过程吧。 飞塔防火墙型号F200E,有2条互联网带宽,需要分别与联通建立IPSEC+BGP连接。 联通会提供2个IPSEC配置信息+2个BGP配置信息 1,在飞塔完成2条IP…

第五章 运算符、表达式和语句

本章将介绍以下内容: 1、关键字——while、typedef; 2、运算符——=、-、*、/、%、++、--; 3、C语言的各种运算符,包括用于普通数学运算的运算符; 4、运算符优先级以及语句、表达式的含义; 5、while循环; 6、复…

wordpress 淘宝客网站模板平面设计与网页设计

Hi1102A和Hi1105V500都是属于海思旗下的两款WIFIBTGNSSFM四功能一体(江湖俗称四合一)高性能方案,应该可以推出,这个原本是在手机方案集成使用的,本身海思有视频安防主控HI315X系列平台,如果搭配上自己的无线phy芯片,一…

广州网站建设 易企建站公司网站开发和运营合同分开签么

以前的大部分程序都是操作Chrome,很少有操作Edge,现在以Edge为例。 Selenium本身是无法直接控制浏览器的,不同的浏览器需要不同的驱动程序,Google Chrome需要安装ChromeDriver、Edge需要安装Microsoft Edge WebDriver&#xff0c…

【Golang】素材设计模式

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

学习问题日记-2

在开发过程中遇到了一个问题,报错描述如下:java: 无法将类 com.chools.demo.entity.Address中的构造器 Address应用到给定类型; 需要: 没有参数 找到: java.lang.String,java.lang.String,java.lang.String …

樟树网站制作wordpress在线音乐

电脑的设备驱动程序:驱动程序一般指的是设备驱动程序(DeviceDriver),是一种可以使计算机和设备通信的特殊程序。相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,如某设备的驱动程序未能正确安装&a…

封神台复现

EzPyeditor这个界面没啥东西,直接下载源码看一下进去看一下app.py熟悉的界面,又是他 这里先去追踪一下这个函数parse这里这个函数大体上来说是存在一个文件读取的漏洞的 这个漏洞会接受filename这个参数 这里我们就可…

北京商城网站建设费用企业网页如何制作

在window下,我们一般用Source Insight来查看代码而在linux下,使用vim来查看代码,vim是一个简单的文本浏览/编辑器,它可以通过插件的形式,搭建一个完全的类Source Insight环境,通过快捷键的形式,快速查看、定位变量/函数,本文就是基于vim,通过ctags+cscope+taglist+Ner…

网站建设与维护试卷做网站 十万

Mybatis:一对一查询映射处理 前言一、概述二、创建数据模型三、 问题四、解决方案1、方案一:级联方式处理映射关系2、方案二:使用association处理映射关系3、方案三:分步查询 前言 本博主将用CSDN记录软件开发求学之路上亲身所得…

教育网站开发用例图宁波建设网表格

我的方案如下:>单击按钮时,客户端将向服务器端发送请求>一旦服务器端收到请求,它将向远程服务器发送另一个请求以获得结果>一旦响应到来,服务器端应该回应客户端的响应.客户$.post(login_server.php{act:"post",phone:phone,passwords:passwords…

品牌网站建设S苏州未来产品设计

目录 uni-app 项目目录结构 生命周期 路由 路由跳转 页面栈 条件编译 文本渲染 样式渲染 条件渲染 遍历渲染 事件处理 事件修饰符 uni-app 项目目录结构 组件/标签 使用(类似)小程序 语法/结构 使用vue 具体项目目录如下: 生命…

李之一的Java第一作

李之一的Java第一作package com.lixuan.houhou; public class SxisuArray { public static void main(String[] args) { //稀疏数组 :创建一个二维数组11*11 0:没有棋子 1:黑棋 2:白棋 int[][] array1 = new int…