一、 什么是HTTP协议
1、 定义
HTTP 全称是 HyperText Transfer Protocal ,即:超文本传输协议。
是用于从万维网服务器传输超文本到本地的传送协议。
2、 报文结构
HTTP的报文结构与TCP请求类似,TCP按照TCP头+数据的结构进行传输的。
HTTP的报文结构:起始行 + 头部 + 空行 + 实体(数据)
● 起始行
1) 请求报文
eg: GET /home HTTP/1.1 (方法 路径 版本)
2) 响应报文
响应报文中的起始行又称为状态行
eg: HTTP/1.1 200 OK
(版本 状态码 原因)
● 头部(请求头&响应头)
是Key:Value的键值对
3、 依赖(网络基础)
HTTP是基于TCP协议的,在TCP/IP四层模型中的位置如下图所示:
使用HTTP协议的web应用的通信过程中,数据传输流是这样的:
抓包获取报文
可以自行安装抓包工具(我用的fiddler)来监听网络请求,拿到原始包数据。 下面是用抓包工具获取到的原始报文,可以从这个报文验证以上所讲的报文结构
现在可以直接用network去查看请求数据,为什么要抓包?
有些场景下我们没法直接用network去查看HTTP请求(比如移动端/小程序),如果线上出问题,需要进行请求分析,这时就需要用到抓包工具。
或者如果我们需要做网络相关的性能优化的时候,需要根据我们现有网站的网络状况去做针对性的改善。
二、 长连接 & 短连接
HTTP的长连接和短连接本质上是TCP长连接和短连接。
1、 什么是长连接
多个HTTP请求可以复用同一个TCP连接。 长连接并不是永久连接的,如果一段时间内(具体的时间长短,是可以在header当中进行设置的,也就是所谓的超时时间),这个连接没有HTTP请求发出的话,那么这个长连接就会被断掉。
2、 什么是短连接
每一次HTTP请求,就建立一次连接,任务结束就中断连接。
3、 如何开启长连接
报文头中设置Connection为keep-alive,服务端和客户端都要设。 看一下公司的ERP系统项目(测试环境) 是怎么设置的:
在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方也不想支持长链接,则在response中也需要明确说明connection的值为close
4、 长连接使用前后并发性能差距
因为还没有学习压测的方法,并且没有搭建web服务器,我们就看一下别人的测试报告吧
三、 HTTP协议发展过程
1、 HTTP/1.0
默认每次请求都打开一个新的TCP连接,收到相应之后立即断开连接,是一种短连接。在网络请求很多的情况下,很容易达到浏览器请求上限(最大并发数限制,IE 11,火狐,chrome的最大并发连接数是6),且通信开销大
2、 HTTP/1.1
● 实现并默认所有连接都是长连接,即在一个TCP连接上可以传送多个HTTP请求和响应。 这样客户端发起多个请求的时候,就减少了TCP握手造成的网络资源和通信时间的浪费
● 在1.0的基础上面引入了更多的缓存控制策略:ETag,If-Unmodified-Since, If-Match, If-None-Match等。更详细的HTTP缓存策略可以查看MDN
● 请求头中必须包含Host头部,以区分不同的域名和端口号
3、 HTTP/2.0
-
二进制:HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮
-
多路复用:在一个TCP连接中可以存在多条流,可以发送多个请求。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面
-
头部压缩:HTTP1.x的请求体(body)一般会有响应的压缩编码过程,通过Content-Encoding头部字段来指定,但是请求头(header)是没有经过压缩的。当请求字段非常复杂的时候,尤其对于 GET 请求,请求报文几乎全是请求头。这个时候还是存在非常大的优化空间的
HTTP/2 针对头部字段,也采用了对应的压缩算法——HPACK,对请求头进行压缩 -
服务器推送:在 HTTP/2 当中,服务器已经不再是完全被动地接收请求,响应请求,它也能新建 stream 来给客户端发送消息,当 TCP 连接建立之后,比如浏览器请求一个 HTML 文件,服务器就可以在返回 HTML 的基础上,将 HTML 中引用到的其他资源文件一起返回给客户端,减少客户端的等待。
4、 HTTP/3.0
尽管HTTP/2解决了很多1.1的问题,但HTTP/2仍然存在一些缺陷,这些缺陷并不是来自于HTTP/2协议本身,而是来源于底层的TCP协议,我们知道TCP链接是可靠的连接,如果出现了丢包,那么整个连接都要等待重传,HTTP/1.1可以同时使用6个TCP连接,一个阻塞另外五个还能工作,但HTTP/2只有一个TCP连接,阻塞的问题便被放大了。
由于TCP协议已经被广泛使用,我们很难直接修改TCP协议,基于此,HTTP/3选择了一个折衷的方法——UDP协议,HTTP/3在UDP的基础上实现多路复用、0-RTT、TLS加密、流量控制、丢包重传等功能。
综上,我们可以知道,在请求不频繁的场景下,可以使用HTTP/1.x;当我们请求首页,这种需要大量请求后端并且需要快速相应的场景,可以使用HTTP/2.0;当我们在弱网环境下或者在移动端这种网络不稳定的情况下,是非常容易发生丢包状况,这时就可以使用HTTP/3.0来优化。
四、 HTTP & HTTPS
HTTPS基于HTTP协议,通过SSL或TLS(可以看作SSL3.0)提供加密处理数据、验证对方身份以及数据完整性保护。
1、 HTTPS特点
- 内容加密:采用混合加密技术,中间者无法直接查看明文内容
- 验证身份:通过证书认证客户端访问的是自己的服务器
- 保护数据完整性:防止传输的内容被中间人冒充或者篡改
2、 HTTP与HTTPS的区别
- 证书
HTTPS协议需要到CA(证书颁发机构)申请证书,一般免费证书很少,需要交费。 - 端口号
HTTP默认端口号是80,HTTPS默认端口号是443 - 加密
HTTP协议运行在TCP之上,所有传输的内容都是明文,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的。 - 安全性
HTTPS协议是由HTTP+SSL协议构建的可进行加密传输、身份认证的网络协议,可以有效的防止运营商劫持,解决了防劫持的一个大问题,比http协议安全。
Q:HTTPS连接过程是怎样的
A:参考
五、 WebSocket
WebSocket是HTML5中的协议,本质上是基于TCP,先通过HTTP/HTTPS协议发起一条特殊HTTP请求进行握手后创建一个用于交换数据的TCP连接,也是支持长连接的。
HTTP/2.0也可以进行服务端推送,那么它与WebSocket有什么区别呢?
HTTP/2.0虽然支持服务器推送资源到客户端,但那不是应用程序可以感知的,主要是让浏览器(用户代理)提前缓存静态资源,所以我们不能指望HTTP2可以像WebSocket建立双向实时通信。所以在需要实时通信的场景,我们还是需要与服务端进行WebSocket通信。