HTTP

HTTP-> 与 HTTP协议相关的所有应用层技术的总和

HTTP 专门用来在两点之间传输数据,不能用于广播、寻址或路由。
传输的是文字、图片、音频、视频等超文本数据。
浏览器是 HTTP 协议里的请求方,服务器是 HTTP 协议里的应答方,CDN 位于浏览器和服务器之间,主要起到缓存加速的作用(应用层);
Web Service 是网络服务实体,而 Web Server 是网络服务器,后者的存在是为了承载前者。
DNS 域名是 IP 地址的等价替代,需要用域名解析实现到 IP 地址的映射;DNS 是一个树状的分布式查询系统,但为了提高查询效率,外围有多级的缓存;
DNS 解析过程:浏览器缓存(dns) -> 操作系统缓存-> host文件-> dns服务器
URI 是用来标记互联网上资源的一个名字,由“协议名 + 主机名 + 路径”构成,俗称URL;
dns是用来解析uri中的域名部分,将人能够记住的域名解析为计算机能够认识的ip地址
HTTPS 相当于“HTTP+SSL/TLS+TCP/IP”,为 HTTP 套了一个安全的外壳;
SSL/TLS 是信息安全领域中的权威标准,采用多种先进的加密技术保证通信安全;

网络分层模型,

TCP/IP 分为四层,核心是二层的 IP路由 和三层的 TCP转发,HTTP 在第四层;
OSI 分为七层,基本对应 TCP/IP,TCP 在第四层,HTTP 在第七层;

HTTP报文

HTTP 报文可以没有 body,但必须要有 header,而且header 后也必须要有空行,形象地说就是“大头”必须要带着“脖子”;

请求头由“请求行 + 头部字段”构成,响应头由“状态行 + 头部字段”构成;、
请求行有三部分:请求方法,请求目标和版本号;
- 请求方法是对服务器的“指示”,真正应如何处理由服务器来决定;
状态行也有三部分:版本号,状态码和原因字符串;
- 状态码是十进制的三位数,分为五类,从 100 到 599;
2××类状态码表示成功,常用的有 200、204、206;
3××类状态码表示重定向,常用的有 301、302、304;
4××类状态码表示客户端错误,常用的有 400、403、404;
5××类状态码表示服务器错误,常用的有 500、501、502、503。

HTTP的数据类型和语言类型,

  • 数据类型MIME type表示实体数据的内容是什么,相关的头字段是Accept(客户端) 和 Content-Type(通用);
  • 语言类型表示实体数据的自然语言,相关的头字段是Accept-Language 和 Content-Language;
  • 数据编码表示实体数据的压缩方式,相关的头字段是Accept-Encoding 和 Content-Encoding;
  • 字符集表示实体数据的编码方式,相关的头字段是Accept-Charset 和 Content-Type;
  • 客户端需要在请求头里使用 Accept 等头字段与服务器进行“内容协商”,
    要求服务器返回最合适的数据;

HTTP 传输大文件的方法

  1. 压缩 HTML 等文本文件
  2. 分块传输。流式收发数据,节约内存和带宽,使用响应头字段“Transfer-Encoding: chunked”来表示,分块的格式是16进制长度头 + 数据块;
    数据里含有回车换行(\r\n)不影响分块处理,
  3. 范围请求可以只获取部分数据,实现视频拖拽或者断点续传,
    请求头字段“Range”,响应头字段“Content-Range”,响应状态码206;
    range是针对原文件的。
  4. 多范围请求。响应报文的数据类型是“multipart/byteranges”,body的多个部分会用boundary 字符串分隔。

HTTP特点

  1. HTTP 最大的优点是简单、灵活和易于扩展;
  2. HTTP 是无状态的,可以轻松实现集群化,扩展性能
  3. HTTP 是明文传输,容易被黑客窃听或窜改;
  4. HTTP 是不安全的,无法验证通信双方的身份,

HTTP的连接管理

HTTP/1.1 默认启用长连接,在一个连接上收发多个请求响应,提高传输效率;
服务器会发送“Connection: keep-alive”字段表示启用了长连接;
报文头里如果有“Connection: close”就意味着长连接即将关闭;
过多的长连接会占用服务器资源,规避方式是设置timeout和最多连接次数keepalive_requests,不符合条件的都断开长连接。

HTTP的重定向和跳转

重定向是服务器发起的跳转,要求客户端改用新的 URI重新发送请求,通常会自动进行,用户是无感知的; 
301/302 是最常用的重定向状态码,响应头字段 Location 指示了要跳转的 URI
使用重定向时需要当心性能损耗,还要避免出现循环跳转。

HTTP的Cookie机制

Cookie 是服务器委托浏览器存储的一些数据,让服务器有了“记忆能力”,最基本的用途是身份识别,实现有状态的会话事务。
响应报文使用 Set-Cookie 字段发送“key=value”形式的 Cookie 值;
请求报文里用 Cookie 字段发送多个 Cookie 值;使用分隔符“;”
保护 Cookie方法:设置有效期、作用域等属性,常用的有 Max-Age、ExpiresDomain、HttpOnly 等;
缺点:安全性问题,信息容易泄露

HTTP的缓存控制

缓存是优化系统性能的重要手段,HTTP 传输的每一个环节中都可以有缓存;
浏览器收到数据就会存入缓存,如果没过期就可以直接使用,过期就要去服务器验证是否仍然可用;

  • 强缓存:响应头expires<“Cache-Control:max-age”表示资源的有效期;
    请求头“Cache-Control”字段“max-age=0”或“no_cache”可以刷新数据。
  • 协商缓存:响应头字段:“Last-modified”<“ETag”验证资源是否被修改
    请求头字段:If-Modified-Since或者If-None-Match验证资源是否失效

HTTP的代理服务

HTTP 代理就是客户端和服务器通信链路中的一个中间环节,为两端提供“代理服务”,以实现负载均衡、安全防护、数据过滤等功能;
字段“Via”:标记代理服务器的身份,多个代理会形成一个列表;
字段“X-Forwarded-For”和“X-RealIP”:客户端的真实 IP 地址
代理协议”:不改动原始报文的情况下传递客户端的真实IP。
缺点:耗费性能,

HTTP的缓存代理

缓存代理是增加了缓存功能的代理服务,缓存源服务器的数据,分发给下游的客户端;
字段“Cache-Control”:private/s-maxage/no-transform/max-stale(可以接受的过期时间)min-fresh(可以接受的新鲜时间);必须搭配“Last-modified”“ETag”等字段
Purge缓存清理”

HTTPS

HTTPS相对于HTTP具有机密性,完整性,身份认证和不可否认的特性

  • 机密性->TLS混合加密
    对称加密只使用一个密钥,速度快,常用的有 AES 和 ChaCha20;
    不安全:协商密钥时密钥在传输过程中极易被窃取,
    非对称加密使用两个密钥:公钥和私钥,安全性高,常用的有 RSA 和 ECC;
    把对称加密和非对称加密结合起来就得到了“又好又快”的混合加密
  • 完整性-> 摘要算法能够为数据生成独一无二的“指纹”,常用的算法是 SHA-2
  • 身份认证和不可否认 -> 数字签名是私钥对摘要的加密,由公钥解密后验证
    公钥的分发需要数字证书,必须由 CA 的信任链来验证.作为信任链的源头 CA 有时也会不可信,解决办法有 CRL、OCSP,还有终止信任。

???HTTPS/TLS握手

HTTPS 协议会先与服务器执行 TCP 握手,然后执行 TLS 握手,才能建立安全连接;
TLS 包含几个子协议,由几个不同职责的模块组成,比较常用的有记录协议、警报协议、握手协议、变更密码规范协议等。
握手的目标是安全地交换对称密钥,需要三个随机数,第三个随机数“Pre-Master”必须加密传输,绝对不能让黑客破解;

  • RSA握手流程:

迁移到 HTTPS

首先要申请数字证书,可以选择免费好用的“Let’s Encrypt”
选择恰当的 TLS 版本和密码套件,强化安全;
原有的 HTTP 站点可以保留作为过渡,使用 301 重定向到 HTTPS。

HTTP/2 的一些重要特性

使用“HPACK”算法压缩头部信息,消除冗余数据节约带宽;
使用二进制“帧”传输消息
流是帧的双向传输序列,使用虚拟的“流”传输消息,(并发多个流)实现了多路复用,解决了“队头阻塞”问题;
增强了安全性,要求至少是 TLS1.2,也禁用了很多不安全的密码套件。

HTTP/3

HTTP/3 基于 QUIC 协议,完全解决了“队头阻塞”问题,
QUIC 是一个新的传输层协议,基于UDP,提高传输效率;
内含TLS1.3,只能加密通信,支持 0-RTT 快速建连;
QUIC 的流与 HTTP/2 的流很相似,但分为双向流和单向流;
QUIC 的连接使用“不透明”的连接 ID,,支持“连接迁移”

分解HTTP性能优化

  • 服务器的性能优化方向:
    合理利用系统资源,提高服务器的吞吐量和并发数,降低响应时间。
  • 客户端的HTTP 性能优化:
    降低延迟:等待数据到达客户端时所花费的时间。影响因素有带宽、DNS 查询、TCP 握手等;
  • 传输链路优化:
    分为三个部分,能够优化的是前两个部分,也就是“第一公里”和“中间一公里”
    增加带宽降低延迟,优化传输速度。

Nginx

Nginx 是一个高性能的 Web 服务器,它非常的轻量级,消耗的 CPU、内存很少;
采用“master/workers”进程池架构,不使用多线程,消除了进程、线程切换的成本;
基于 epoll 实现了“I/O 多路复用”,不会阻塞
使用“职责链”模式,多个模块分工合作,自由组合,以流水线的方式处理HTTP 请求。
Nginx 依赖于磁盘上的静态配置文件,修改后必须重启才能生效,缺乏灵活性;

OpenResty

基于 Nginx,打包了很多有用的模块和库,是一个高性能的 Web 开发平台;
工作语言是 Lua,它小巧灵活,执行效率高,支持“代码热加载”
核心编程范式是“同步非阻塞”,使用协程,不需要异步回调函数;
也使用“阶段式处理”的工作模式,配合 Redis 等外部数据库能够实现各种动态配置。

网络应用防火墙WAF

Web 服务通常都运行在公网上,容易受到“DDoS”、“代码注入”等各种黑客攻击
WAF 是一种“HTTP 入侵检测和防御系统”,工作在七层,为 Web 服务提供全面的防护;
WAF 实质上是模式匹配与数据过滤,所以会消耗 CPU,增加一些计算成本,降低服务能力,使用时需要在安全与性能之间找到一个“平衡点”。

cdn

CDN 让用户就近访问专网里的边缘节点,降低了传输延迟,实现了网站加速;
缓存系统是 CDN 的“心脏”,使用 HTTP 缓存代理技术,缓存命中就返回给用户,否则就要回源。

WebSocket

web含义-主要运行环境是浏览器,在使用习惯上尽量向 HTTP靠拢
WebSocket 是一个“全双工”的通信协议,相当于对 TCP 做了一层薄薄的包装
WebSocket 延用了 HTTP 的URI 格式,,但定义了新的协议名“ws”和“wss”,端口号也沿用了 80 和 443;
WebSocket 利用HTTP本身的“协议升级”特性,实现握手
WebSocket 使用二进制帧传输数据,结构简单,但客户端发数据必须掩码,服务器则不用;

  • WebSocket 主要解决双向通信、全双工问题,HTTP/2 主要解决传输效率的问题,定义“流”,“多路复用”“优先级”等特性
posted @ 2021-12-27 23:32  忘川酒  阅读(114)  评论(0编辑  收藏  举报