HTTP学习
HTTP知识
01. 经典五层模型
- 应用层
- 为应用软件提供了很多服务,构建于协议之上。
- 传输层
- 数据的传输都是在这层定义的,数据过大分包,分片。
- 网络层
- 为数据在节点之间传输创建逻辑链路
- 数据链路层
- 通讯实体间建立数据链路连接
- 物理层
- 主要作用是定义物理设备如何传输数据(光缆,网线)
02. HTTP协议的发展历史
-
http0.9 :
- 只有一个命令GET,没有header等描述数据的信息,服务器发送完毕,就关闭tcp协议。
-
http1.0:
- 增加了请求命令(GET, POST 和 HEAD)
- status code
- header
- 多字符集支持
- 权限
- 缓存
- 内容编码
- 多部分发送
缺点:
HTTP/1.0 版的主要缺点是,每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接。
TCP连接的新建成本很高,因为需要客户端和服务器三次握手,并且开始时发送速率较慢。所以HTTP 1.0版本的性能比较差。随着网页加载的外部资源越来越多,这个问题就愈发突出了。
为了解决这个问题,有些浏览器在请求时,用了一个非标准的Connection字段。
Connection: keep-alive
这个字段要求服务器不要关闭TCP连接,以便其他请求复用。服务器同样回应这个字段。
一个可以复用的TCP连接就建立了,直到客户端或服务器主动关闭连接。但是,这不是标准字段,不同实现的行为可能不一致,因此不是根本的解决办法。
-
http1.1:
- 增加了请求命令(OPTIONS、PUT、PATCH、DELETE、TRACE 、CONNECT)
- 持久连接
- 增加host
缺点:
虽然1.1版允许复用TCP连接,但是同一个TCP连接里面,所有的数据通信是按次序进行的。服务器只有处理完一个回应,才会进行下一个回应。要是前面的回应特别慢,后面就会有许多请求排队等着。这称为队头堵塞
为了避免这个问题,只有两种方法:
- 减少请求数
- 同时多开持久连接
这导致了很多的网页优化技巧,比如合并脚本和样式表、将图片嵌入CSS代码、域名分片(domain sharding)等等。如果HTTP协议设计得更好一些,这些额外的工作是可以避免的。
-
spdy协议: 谷歌自行研发, 主要解决http1.1效率不高的问题,被当做http2的基础,主要特性都被http2继承
-
http2:
- 二进制传输
- 信道复用
- 分帧传输
- server push
03. HTTP三次握手
第一次握手: 发送SYN报文,传达信息:“你好,我想建立连接”
第二次握手: 回传SYN+ACK报文,传达信息:“好的,可以建立链接”;
第三次握手: 回传ACK报文,传到信息:“好的,我知道了,那我们连接”。然后就建立连接了
TCP为什么要进行三次握手:
因为网络传输有延迟,客户端发送请求到服务器端要求建立连接,如果服务器端直接返回的话可能会产生丢包的情况导致客户端接收不到数据,客户端会因为超时就关闭了,可能就去发送新的请求了,然而服务端并不知道丢包导致客户端没有接收数据,服务端端口就一直开着,造成了额外的开销。所以需要三次握手确认这个过程。
04. HTTP四次挥手
第一次挥手: 客户端 和 服务器 打电话,通话即将结束后
第二次挥手: 客户端说“我没啥要说的了”,服务器回答“我知道了”,但是 服务器 可能还会有要说的话
第三次挥手: 客户端 不能要求 服务器 跟着自己的节奏结束通话,于是 服务器 可能又巴拉巴拉说了一通,最后 服务器 说“我说完了
第四次握手: 客户端 回答“知道了”,这样通话才算结束。
TCP为什么要进行四次握手:
因为数据传送结束后发出连接释放的通知,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放通知,对方确认后就完全关闭了TCP连接。
05. HTTP报文
-
请求报文
-
响应报文
HTTP请求方法
-
用来定义对于资源的操作
-
常用有GET、POST等
-
从定义上讲有各自的语义
HTTP状态码
- 定义服务器对请求的处理结果
- 各个区间的code有各自的语义
- 好的http服务可以通过status code判断结果
注意:
301 永久跳转(走缓存)
302 临时跳转
06. 跨域(CORS)
-
什么是跨域
- 浏览器的同源策略限制了跨域请求资源
-
jsonp跨域
-
跨域的限制(预请求)
-
默认跨域允许的方法只有get、post、head,其它的方法不允许
'Access-Control-Allow-Methods': 'POST,PUT,DELETE', // 设置通过请求的方法
-
默认允许Content-type以下3个,其它预请求验证,通过才能发送
- text/plain
- multipart/form-data
- application/x-www-form-urlencoded
-
请求头限制,自定义的请求头是不允许,预请求验证通过才能发送
'Access-Control-Allow-Headers':'X-Test-Cors', // 设置通过自定义的请求头 'Access-Control-Max-Age':'1000' // Methods和Headers的结果可以被缓存多久
-
07. Cache-Control
-
可缓存性
- public 任何都可以
- private 只有它发起浏览器可以缓存
- no-cache 去服务端验证才能使用
- no-store 彻底不能
- no-transform 代理服务器不能改动返回内容
-
到期时间(seconds)
- max-age = < seconds > 最大时间
- s-maxage = < seconds > 只有在代理服务器才会生效
- max-stale = < seconds > 只能在发起端设置 就算max-age时间过期 max-stale时间没过期也会走缓存
-
重新验证(了解)
- must-revalidate
- proxy-revalidate
-
验证头 (不走本地缓存 发送请求带上验证头 验证决定走不走缓存 它基于no-cache的情况)
-
last-Modified
- 配合If-Modified-Since或者If-Unmodified-Since使用
- 对比上次修改时间以验证资源是否需要更新
-
Etag
-
数据签名
-
配合if-Match或者if-Non-Match使用
-
对比资源的签名判断是否使用缓存
-
-
08. Cookie
用法:
- 通过Set-Cookie设置
- 下次请求会自动带上
- 键值对,可以设置多个
属性:
- max-age 和 expires设置过期时间
- Secure只在https的时候发送
- HttpOnly无法通过document.cookie访问
09. HTTP长连接
- TCP connection
- Connection: keep-alive/close(开启/关闭)
- HTTP2只需要建立一个TCP长连接 (同域下)
10. 数据协商:
-
请求
-
Accept 什么类型
-
Accept-Encoding 压缩方式
-
Accept-Language 语言
-
user-Agent 浏览器信息
-
-
返回
- Content-type
- Content-Encoding
- Content-Language
11. CSP(内容安全策略)
-
限制方式
Content-Security-Policy :‘default-src’
-
资源类型
'Content-Security-Policy': 'script-src \'self\'; form-action \'self\'; report-uri /report'
12. HTTPS
-
http 是明文传输
-
https 通过握手进行加密
- 加密-公钥
- 解密-私钥
- 客户端请求服务器获取
证书公钥
- 客户端(SSL/TLS)解析证书(无效会弹出警告)
- 生成随机值
- 用
公钥加密
随机值生成密钥 - 客户端将
秘钥
发送给服务器 - 服务端用
私钥
解密秘钥
得到随机值 将信息和随机值混合在一起
进行对称加密- 将加密的内容发送给客户端
- 客户端用
秘钥
解密信息
13. HTTP2
-
二进制协议
- http1.1头信息必须是字符,数据体可以是文本,也可以是二进制
- http2 全部都是二进制
-
头信息压缩
- 头部信息一样的变相缓存
-
信道复用
- 同一个连接里面发送多个请求不再需要按照顺序来
-
数据流
- http1.1版取消数据流的唯一方法,就是关闭TCP连接。
- http2 可以取消某一次请求,同时保证TCP连接还打开着,可以被其他请求使用。
-
服务器推送
-
Http2 服务端可以推送,主动向客户端发送请求
http1 解析html页面里面css、js文件, 需要解析到css和js文件发送请求等数据回来渲
http2 解析html里面建立连接,如果有css、js文件,服务端会主动推送到客户端
不再发送请求获取css、js文件
-
浏览器目前是必须开启https 才能使用http2
-
HTTP 和 HTTP2 对比演示的demohttps://http2.akamai.com/demo
14. HTTP3(了解)
15. Nginx 配置
-
配置nginx
-
配置代理缓存
-
配置https
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cert.pem
-
配置http2
16. 面试题
-
为什么传统上利用多个域名来提供网站资源会更有效
-
Long-Polling、Websockets、Server-Sent Event(SSE)、WebRTC
-
常见的请求头和响应头
-
和缓存有关的
HTTP
首部字段(非常重要) -
HTTP method
-
HTTP 状态码
-
HTTPS 加密过程
-
HTTP2新特性(重要)
-
三次握手四次挥手(重要)
证书秘钥
openssl req -x509 -newkey rsa:2048 -nodes -sha256 -keyout localhost-privkey.pem -out localhost-cert.pem
相关文章:

HTTP学习
HTTP知识 01. 经典五层模型 应用层 为应用软件提供了很多服务,构建于协议之上。 传输层 数据的传输都是在这层定义的,数据过大分包,分片。 网络层 为数据在节点之间传输创建逻辑链路 数据链路层 通讯实体间建立数据链路连接 物理层 主要作用…...

go语言实现IP归属地查询
效果: 实现代码main.go package mainimport ("encoding/json""fmt""io/ioutil""net/http""os" )type AreaData struct {Continent string json:"continent"Country string json:"country"ZipCode …...
一站式解决技术平台访问难题:合规优化方案助力高效开发(2025 最新)
摘要 在技术开发与协作中,GitHub 等国际平台的访问效率及国内社区的使用体验常受网络环境影响。本文严格遵循网络安全规范,聚焦本地化 DNS 优化、官方镜像加速、浏览器工具提效等合规技术,提供覆盖国内外技术平台的访问优化方案,…...

Android RxJava框架分析:它的执行流程是如何的?它的线程是如何切换的?如何自定义RxJava操作符?
目录 RxJava是什么?为什么使用。RxJava是如何使用的呢?RxJava如何和Retrofit一起使用。RxJava源码分析。 (1)他执行流程是如何的。(2)map(3)线程的切换。 如何自定义RxJava操作符…...

MySQL及线程关于锁的面试题
目录 1.了解过 MySQL 死锁问题吗? 2.什么是线程死锁?死锁相关面试题 2.1 什么是死锁: 2.2 形成死锁的四个必要条件是什么? 2.3 如何避免线程死锁? 3. MySQL 怎么排查死锁问题? 4.Java线上死锁问题如…...
前端vue+elementplus实现上传通用组件
上传组件: <template><div class"upload-file"><el-uploadmultiple:action"uploadFileUrl":before-upload"handleBeforeUpload":file-list"fileList":limit"limit":on-error"handleUploadE…...
联合类型的逻辑或关系与类型保护
在 TypeScript 中,联合类型(Union Types)是一种强大的类型工具,它允许一个变量可以是几种不同类型中的一种。联合类型通过逻辑“或”关系(|)连接多个类型。这种类型的灵活性使得我们能够处理多样化的数据输…...
spring boot3.0自定义校验注解:文章状态校验示例
文章目录 Spring Boot 自定义校验注解:状态校验示例一、创建 State 注解步骤:1. 创建自定义注解:2. 实现校验逻辑: 二、 实现自定义校验步骤:1. 在实体类中使用自定义校验注解 State:2. 添加 State 注解: 总…...
神经网络是如何工作的
人工智能最核心的技术之一,就是神经网络(Neural Networks)。但很多初学者会觉得它是个黑盒:为什么神经网络能识别图片、翻译语言,甚至生成文章? 本文用图解最小代码实现的方式,带你深入理解&am…...

【工作记录】crmeb后端项目打开、运行
1、下载代码 1)安装git 不再详述 2)git拉代码 项目地址如下,在vscode-分支中拉代码 # 克隆项目 git clone https://gitee.com/ZhongBangKeJi/crmeb_java/ 截图如下是已经成功拉下来 注意安装对应版本 2、maven配置 安装配置见&#x…...

智能手表测试计划文档(软/硬件)
📄 智能手表测试计划文档(软/硬件) 项目名称:Aurora Watch S1 文档编号:AW-S1-QA-TP-001 编制日期:2025-xx-xx 版本:V1.0 编写人:xxx(测试主管) 一、测试目标…...
DeepSeek:开启能源领域智能化变革新时代
目录 一、DeepSeek 与能源领域变革的邂逅1.1 DeepSeek 在人工智能领域的地位与特点1.2 能源行业面临的挑战与变革需求1.3 DeepSeek 在能源领域应用的重要性和意义 二、能源政策解读与科普新助手2.1 能源政策解读的深度变革2.2 能源科普的创新使者 三、能源项目可行性分析新利器…...
红黑树算法笔记(二)性能对比实验
文章目录 1. 实验目标2. 对比数据结构3. 性能指标3.1 时间性能指标3.2 空间性能指标3.3 其他性能指标 4. 测试场景4.1 数据集特性变化4.2 操作模式变化4.3 环境因素变化 5. 实验设计5.1 基准测试设计5.1.1 CRUD性能基准测试5.1.2 混合负载测试5.1.3 范围查询测试 5.2 特殊场景测…...
Nlog适配达梦数据库进行日志插入
前言 原来使用的是SQLServer数据库,使用Nlog很流畅,没有什么问题。现在有个新项目需要使用麒麟操作系统和达梦数据库,业务流程开发完成之后发现Nlog配置文件中把数据库连接内容修改之后不能执行插入操作。 原Nlog.config配置 <?xml ve…...

k8s监控方案实践(三):部署与配置Grafana可视化平台
k8s监控方案实践(三):部署与配置Grafana可视化平台 文章目录 k8s监控方案实践(三):部署与配置Grafana可视化平台一、Grafana简介1. 什么是Grafana?2. Grafana与Prometheus的关系3. Grafana应用场…...

嵌入式系统架构验证工具:AADL Inspector v1.10 全新升级
软件架构建模与早期验证是嵌入式应用的关键环节。架构分析与设计语言(AADL)是专为应用软件及执行平台架构模型设计的语言,兼具文本与图形化的双重特性。AADL Inspector是一款轻量级的独立工具: 核心处理能力包括 √ 支持处理AA…...

STM32-模电
目录 一、MOS管 二、二极管 三、IGBT 四、运算放大器 五、推挽、开漏、上拉电阻 一、MOS管 1. MOS简介 这里以nmos管为例,注意箭头方向。G门极/栅极,D漏极,S源极。 当给G通高电平时,灯泡点亮,给G通低电平时&a…...

华为云Flexus+DeepSeek征文|从开通到应用:华为云DeepSeek-V3/R1商用服务深度体验
前言 本文章主要讲述在华为云ModelArts Studio上 开通DeepSeek-V3/R1商用服务的流程,以及开通过程中的经验分享和使用感受帮我更多开发者,在华为云平台快速完成 DeepSeek-V3/R1商用服务的开通以及使用入门注意:避免测试过程中出现部署失败等问…...

鸿蒙NEXT开发动画案例5
1.创建空白项目 2.Page文件夹下面新建Spin.ets文件,代码如下: /*** TODO SpinKit动画组件 - Pulse 脉冲动画* author: CSDN—鸿蒙布道师* since: 2024/05/09*/ ComponentV2 export struct SpinFive {// 参数定义Require Param spinSize: number 48;Re…...
面试篇:Spring MVC
基础概念 什么是Spring MVC? Spring MVC 是 Spring Framework 提供的一个基于 Servlet 的 Web 框架,属于 MVC(Model-View-Controller)架构的一种实现。它通过 DispatcherServlet 作为前端控制器,对请求进行分发和调度…...

ctfshow——web入门351~356
SSRF没有出网的部分 web入门351 $ch curl_init($url); 作用:初始化一个 cURL 会话,并设置目标 URL。解释: curl_init($url) 创建一个新的 cURL 资源,并将其与 $url 关联。这里的 $url 是用户提供的,因此目标地址完全…...
C++中六个特殊成员函数的关系
C中六个特殊成员函数的关系 C11之后的版本每个类有六个特殊的成员函数,之所以特殊是因为它们可以在各种情况下由编译器自动提供; 默认构造函数、复制构造函数、复制赋值运算符、析构函数、移动构造函数、移动赋值运算符 关系规则: 1、如果…...

【PostgreSQL数据分析实战:从数据清洗到可视化全流程】金融风控分析案例-10.1 风险数据清洗与特征工程
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 PostgreSQL金融风控分析案例:风险数据清洗与特征工程实战一、案例背景:金融风控数据处理需求二、风险数据清洗实战(一)缺失值…...

美女热舞混剪视频批量剪辑生产技术实践:智能处理与原创性提升方案解析
一、引言:短视频工业化生产的技术转型 在美女类短视频内容运营中,通过标准化技术流程实现「高质量、规模化」产出成为核心需求。本文结合实战经验,解析如何通过智能素材重组、AI 语音合成、动态元素叠加等技术手段,构建自动化生产…...
破局智算瓶颈:400G光模块如何重构AI时代的网络神经脉络
一、技术演进与市场需求双重驱动 在数字化转型浪潮下,全球互联网流量正以每年30%的复合增长率持续攀升。根据Dell’Oro Group最新报告,2023年400G光模块市场规模已突破15亿美元,预计2026年将占据数据中心光模块市场60%以上份额。这种爆发式增…...
python标准库--collections - 高性能数据结构在算法比赛的应用
目录 一、deque双端队列 1.头部删除元素popleft() 2.BFS(广度优先搜索)优化 3.滑动窗口(双指针) 4.实现栈或队列 5. 双向遍历与操作 一、deque双端队列 特点:支持两端 O (1) 时间复杂度的…...

神经网络基础-从零开始搭建一个神经网络
一、什么是神经网络 人工神经网络(Articial Neural Network,简写为ANN)也称为神经网络(NN),是一种模仿生物神经网络和功能的计算模型,人脑可以看做是一个生物神经网络,由众多的神经元连接而成,各个神经元传递复杂的电信号,树突接收到输入信号,然后对信号进行处理,通…...
【Go】优化文件下载处理:从多级复制到零拷贝流式处理
在开发音频处理服务过程中,我们面临一个常见需求:从网络下载音频文件并保存到本地。这个看似简单的操作,实际上有很多优化空间。本文将分享一个逐步优化的过程,展示如何从一个基础实现逐步改进到高效的流式下载方案。 初始实现&a…...
Java 显式锁与 Condition 的使用详解
Java 显式锁与 Condition 的使用详解 在多线程编程中,线程间的协作与同步是核心问题。Java 提供了多种机制来实现线程同步,除了传统的 synchronized 关键字外,ReentrantLock 和 Condition 是更灵活且功能强大的替代方案。本文将详细介绍显式…...
android ViewModel liveData无法监听之多线程下activityViewModels不安全
我们一般的,会遇到liveData无法监听到结果,可能存在主要2种可能: liveData没有正确注册;liveData连续多次设置值,中间的值,会被丢弃,但最后一次是能监听到的。 但是我们容易忽略一种case&…...