http头部可以分为通用头部,请求头部,响应头部和实体头部。
Keep-Alive是用来告诉连接的对方在这个请求响应完成之后不要马上关闭连接,下一次继续用这个连接进行交流,也就是TCP的长连接的实现方式。HTTP的长连接是通过Client和Server的一些关闭策略来实现的。
长连接用于操作频繁,点对点的通讯,而且客户端连接数相对较少比如即时通讯IM,网络游戏。
短连接用于用户数目较多的Web网站的H TTP服务,比如京东淘宝。
HTTP/1.0 定义了三种请求方法:GET, POST 和 HEAD 方法。
HTTP/1.1 增加了六种请求方法:OPTIONS, PUT, PATCH, DELETE, TRACE 和 CONNECT 方法。
http是一种简单的请求-响应协议,使用TCP作为传输协议,且默认的工作端口为80,http客户端和服务端通过socket建立连接。
https = http + ssl
其建立连接的过程如下:
可以从这几点来说:
HTTPS采用对称加密和非对称加密结合的方式。首先使用SSL/TLS协议进行加密传输,为了弥补非对称加密的缺点,HTTPS采用证书进一步加强安全性。通过非对称加密,客户端和服务端协商好之后进行通信传输的对称密钥,后续所有信息的传输都通过这一对对称密钥进行。
http协议是一个不保存客户机的协议。因此需要引入cookie和session来辅助保存用户状态。
在客户端第一次向服务器发送HTTP请求之后,服务器会创建一个session对象并将客户端的身份信息以键值对的形式存储,然后分配一个session id给客户端,这个session id一般会保存在客户端本地的cookie中。 之后每一次客户端发送http请求都会携带session id到服务器,服务器根据会话标识就可以将之前的状态信息和会话进行联系,从而保持会话。
优点: Session是保存在服务器上的,安全性高。
缺点: 速度慢一点。而且如果服务端采用了负载均衡策略,客户端的两次连接请求打在两个不同的主机上,基于session就不能实现会话保持了。这个时候可以通过redis来解决问题。
当服务器发送响应消息的时候,在http头部设置set-cookie字段,用来存储客户端的状态信息。 客户端解析出http响应头中的字段信息,并根据其生命周期创建不同的cookie,这样以来每一次浏览器发送http请求的时候都会带上cookie字段,从而实现状态保持。基于cookie的会话保持和基于session实现的会话保持最主要的区别就是前者将会话状态信息存储在浏览器的cookie中。
优点: 服务器不用保存状态信息,减轻服务器的存储压力,同时便于服务器负载均衡策略的实现。
缺点: 不够安全。且每次发送http请求都会发送额外的cookie到服务器中,会占用更多的带宽。
状态码200表示服务器响应成功,也就是服务器找到了客户端请求的内容,并且将内容返回给客户端。
状态码301代表临时跳转。例如:URL地址A可以向URL地址B上跳转,但这并不是永久性的,在经过一段时间后,URL地址A还可能向URL地址C上跳转。
状态码302和状态码301相似,不同的是状态码302往往代表的是永久性的重定向,值得注意的是,这种重定向跳转,从严格意义来讲不是服务器跳转,而是客户端跳转的。这个“跳”的动作是服务器是通过回传状态码302来下达给客户端的,让客户端完成跳转。
服务器通过返回状态码304可以告诉客户端请求资源成功,但是这个资源不是由服务器提供返回给客户端的,而是客户端本地浏览器缓存中就有的这个资源,因为可以从缓存中获取这个资源,从而节省传输的开销。
状态码403代表请求的服务器资源权限不够,也就是说,没有权限去访问服务器的资源,或者请求的IP地址被封掉了。
状态码404代表服务器上没有该资源,或者说服务器找不到客户端请求的资源,是最常见的请求错误码。
状态码500代表程序错误,也就是说请求的网页程序本身报错了。在服务器端的网页程序出错。由于现在的浏览器都会对状态码500做一定的处理,所以在一般情况下会返回一个定制的错误页面
主要区别如下:
缓存处理:在 HTTP/1.0 中主要使用 header 里的 if-modified-Since, Expries 来做缓存判断的标准。而 HTTP/1.1 请求头中添加了更多与缓存相关的字段,从而支持更为灵活的缓存策略,例如 Entity-tag, If-Unmodified-Since, If-Match, If-None-Match 等可供选择的缓存头来控制缓存策略。
节约带宽: 当客户端请求某个资源时,HTTP/1.0 默认将该资源相关的整个对象传送给请求方,但很多时候可能客户端并不需要对象的所有信息。而在 HTTP/1.1 的请求头中引入了 range 头域,它允许只请求部分资源,其使得开发者可以多线程请求某一资源,从而充分的利用带宽资源,实现高效并发。
错误通知的管理:HTTP/1.1 在 1.0 的基础上新增了 24 个错误状态响应码,例如 414 表示客户端请求中所包含的 URL 地址太长,以至于服务器无法处理;410 表示所请求的资源已经被永久删除。
Host 请求头:早期 HTTP/1.0 中认为每台服务器都绑定一个唯一的 IP 地址并提供单一的服务,请求消息中的 URL 并没有传递主机名。而随着虚拟主机的出现,一台物理服务器上可以存在多个虚拟主机,并且它们共享同一个 IP 地址。为了支持虚拟主机,HTTP/1.1 中添加了 host 请求头,请求消息和响应消息中应声明这个字段,若请求消息中缺少该字段时服务端会响应一个 404 错误状态码。
长连接:HTTP/1.0 默认浏览器和服务器之间保持短暂连接,浏览器的每次请求都需要与服务器建立一个 TCP 连接,服务器完成后立即断开 TCP 连接。HTTP/1.1 默认使用的是持久连接,其支持在同一个 TCP 请求中传送多个 HTTP 请求和响应。此之前的 HTTP 版本的默认连接都是使用非持久连接,如果想要在旧版本的 HTTP 协议上维持持久连接,则需要指定 Connection 的首部字段的值为 Keep-Alive
二进制传送:之前版本 数据都是用文本传输,因为文本有多种格式,所以不能很好地适应所有场景; 2.0传送的是二进制,相当于统一了格式
多路复用:1.1虽然默认复用TCP连接,但是每个请求是串行执行的,如果前面的请求超时,后面的请求只能等着(也就是线头阻塞); 2.0的时候每个请求有自己的ID,多个请求可以在同一个TCP连接上并行执行,不会互相影响
header压缩:每次进行HTTP请求响应的时候,头部里很多的字段都是重复的,在2.0中,将字段记录到一张表中,头部只需要存放字段对应的编号就行,用的时候只需要拿着编号去表里查找就行,减少了传输的数据量
服务端推送:服务器会在客户端没发起请求的时候主动推送一些需要的资源,比如客户端请求一个html文件,服务器发送完之后会把和这个html页面相关的静态文件也发送给客户端,当客户端准备向服务器请求静态文件的时候,就可以直接从缓存中获取,就不需要再发起请求了
HTTP/3 是在 QUIC 基础上发展起来的,其底层使用 UDP 进行数据传输,上层仍然使用 HTTP/2。在 UDP 与 HTTP/2 之间存在一个 QUIC 层,其中 TLS 加密过程在该层进行处理。HTTP/3 主要有以下几个特点:
① 使用 UDP 作为传输层进行通信;
② 在 UDP 之上的 QUIC 协议保证了 HTTP/3 的安全性。QUIC 在建立连接的过程中就完成了 TLS 加密握手;
③ 建立连接快,正常只需要 1 RTT 即可建立连接。如果有缓存之前的会话信息,则直接验证和建立连接,此过程 0 RTT。建立连接时,也可以带有少量业务数据;
④ 不和具体底层连接绑定,QUIC 为每个连接的两端分别分配了一个唯一 ID,上层连接只认这对逻辑 ID。网络切换或者断连时,只需要继续发送数据包即可完成连接的建立;
⑤ 使用 QPACK 进行头部压缩,因为 在 HTTP/2 中的 HPACK 要求传输过程有序,这会导致队头阻塞,而 QPACK 不存在这个问题。
最后我们使用一张图来清晰的表示出 HTTP 协议的发展变化: