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

  |   0 评论   |   0 浏览

概述

  摘自百度百科:

超文本传输协议(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 支持的模块

1/usr/sbin/nginx -V

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

1server {
2    listen       443 ssl http2;
3...

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

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

  http1.1:

  image.png

  http2.0:

  image.png

Nginx 实现 http3.0

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

 1# Enable QUIC and HTTP/3.
 2listen 443 quic reuseport;
 3 
 4# Enable HTTP/2 (optional).
 5listen 443 ssl http2;
 6 
 7# 只支持tls1.3
 8ssl_protocols TLSv1.2 TLSv1.3;
 9ssl_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;
10ssl_prefer_server_ciphers on;
11ssl_early_data on;
12ssl_ecdh_curve X25519:P-256:P-384;
13ssl_session_cache shared:SSL:10m;
14ssl_session_timeout 10m;
15error_page 497  https://$host$request_uri;
16 
17# OCSP Stapling 启用
18ssl_stapling on;
19ssl_stapling_verify on;
20ssl_stapling_file /home/others/ocsp/nange.cn.ocsp.resp;
21 
22# Add Alt-Svc header to negotiate HTTP/3.
23add_header alt-svc 'quic=":443"; ma=2592000; ';

  http3.0

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

  image.png

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

  原文引用:

  https://www.infoq.cn/article/WhCObxfbgtphY7ijv1kp

  https://www.nange.cn/quic-and-http3-for-nginx.html

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

---------------------------------------------------------------
>> 博客地址:https://blog.mufengs.com
>> 邮箱地址:[email protected]
>> 微信帐号:Do8080
>> Github : https://github.com/mufengcoding
---------------------------------------------------------------