乐虎游戏|乐虎国际登录|欢迎你

HTTP协议详细总括

日期:2019-10-30编辑作者:计算机资讯

在讨论页面加载性能问题时,我经常听到有人说“HTTP/2推送可以解决这问题”,但我对这个技术的了解不多,于是打算深入研究一下。

HTTP超文本传输协议,是WWW上应用的最多的协议。了解和掌握HTTP协议是对程序人员的基本要求。

HTTP/2推送远比我最初想象中更复杂,也更底层,但最让我措手不及的地方在于,这种技术在不同浏览器上的表现竟然有这么大的差别,本来我还觉得这技术已经足够成熟,可以在生产环境中使用了。

转载请注明出处 ,谢谢

本文并不是那种认为“HTTP/2推送一无是处”的吐槽文。我觉得HTTP/2推送真的很强大,以后还会更加完善,但并不算能解决所有问题的万灵药。

一、HTTP介绍

完整的Fetch路径

 

在页面和目标服务器间,横亘着一系列可能拦截请求的缓存和其他机制:

图片 1

当人们希望尝试或向别人解释Git或其他看得见的东西时,通常会使用类似上面这样的流程示意图,在本来就懂的人看来,这样的示意图一目了然,但不懂的人往往会一头雾水。如果你也有这种感觉,那要先说声抱歉了!希望下文能帮你更好地理解。

  HTTP是一个基于请求/响应模式的、无状态的协议。即,浏览器与服务端连接之后,浏览器向服务器发送一个请求,服务器返回响应信息之后,双方的链接就被关闭。我们要知道,应用层的HTTP要使用传输层的TCP协议来完成。而TCP协议是通过“3次握手”建立连接,是面向连接的协议。默认情况下,浏览器与Web服务器上80端口监听的服务器程序建立TCP连接。

HTTP/2推送的工作原理

  • 页面:嘿example.com,能把你的首页让我看一看吗?
  • 服务器:没问题!哦,在我给你发送首页的同时,还需要发送一些样式表、图片、JavaScript,以及一些JSON。
  • 页面:额,好的。
  • 页面:我已经看到HTML了,但貌似还需要一个样式……哦,好像你已经发过来了,酷!

相关厂商内容

 

  HTTP1.0是典型的请求/响应模式。为了减少服务器的开销,HTTP1.1默认有“持续连接”的机制。通过这种机制,客户端发送请求得到响应后,连接不会马上关闭,可以继续发送请求,还可以流水线发送多个请求、而不用等待每一个响应的到来。

超级App的实时性能监控与性能优化实践

 

微信图片视频背后的EB级存储引擎设计

二、URI和URL

漏斗模型:京东物流系统高并发架构演进之路

  URI(统一资源标识符)纯粹是一种符号结构,用于指定构成Web资源的字符串的各个不同部分。而URL(统一资源定位符)是一种特殊的URI,包含了用于查找某个资源的足够信息。

如何开发一个商业智能推荐系统?

  URI是一种语义上的抽象概念,可以是绝对的,也可以是相对的,而URL则必须提供足够的信息来定位,所以,是绝对的,而通常说的relative URL,则是针对另一个absolute URL,本质上还是绝对的。

2017年,你应该关注这些运维技术热点

 

相关赞助商

图片 2

ArchSummit深圳2017,7月7-8日,深圳·华侨城洲际酒店,精彩内容抢先看

 

服务器响应请求时,可以顺便包含额外的资源。例如包含一系列请求报头,这样稍后浏览器就知道如何匹配不同报头。这些额外的资源位于缓存中,当浏览器请求的资源与缓存中的匹配时即可直接从缓存中获取。

这种方法可以改善性能,原因在于可以提前发送可能需要的资源,而不需要等待浏览器索取,因此可以提高页面加载速度。

多年来我对HTTP/2推送的了解仅限于此,听起来挺简单,但魔鬼往往隐藏在细节中……

 

任何东西都可以使用推送缓存

HTTP/2推送是一种底层网络功能,用到网络栈的任何东西都可以使用该功能。但只有确保一致性以及可预测性,才能发挥最大作用。

我试着推送一些资源,并通过下列方式收集:

  • fetch()
  • XMLHttpRequest
  • <link rel="stylesheet" href="…">
  • <script src="…">
  • <iframe src="…">

为了解浏览器能否对正在推送中的内容进行匹配,我还降低了所推送资源主体的交付速度。这一过程中用到零零散散的测试套件已发布至GitHub。

  • Chrome - 良好支持
  • Safari - 糟糕支持
  • Firefox - 良好支持
  • Edge - 部分支持

Edge使用fetch()、XMLHttpRequest或<iframe>无法从推送缓存中获取所需项(问题描述,含视频)。

Safari最奇怪。到底用或不用推送缓存,似乎是通过抛硬币决定的。Safari遵从于OSX的闭源网络栈,但我觉得一些Bug是Safari自身造成的。似乎是因为打开了太多连接,导致被推送的项分散在不同连接中。这意味着只有足够好运,请求与推送使用了同一个连接,此时才能命中缓存,不过这就超过我的了解范围了(问题描述,含视频)。

所有浏览器(Safari行事怪异时除外)都可以使用匹配的推送项,哪怕推送工作还在进行中。这一点倒是不错。

然而不幸的是,只有Chrome为此提供了开发工具方面的支持。开发工具的网络窗格可以告诉你哪些项是从推送缓存中获取的。

三、HTTP请求

建议

如果浏览器无法从推送缓存中获取项,那么最终的速度甚至会比完全不进行推送更慢。

Edge的支持很贫瘠,但至少也是“一致的”贫瘠。因此你需要通过User-Agent嗅探的方式来确保只向Edge推送能被它使用的资源。如果因为任何原因做不到这一点,那么更稳妥的方法是避免向Edge用户推送任何内容。

Safari的表现有些缺乏必然性,但这个问题不是你能解决的。请使用User-Agent嗅探机制避免向Safari用户推送资源。

格式如图:(CRLF表示回车符+换行符,不同颜色之间用空格隔开

可以推送非缓存和非存储资源

为了使用HTTP缓存,项必须具备诸如max-age等属性,才能让浏览器无需与服务器重新验证而直接使用(这里有篇介绍缓存报头的文章)。HTTP/2推送则不同,并不需要检查匹配项的“新鲜度”。

  • Chrome - 良好支持
  • Safari - 良好支持
  • Firefox - 良好支持
  • Edge - 良好支持

所有浏览器都表现出了相同的行为。

图片 3

建议

一些单页应用由于不仅需要使用JS,还需要在JS开始执行时获取其他数据(例如JSON之类的)才能顺利渲染,因此经常会遇到性能问题。此时最佳解决方案是服务器端渲染,但如果不可行,可以将JS与JSON和页面一起推送。

然而考虑到上文提到有关Edge/Safari的问题,更可靠的做法是使用内联式JSON。

第一行叫做请求行。所以我们可以说HTTP请求由请求行、消息报头、请求正文组成。

HTTP/2推送缓存是浏览器需要考虑的最后一道缓存

推送项与HTTP/2共存,这意味着浏览器只会在之前的所有缓存(例如图片缓存、预载缓存、服务工作进程,以及HTTP缓存)都没有提供时才会使用HTTP/2的推送项。

  • Chrome - 良好支持
  • Safari - 良好支持
  • Firefox - 良好支持
  • Edge - 良好支持

所有浏览器都表现出了相同的行为。

 

建议

有个问题需要注意。举例来说,如果在HTTP缓存中有一个匹配项,并且按照其max-age来看这个项还很新鲜,但随后又推送了一个更新鲜的项,推送的项将被忽略,浏览器会继续使用HTTP缓存中那个较老的项(除非API因为任何原因跳过了HTTP缓存)。

身处“缓存链”的最末尾似乎不是什么大问题,但了解到这种缓存项与连接的共存,这帮助我理解了以前观察到的很多其他行为。例如……

1、请求行

如果连接关闭,那就跟推送缓存道别吧

推送缓存会与HTTP/2连接共存,因此连接关闭后缓存也会丢失。就算所推送的资源有很大可能会被缓存,依然会发生这种情况。

推送缓存位于HTTP缓存之后,因此只有在浏览器请求后,项才会进入HTTP缓存。此时项才能从推送缓存,途径HTTP缓存、服务工作进程等到达页面。

如果用户的连接不稳定,此时虽然可能成功推送某些资源,但会在页面恰好得到这些资源之前丢失连接。这意味着需要新建连接并重新下载资源。

  • Chrome - 良好支持
  • Safari - 良好支持
  • Firefox - 良好支持
  • Edge - 良好支持

所有浏览器都表现出了相同的行为。

如上,请求行以一个方法符号开头,空格之后,一个请求URI,再空格,然后一个HTTP版本,最后一个回车换行。

建议

不要过于依赖在推送缓存里长时间保存的项。推送这种方式最适合紧迫性高的资源,推送资源,以及该资源最终被使用,这两个阶段间隔的时间越短越好。

其中请求方法有如下几种:

本文由乐虎游戏发布于计算机资讯,转载请注明出处:HTTP协议详细总括

关键词:

Java高级软件工程师面试考纲,java考纲

【java技术栈】总序,java 技术栈(technologystack)常被用来指代某项工作或某个职位需要掌握的一系列技能的总和。一...

详细>>

基于Linux下网络聊天室的设计与实现 PDF

本系统采用C/S结合的结构,客户端与客户端以及客户端与服务器端之间通过基于TCP/IP协议Socket套接口传送消息。服务...

详细>>

游戏中战斗伤害范围攻击计算完整全版,战斗范围

游戏中战斗伤害范围攻击计算完整全版,战斗范围 还是看代码,比较直接,里面有详细的描述,应该能看懂。 前瞻回...

详细>>

Linux目录与文件权限的意义

AG游戏网站,JDB电子游戏,Linux目录与文件权限的意义 g娱乐场4355手机版,目录与文件权限的意义 新建新的文件与目录...

详细>>