HTTP协议
HTTP报文格式
- HTTP有两类报文:请求报文和响应报文
- HTTP是面向文本的,在报文中的每一个字段都是一些ASCII串
- HTTP请求报文和响应报文都是由三部分组成:
- 开始行:在请求报文中叫请求行,在响应报文中叫状态行
- 首部行:用来说明浏览器、服务器或者报文主体的一些信息
- 实体主体:在请求报文中叫请求主体,在响应报文中叫响应主体
HTTP请求报文中的方法
POST方法和PUT方法类似,区别在于POST是新增,PUT是更新,开发中用的比较多的是POST和GET
HTTP响应报文中的状态码
什么时候会出现502错误码
502错误码是服务器在充当网关或者代理时,应用服务器发生故障,nginx无法从应用服务器那收到响应,就会返回502给客户端
什么时候会发现504错误码
504错误码是服务器在充当网关或者代理时,应用服务器接口超时,nginx无法从应用服务器那收到响应,就会返回504给客户端
永久重定向和临时重定向区别
永久重定向:会记忆重定向后的URL,下次访问直接访问新的URL
临时重定向区:不会记忆重定向后的URL,下次访问仍要先访问旧的URL,再访问新的
代理服务器和内容分发网络
代理服务器
代理服务器也叫万维网缓存。代理服务器可以将最近请求过的资源的副本缓存在自己的存储空间
工作流程:
- 浏览器先与代理服务器建立TCP连接,向代理服务器发送HTTP请求
- 代理服务器收到HTTP请求后,检查本地缓存,如果有指定资源的副本就直接返回
- 否则向源服务器发送HTTP请求
- 源服务器向代理服务器返回指定的资源
- 代理服务器收到该资源后,自己存储一份副本,然后返回给客户端
什么是正向代理,什么是反向代理
- 正向代理是代理客户端,可以用来屏蔽客户端IP地址和避免网络浏览限制,以及阻止访问某些内容和缓存响应结果提高访问速度
- 反向代理是代理服务端,可以用来保护服务器,隐藏真实IP。以及负载均衡
CDN
- 内容缓存和分发:
CDN在全球多个节点上缓存静态内容(如图像、CSS、JavaScript 文件),将内容分发到离用户最近的节点,以减少延迟并加快加载速度。 - 负载分担:
通过将请求分发到多个缓存节点,CDN 可以减少源服务器的负载,从而提高整体系统的性能和可用性。 - 流量管理:
CDN可以处理大量的并发请求,尤其在高流量情况下,帮助减轻原始服务器的压力。
CDN不依赖用户在浏览器中配置代理服务器,而是依赖DNS将不同的HTTP请求定向到不同的代理服务器上
负载均衡
负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台云服务器(ECS实例)的流量分发控制服务。负载均衡扩展了应用的服务能力,增强了应用的可用性
负载均衡算法:
- 普通轮询:请求依次分配给服务器
- 加权轮询:根据权重比分配给服务器
- IP哈希:根据客户端IP地址的哈希值来确认分配的服务器
- URL哈希:根据请求的URL的哈希值来确认分配的服务器
- 最短响应时间:按照后端服务器的响应时间来分配,响应时间短的优先分配
- 最短连接:新请求会发送到并发连接最少的服务节点
HTTP的发展
HTTP/1.x
HTTP/1.0和HTTP1.1的主要区别:
- 长连接:HTTP1.1默认的行为是长连接。HTTP1.0也支持长连接,但是默认是短链接
- 请求管道化:HTTP1.1支持请求管道化,在一个持久连接上可以同时发送多个请求。而HTTP1.0不支持,请求和响应必须是串行的。但是HTTP1.1仍然要求服务器按顺序返回响应报文
- host字段:HTTP1.0没有host字段。HTTP1.1有,可以一个物理服务器承载多个域名或者站点
HTTP/2.0
HTTP/1.x存在的问题:
- 线头阻塞问题:服务器需要按序处理请求和返回响应报文,需要缓存多个请求,占用更多资源
- TCP并发连接数限制:利用多个TCP连接,并发访问服务器会消耗大量服务器资源
- 没有报文首部压缩方案:HTTP报文首部很多,但每次请求首部的变化通常不大
- 明文传输不安全:HTTP依赖传输层TLS协议才能实现加密传输
HTTP1.1和HTTP2.0的主要区别:
- 基于流的多路复用:HTTP/2引入了流的概念,每一对HTTP请求报文和响应报文被视为同一个流,在同一个TCP连接上实现了流的多路复用,不同流中的帧可以交错地发送给对方
- 二进制格式的帧和首部压缩:HTTP/2将HTTP/1的纯文本格式改成了二进制格式,提高了传输效率。并且用HPACK算法压缩了首部信息
- 服务器主动推送;比如客户端向服务器请求HTML文件时,会将相关的CSS文件也推送过来
- 增强安全性:主流浏览器公开宣布只支持加密的HTTP/2,并且HTTP/2对TLS的安全性做了进一步加强,比如HTTP/2通过黑名单机制禁用了几百种不再安全的加密算法和对TLS进行了扩展,开发了应用层协商协议ALPN
HTTP/3.0
HTTP2.0存在的问题:
- 线头阻塞问题没有完全解决:会有TCP队头阻塞的问题,tcp是基于字节流的,必须要解决粘包问题,因此如果有一个steam丢包必须要重传,直到全部的steam收到
- TCP建立连接的延迟问题:HTTP基于TCP实现,因此要先进行三次握手,有较大延迟
- 网络迁移需要重新连接:一个 TCP 连接是由四元组(源 IP 地址,源端口,目标 IP 地址,目标端口)确定的,这意味着如果 IP 地址或者端口变动了,就会导致需要 TCP 与 TLS 重新握手,这不利于移动设备切换网络的场景,比如 4G 网络环境切换成 WiFi
HTTP/3:HTTP/3就将传输层从TCP替换成了 UDP,并且UDP协议在应用层上实现了QUIC协议,来保证数据的可靠传输
QUIC协议的特点:
- 无队头阻塞:QUIC 连接上的多个 Stream 之间并没有依赖,都是独立的,某个流发生丢包了,只会影响该流,其他流不受影响
- 建立连接快:因为 QUIC 内部包含 TLS 1.3,因此仅需 1 个 RTT 就可以「同时」完成建立连接与 TLS 密钥协商,甚至在第二次连接的时候,应用数据包可以和 QUIC 握手信息(连接信息 + TLS 信息)一起发送,达到 0-RTT 的效果
- 连接迁移:,QUIC 协议没有用四元组的方式来“绑定”连接,而是通过「连接 ID 」来标记通信的两个端点,客户端和服务器可以各自选择一组 ID 来标记自己,因此即使移动设备的网络变化后,导致 IP 地址变化了,只要仍保有上下文信息(比如连接 ID、TLS 密钥等),就可以“无缝”地复用原连接,消除重连的成本
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 cloud_fly blog!