http1.1/http2/http3 说明以及 nginx 实现 http2

本贴最后更新于 1352 天前,其中的信息可能已经时过境迁

概述

摘自百度百科:

超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的 WWW 文件都必须遵守这个标准。设计 HTTP 最初的目的是为了提供一种发布和接收 HTML 页面的方法。

HTTP 属于 OSI 网络七层协议模型中的"最上层":应用层。由请求和响应构成,是一个标准的客户端服务器模型。HTTP 是一个无状态的协议。

HTTP 默认端口号为 80。它也可以承载在 TLS 和 SSL 之上,通过加密、认证的方式实现数据传输的安全,称为 HTTPS,HTTPS 默认端口号为 443。

早期 HTTP 用于传输网页 HTML 文件,发展到现在,应用变得广泛,客户端软件(PC,Android,iOS 等)大部分通过 HTTP 传输数据。

HTTP1.1

发布于 1997 年

持久连接(persistent connection),即 TCP 连接默认不关闭,可以被多个请求复用,不用声明 Connection: keep-alive。解决了 1.0 版本的 keepalive 问题,1.1 版本加入了持久连接,一个 TCP 连接可以允许多个 HTTP 请求;

加入了管道机制,在同一个 TCP 连接里,允许多个请求同时发送,增加了并发性,进一步改善了 HTTP 协议的效率,虽然允许复用 TCP 连接,但是同一个 TCP 连接里面,所有的数据通信是按次序进行的。;

新增了请求方式 PUT、PATCH、OPTIONS、DELETE 等;

HTTP2.0

发布于 2015 年

为了解决 1.1 版本利用率不高的问题,提出了 HTTP/2.0 版本。增加双工模式,即不仅客户端能够同时发送多个请求,服务端也能同时处理多个请求,解决了队头堵塞的问题(HTTP2.0 使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比 HTTP1.1 大了好几个数量级);HTTP 请求和响应中,状态行和请求/响应头都是些信息字段,并没有真正的数据,因此在 2.0 版本中将所有的信息字段建立一张表,为表中的每个字段建立索引,客户端和服务端共同使用这个表,他们之间就以索引号来表示信息字段,这样就避免了 1.0 旧版本的重复繁琐的字段,并以压缩的方式传输,提高利用率。

另外也增加服务器推送的功能,即不经请求服务端主动向客户端发送数据。

HTTP3.0

TTP3 的主要改进在传输层上。传输层不会再有那些繁重的 TCP 连接了。现在,一切都会走 UDP。QUIC 的意思是“快速 UDP Internet 连接”。协议的这种更改将显著加快连接建立和数据传输的速度。然而,虽说 UDP 肯定更快、更简单,但它不具备 TCP 的可靠性和错误处理能力。

HTTP3 是 HTTP2 的复用和压缩,协议从 TCP 更改为 UDP。然后,谷歌的那些人在协议中添加了他们做的层,以确保稳定性、数据包接收顺序及安全性。

因此,HTTP3 在保持 QUIC 稳定性的同时使用 UDP 来实现高速度,同时又不会牺牲 TLS 的安全性。是的,在 QUIC 中就有 TLS1.3,你可以用它发起优雅的 SSL。这些层的底层机制是下面这样:

通信过程

Nginx 实现 http2.0

检查 nginx 支持的模块

/usr/sbin/nginx -V

如果包含 --with-http_v2_module 这个模块,恭喜你可以直接使用

server {
    listen       443 ssl http2;
...

使用方式很简单在配置文件 sever 模块里面的 listen 那边加个 http2 即可

可以通过 chrome 的 devtools 来检查修改是否生效

http1.1:

image.png

http2.0:

image.png

Nginx 实现 http3.0

编译安装支持 quic 的 nginx,可以参看《Nginx 配置启用 QUIC 和 HTTP/3.0

# Enable QUIC and HTTP/3.
listen 443 quic reuseport;
 
# Enable HTTP/2 (optional).
listen 443 ssl http2;
 
# 只支持tls1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers [TLS13+AESGCM+AES128|TLS13+CHACHA20]:TLS13+AESGCM+AES256:[EECDH+ECDSA+AESGCM+AES128|EECDH+ECDSA+CHACHA20]:EECDH+ECDSA+AESGCM+AES256:EECDH+ECDSA+AES128+SHA:EECDH+ECDSA+AES256+SHA:[EECDH+aRSA+AESGCM+AES128|EECDH+aRSA+CHACHA20]:EECDH+aRSA+AESGCM+AES256:EECDH+aRSA+AES128+SHA:EECDH+aRSA+AES256+SHA;
ssl_prefer_server_ciphers on;
ssl_early_data on;
ssl_ecdh_curve X25519:P-256:P-384;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497  https://$host$request_uri;
 
# OCSP Stapling 启用
ssl_stapling on;
ssl_stapling_verify on;
ssl_stapling_file /home/others/ocsp/nange.cn.ocsp.resp;
 
# Add Alt-Svc header to negotiate HTTP/3.
add_header alt-svc 'quic=":443"; ma=2592000; ';

http3.0

我的博客是挂了 cloudflare 的 cdn,可以看出来 cloudflare 那边已经在使用 http3 了

image.png

如果本文对你有用,麻烦双击·666·加·关注·

原文引用:

https://blog.csdn.net/qq_22238021/article/details/81197157

  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • HTTPS
    99 引用 • 274 回帖 • 3 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...