Http复习

温故而知新,参考网上的一些资料总结的知识点。

超文本传输协议(英文:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP是万维网的数据通信的基础。

设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。

Http(基本介绍)

Http是基于请求-应答模式的协议,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息。

HTTP协议中,并没有规定必须TCP/IP作为传输协议。事实上,HTTP可以在任何互联网协议上,或其他网络上实现。HTTP假定其下层协议提供可靠的传输。因此,任何能够提供这种保证的协议都可以被其使用。因为TCP/IP是可靠的,所以使用TCP作为其传输层。

根据HTTP标准,HTTP请求可以使用多种请求方法。

  • HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
  • HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。


    Http复习_第1张图片

HTTP 消息结构

HTTP 请求和响应具有相似的结构,由以下部分组成︰

  • 起始行:用于描述要执行的请求,或者是对应的状态,成功或失败。这个起始行总是单行的。
  • 头集合:可选的HTTP头集合指明请求或描述消息正文。不区分大小写的字符串,紧跟着的冒号 (':') 和一个结构取决于 header 的值。 整个 header(包括值)由一行组成,这一行可以相当长。
  • 空行:一个空行指示所有关于请求的元数据已经发送完毕。
  • 正文:一个可选的包含请求相关数据的正文 (比如HTML表单内容), 或者响应相关的文档。 正文的大小有起始行的HTTP头来指定
部分 请求 响应
起始行 Http方法、请求Url、协议版本 例子:GET /hello.txt HTTP/1.1 协议版本、状态码、状态文本 例子:HTTP/1.1 404 Not Found
头集合 General headers(例如 Via,适用于整个报文。)、
Request headers(例如 User-Agent,Accept-Type,通过进一步的定义(例如 Accept-Language),或者给定上下文(例如 Referer),或者进行有条件的限制 (例如 If-None) 来修改请求。)、
Entity headers(例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件)
General headers,例如 Via(适用于整个报文)、
Response headers(例如 Vary 和 Accept-Ranges,提供其它不符合状态行的关于服务器的信息。)、
Entity headers(例如 Content-Length,适用于请求的 body。显然,如果请求中没有任何 body,则不会发送这样的头文件。)
正文 不是所有的请求都有一个 body,一般常见的的情况是 POST 请求(包含 HTML 表单数据)会包含body。 不是所有的响应都有 body:具有状态码 (如 201 或 204) 的响应,通常不会有 body。

请求头集合说明:


Http复习_第2张图片

响应头集合说明:

Http复习_第3张图片

历史简介

Http0.9(单行协议)

这是HTTP最早大规模使用的版本,现已过时。在这个版本中 只有GET一种请求方法,在HTTP通讯也没有指定版本号,也不支持请求头信息。该版本不支持POST等方法,因此客户端向服务器传递信息的能力非常有限。HTTP/0.9的请求只有如下一行:

Http1.0(构建可扩展性)

这个版本是第一个在HTTP通讯中指定版本号的协议版本,HTTP/1.0。相对于Http0.9主要有如下改进。

  • 支持GET、POST、HEAD三种HTTP请求方法。
  • 协议版本添加到起始行随着每个请求发送。
  • 状态码会在响应开始时发送,使浏览器能了解请求执行成功或失败,并相应调整行为(如更新或使用本地缓存)。
  • 引入了HTTP头的概念,无论是对于请求还是响应,允许传输元数据,使协议变得非常灵活,更具扩展性。
  • 在新HTTP头的帮助下,具备了传输除纯文本HTML文件以外其他类型文档的能力(Content-Type头)

Http1.1(标准化的协议)

现在基本上的网站至少支持Http1.1。该版本默认采用持久连接,并能很好地配合代理服务器工作。还支持以管道方式同时发送多个请求,以便降低线路负载,提高传输速度。

相比于Http1.0主要新增了如下功能:

  • HTTP/1.1新增了OPTIONS、PUT、DELETE、TRACE、CONNECT五种HTTP请求方法。
  • 默认使用长连接,用以保持连接特性,连接可以复用,节省了多次打开TCP连接加载网页文档资源的时间。
  • 允许客户端在收到每个服务端响应之前发送多个请求,进一步减少用户感受到的滞后。
  • 支持响应分块,而不必使用到缓冲器
  • 引入内容协商机制,包括语言,编码,类型等,并允许客户端和服务器之间约定以最合适的内容进行交换。
  • 使用Host头,能够使不同域名配置在同一个IP地址的服务器上。

保持连接的机制,一个连接可以重复在多个请求/回应使用。持续连接的方式可以大大减少等待时间,因为在发出第一个请求后,双方不需要重新运行TCP交握程序。

HTTP 1.1还使改进了HTTP 1.0的带宽。 例如,HTTP 1.1引入了分块传输编码,以允许传递内容可以在持续连接上被流传输而不必使用到缓冲器。HTTP管道允许客户端在收到每个回应之前发送多个请求,进一步减少用户感受到的滞后时间。协议的另一个补充是字节服务,允许客户端请求资源的某一部分,服务器仅回应某资源的指明部分,断点续传实现的基石。

下图是多次连接和持续连接的对比:

Http复习_第4张图片

Http2.0(为了更优异的表现)

这个版本是最新发布的版本,于2015年5月做HTTP标准正式发布。HTTP/2通过支持请求与相应的多路重用来减少延迟,通过压缩HTTP头字段将协议开销降到最低,同时增加了对请求优先级和服务器端推送的支持。

数据通过HTTP请求被传输。HTTP/1.1链接需要请求以正确的顺序发送,理论上可以用一些并行的链接(尤其是5到8个),带来的成本和复杂性堪忧。

HTTP/1.x 报文有一些性能上的缺点:

  • Header 不像 body,它不会被压缩。
  • 无法复用。当在同一个服务器打开几个连接时:TCP 热连接比冷连接更加有效。
  • 两个报文之间的 header 通常非常相似,但它们仍然在连接中重复传输。
  • 线头阻塞:HTTP Pipelining其实是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应;只不过,客户端还是要按照发送请求的顺序来接收响应

HTTP/2 引入了一个额外的步骤:它将 HTTP/1.x 消息分成帧并嵌入到流 (stream) 中。数据帧和报头帧分离,这将允许报头压缩。将多个流组合,这是一个被称为 多路复用 (multiplexing) 的过程,它允许更有效的底层 TCP 连接。

如下图所示:


Http复习_第5张图片

HTTP/2 帧机制是在 HTTP/1.x 语法和底层传输协议之间增加了一个新的中间层,而没有从根本上修改它,即它是建立在经过验证的机制之上。

  • HTTP2是二进制协议而不是文本协议。不再可读和无障碍的手动创建,改善的优化技术现在可被实施。
  • 这是一个复用协议。并行的请求能在同一个链接中处理,移除了HTTP/1.x中顺序和阻塞的约束。
  • 压缩了headers。因为headers在一系列请求中常常是相似的,其移除了重复和传输重复数据的成本。
  • 其允许服务器在客户端缓存中填充数据,通过一个叫服务器推送的机制来提前请求。

多路复用

在 HTTP/1.1 协议中 「浏览器客户端在同一时间,针对同一域名下的请求有一定数量限制。超过限制数目的请求会被阻塞」。

Http复习_第6张图片

因此 HTTP/2 可以很容易的去实现多流并行而不用依赖建立多个 TCP 连接,HTTP/2 把 HTTP 协议通信的基本单位缩小为一个一个的帧,这些帧对应着逻辑流中的消息。并行地在同一个 TCP 连接上双向交换消息。

二进制分帧

在不改动 HTTP/1.x 的语义、方法、状态码、URI 以及首部字段….. 的情况下, HTTP/2 是如何做到,关键之一就是在 应用层(HTTP/2)和传输层(TCP or UDP)之间增加一个二进制分帧层。


Http复习_第7张图片
  • 单连接多资源的方式,减少服务端的链接压力,内存占用更少,连接吞吐量更大
  • 由于 TCP 连接的减少而使网络拥塞状况得以改善,同时慢启动时间的减少,使拥塞和丢包恢复速度更快
Http复习_第8张图片

首部压缩

Http复习_第9张图片

重置

HTTP 1.1的有一个缺点是:当一个含有确切值的Content-Length的HTTP消息被送出之后,你就很难中断它了。当然,通常你可以断开整个TCP链接(但也不总是可以这样),但这样导致的代价就是需要通过三次握手来重新建立一个新的TCP连接。

一个更好的方案是只终止当前传输的消息并重新发送一个新的。在http2里面,我们可以通过发送RST_STREAM帧来实现这种需求,从而避免浪费带宽和中断已有的连接。

优先级和依赖性

每个流都包含一个优先级(也就是“权重”),它被用来告诉对端哪个流更重要。当资源有限的时候,服务器会根据优先级来选择应该先发送哪些流。

借助于PRIORITY帧,客户端同样可以告知服务器当前的流依赖于其他哪个流。该功能让客户端能建立一个优先级“树”,所有“子流”会依赖于“父流”的传输完成情况。

优先级和依赖关系可以在传输过程中被动态的改变。这样当用户滚动一个全是图片的页面的时候,浏览器就能够指定哪个图片拥有更高的优先级。或者是在你切换标签页的时候,浏览器可以提升新切换到页面所包含流的优先级。

后HTTP/2进化

  • 在Cookie头中引入安全相关的的前缀,现在帮助保证一个安全的cookie没被更改过。
  • 对Alt-Svc的支持允许了给定资源的位置和资源鉴定,允许了更智能的CDN缓冲机制。

扩展阅读

Http2讲解
HTTP长连接和短连接
HTTP的发展
超文本传输协议
HTTP消息
Http教程

你可能感兴趣的:(Http复习)