http协议详解【一】

1,448 阅读6分钟

参考连接

Http持久连接、非持久连接和pipeline连接
HTTP/2.0 相比1.0有哪些重大改进?
HTTP2.0性能增强的核心:二进制分帧

在网络信息传输过程中,都会套用经典的五层模型。

理论部分

http发展历史

http/0.9

http/0.9http发展过程中第一个定稿的协议。

  1. http 只有一个get命令
  2. 没有header去面熟数据信息
  3. 服务器发送完毕,就关闭TCP连接

http/1.0

  1. 增加了很多命令
  2. 增加statys codeheader
  3. 多字符集支持,多部份发送、权限、缓存等。

http/1.1

  1. 持久连接

http/1.0中,客户端要想和服务器通信,发送一个http请求,要创建一个http连接,就必须要创建一个TCP连接,在服务端返回内容之后TCP连接就会被关闭(TCP连接的建立需要经过三次握手,比较耗费性能。)。而在http1.1中,实现了持久连接,可以在服务端返回内容之后,继续保持TCP连接状态而不关闭。

持久连接情况下,服务器发出响应后让TCP连接继续打开着。同一对客户/服务器之间的后续请求和响应可以通过这个连接发送。

Http1.1默认使用持久连接,如果客户端或者服务端任何一方不想使用持久连接,需要通过字段connection:close来通知对方。`


  1. 支持pipeline

HTTP/1.1的新特性,允许在持久连接(也就意味着pipeline是依赖于持久连接的,而不是独立的上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向服务器时,第二条和第三条请求也可以开始发送了。在髙时延网络条件下,这样做可以降低网络的环回时间,提高性能。

pipeline

对于http/1.1中的pipeline,存在一个缺点:以上图为例,client依次发送了三个请求,按先后顺序,我们将其依次标记为request1,request2,request3。假设服务端对request1请求内容的处理是比较耗时的,在request1请求处理完成之前,request2request3已经处理完成了,而此时,request2request3对应的response2response3还不能返回,必须等到response1返回之后才能返回。

换句话说,对于pipeline的请求顺序和响应顺序是相对应的。


  1. 增加host

通过host这个属性,我们可以在同一台物理服务器可以部署多个web服务,提高服务器的利用率。


http2

http2

  1. 二进制数据帧

在不改动http/1.1的语义、方法、状态码、URI以及首部字段...的情况下,http2是如何做到[突破http1.1的性能限制、改进传输性能、实现低延迟和高吞吐量的?]

关键之一就在于应用层http2和传输层之间TCP/UDP之间增加一个二进制分帧层:

二进制分帧

在二进制分帧层中,http/2会将所有传输的信息分割为更小的信息和帧(frame),并对他们采用二进制格式的编码,其中http1.1的首部头信息被封装到header frame而相应的request body则被封装到data frame中.


  1. 头信息压缩

HTTP 2.0 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送;通信期间几乎不会改变的通用键-值对(用户代理、可接受的媒体类型,等等)只 需发送一次。事实上,如果请求中不包含首部(例如对同一资源的轮询请求),那么 首部开销就是零字节。此时所有首部都自动使用之前请求发送的首部。

如果首部发生变化了,那么只需要发送变化了数据在Headers帧里面,新增或修改的首部帧会被追加到“首部表”。首部表在 HTTP 2.0 的连接存续期内始终存在,由客户端和服务器共同渐进地更新 。


  1. 并行双向字节流的请求和响应

同一个连接里面发送多个请求不再需要按照顺序进行 在HTTP2.0上,客户端和服务器可以把HTTP 消息分解为互不依赖的帧,然后乱序发送,最后再在另一端把它们重新组合起来。注意,同一链接上有多个不同方向的数据流在传输。客户端可以一边乱序发送stream,也可以一边接收者服务器的响应,而服务器那端同理。

HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装是 HTTP 2.0 最 重要的一项增强。事实上,这个机制会在整个 Web 技术栈中引发一系列连锁反应, 从而带来巨大的性能提升,因为:

  • 可以并行交错地发送请求,请求之间互不影响;

  • 可以并行交错地发送响应,响应之间互不干扰;

  • 只使用一个连接即可并行发送多个请求和响应;

  • 消除不必要的延迟,从而减少页面加载的时间;


  1. 推送

HTTP 2.0 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。

有了HTTP2.0的服务器推送,HTTP1.x时代的内嵌资源的优化手段也变得没有意义了。而且使用服务器推送的资源的方式更加高效,因为客户端还可以缓存起来,甚至可以由不同的页面共享(依旧遵循同源策略)。

举例来说,client请求了一个htmlserver可以主动将该html所需要引用的img,css,style推送给client,而不需要等到服务器解析html时再来请求相应的文件。


URI URL URN

URI uniform resource identifier 统一资源标识符,包含urlurn.

URL uniform resource locator统一资源定位器.


user:passurl中的定义,但由于其安全性和可操作性,现在已经不使用了


URN uniform resource name 统一资源名称.


URN统一资源定位符。URN是作为特定内容的唯一名称使用的,与当前资源的所在地无关。使用URN,在资源移动之后还能被找到,这样就可以将资源四处迁移,而不用担心迁移后无法访问。目前没有很好的实现方案,也没有具体的使用场景。