澳门新浦京娱乐场网站-www.146.net-新浦京娱乐场官网
做最好的网站

澳门新浦京娱乐场网站:HTTP请求与相应报文,营

构建高性能WEB之HTTP首部优化

2015/10/03 · HTML5, JavaScript · HTTP

本文作者: 伯乐在线 - 十三号线上的蝼蚁 。未经作者许可,禁止转载!
欢迎加入伯乐在线 专栏作者。

1.TCP/IP协议族

在连续写了两篇关于「HTTP/2 与 WEB 性能优化」的文章后,今天来写这个系列的最后一篇。在正式开始之前,我们先来简单回顾下之前两篇文章:

HTTP请求报文

澳门新浦京娱乐场网站 1

HTTP请求报文.png

  1. 请求方法,大多数浏览器支持的,也是最常用的方法是GET与POST,此外还有DELETE、HEAD、OPTIONS、PUT、TRACE
  2. 请求url,非完整访问url,它和报文头的Host属性组成完整的请求URL
  3. 协议名称与版本
  4. HTTP的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息
  5. 报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据
![](https://upload-images.jianshu.io/upload_images/5333646-a098a9dfcb577ba3.png)

HTTP请求报文结构图.png

POST和GET

HTTP一共有8种请求,其中比较重要的就是POST和GET,其余的还有HEAD、PUT.
1.GET请求可以被缓存起来,收藏为书签,但是POST不行。
2.GET可以被保存到历史记录中,但是POST不会。
3.GET请求的长度有限制(根据浏览器的不同而不同,大约几kb),POST无限制
4.GET请求的参数在URL连接上,相对不安全,POST请求参数写在HTTP的请求头中,相对安全。

0×00 前言

在讨论浏览器优化之前,首先我们先分析下从客户端发起一个HTTP请求到用户接收到响应之间,都发生了什么?知己知彼,才能百战不殆。这也是作为一个WEB开发者,为什么一定要深入学习TCP/IP等网络知识

  分层:应用层HTTP/DNS/FTP。传输层TCP/UDP。网络层IP/ARP。数据链路层(处理连接网络的硬件部分)

「HTTP/2 与 WEB 性能优化(一)」的结论是:HTTP/2 的 Server Push 机制,可以让重要的 JS、CSS 等资源尽快加载,从而不再需要 HTTP/1 中「将重要资源内联在页面头部」的优化方案了。

HTTP请求报文头属性

  • Accept : 告诉WEB服务器自己接受什么介质类型,/ 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type表示指定类型,例如Accept:text/plain
  • Accept-Charset、Accept-Encoding、Accept-Language : 能接受的字符集(gb2312、gbk、utf-8)、编码方式(指是否支持压缩、什么压缩方式)、语言。
  • Cache-Control : 通用头,指定请求和响应遵循的缓存机制,请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下:

no-cache:指示请求或响应消息不能缓存,实际上是可以存储在本地缓存区中的,只是在与原始服务器进行新鲜度验证之前,缓存不能将其提供给客户端使用。
no-store : 缓存应该尽快从存储器中删除文档的所有痕迹,因为其中可能会包含敏感信息。
max-age : 缓存无法返回缓存时间长于max-age规定秒的文档,若不超规定秒浏览器将不会发送对应的请求到服务器,数据由缓存直接返回;超过这一时间段才进一步由服务器决定是返回新数据还是仍由缓存提供。若同时还发送了max-stale指令,则使用期可能会超过其过期时间。
min-fresh : 至少在未来规定秒内文档要保持新鲜,接受其新鲜生命期大于其当前 Age 跟 min-fresh 值之和的缓存对象。
max-stale : 指示客户端可以接收过期响应消息,如果指定max-stale消息的值,那么客户端可以接收过期但在指定值之内的响应消息。
only-if-cached : 只有当缓存中有副本存在时,客户端才会获得一份副本。
Public : 指示响应可被任何缓存区缓存,可以用缓存内容回应任何用户。
Private : 指示对于单个用户的整个或部分响应消息,不能被共享缓存处理,只能用缓存内容回应先前请求该内容的那个用户。

  • Connection : 通用头,表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著地减少下载所需要的时间。
  • Authorization : 当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。
  • If-Match : 如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作,获取文档。
  • If-None-Match : 如果对象的 ETag 改变了,其实也就意味着对象也改变了,才执行请求的动作,获取文档。
  • If-Modified-Since : 如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 200809:14:42 GMT
  • If-Unmodified-Since : 如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)
  • If-Range : 浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的ETag 或者自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
  • Range : 浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546
  • Host : 客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。如Host:ss1.bdstatic.com
  • Referer : 浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL
  • User-Agent : 浏览器表明自己的身份(是哪种浏览器)。例如:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
  • Cookie : 客户端的Cookie就是通过这个报文头属性传给服务端的。服务端就是通过HTTP请求报文头的Cookie属性的jsessionid的值来判断客户端的多个请求是否隶属于一个Session

首部(共74个,不能一一列出,只挑选相对重要一些的)

0×01 到底发生什么了?

当用户发起一个HTTP请求时,首先客户端将与服务端之间建立TCP连接,成功建立连接后,服务端将对请求进行处理,并对客户端做出响应,响应内容一般包括响应主体。
(此处我们仅简单说明,但真实的一次请求其中发生的事情是相当复杂的,这里贴条连接,讲得比较详细)。
从输入 URL 到页面加载完成的过程中都发生了什么事情?

  TCP三次握手:发送端发送SYN,接收端发送SYN/ACK,发送端再发送ACK。

「HTTP/2 与 WEB 性能优化(二)」的结论是:HTTP/2 支持了多路复用,HTTP 连接变得十分廉价,之前为了节省连接数所采用的类似于「资源合并、资源内联」等优化手段不再需要了。多路复用可以在一个 TCP 连接上建立大量 HTTP 连接,也就不存在 HTTP 连接数限制了,HTTP/1 中常见的「静态域名」优化策略不但用不上了,还会带来负面影响,需要去掉。另外,HTTP/2 的头部压缩功能也能大幅减少 HTTP 协议头部带来的开销。

HTTP响应报文

澳门新浦京娱乐场网站 2

HTTP响应报文.png

  1. 报文协议及版本;
  2. 状态码及状态描述;
  3. 响应报文头,也是由多个属性组成;
  4. 响应报文体,即我们真正要的“干货”。

通用首部

Cache-control:

 no-cache:强制向源服务器再次验证。
 no-store: 不缓存请求或响应的内容。      

Connection:

1.控制不再转发给代理的首部字段(Connection:不再转发的首部字段名)。
2.管理持久连接(Connection:close 关闭连接  Connection:Keep-Alive )。 
【注】:HTTP/1.1默认连接是持久连接,对于1.1之前的版本需要使用Connection:Keep-Alive来保持持久连接。

Upgrade:

 除了使用HTTP协议外,还能用此字段进行扩展协议

Via:

为了追踪client和server之间的请求和响应的路径。
例:Via:1.0 gw.hackr.jp     1.0表示http的版本,gw.hackr.jp表示当前的代理服务器信息。

澳门新浦京娱乐场网站:HTTP请求与相应报文,营造高性能WEB之HTTP首部优化。Date:

Date: Tue01 Jul 2012 04:40:59 GMT

Warning:

建立TCP连接

为了进行可靠的数据传输,TCP在进行发送数据之前,会进行TCP三次握手,以此确定接收方能够成功收取传输的数据,而建立连接的过程,必然是要耗费系统资源,以及时间资源的。

  HTTP通信过程:客户端输入域名,DNS通过域名查找IP地址。HTTP协议生成针对目标WEB服务器的HTTP请求报文。TCP协议将HTTP请求报文分割成报文段,分别添加标记序号和端口号,把每段报文可靠的(三次握手)传给对方。IP协议搜索对方的地址,增加作为通信目的地的MAC地址,一边中转一边传送。服务器端TCP协议将接收到的报文段按序重组成请求报文。HTTP协议对WEB服务器请求的内容进行处理。响应的内容也按相同方式传给客户端。

但 HTTP/2 并不是万能的,并不是说用了 HTTP/2 就不再需要性能优化了。我在本系统第二篇文章末尾写到:

响应状态码

和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。

1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
2xx 处理成功,一般表示 请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。

澳门新浦京娱乐场网站:HTTP请求与相应报文,营造高性能WEB之HTTP首部优化。请求首部

accept:
用于指定客户端接受那些请求的类型。
例:Accept:text/html,表明客户端希望接受html文本。

accept-encoding:
用于指定客户端可接受的编码内容。
accept-language:
用于指定客户端可接受的自然语言。
accept-charset:
用于指定客户端可接受的字符集。
Authorization:
用于证明客户端有权限查看某些资源。
Host:
用于指定被请求资源的Internet主机和端口号。
If-Match:
告诉服务器匹配资源所用的实体标记值(ETag)。
If-Range:
告诉服务器若指定的If-Range字段值和请求资源的ETag值或时间相一致时,则作为范围请求处理。
Max-Forwards:
通过TRACE方法或OPTIONS方法。
User-Agent:
它的操作系统、浏览器和其它属性告诉服务器。

服务端处理并响应

当服务端接收到客户端发送来的请求之后,如果请求内容是静态资源,服务端会从硬盘中取出静态资源,然后将静态资源放在响应主体中,发送给客户端。如果是动态资源,服务端首先取出资源,并通过业务逻辑操作,动态生成最终的响应主体,然后发送给客户端。

2.HTTP协议

据官方预测,HTTP/1 至少还需要 10 年才能彻底退出历史舞台,另外尽管 HTTP/2 协议允许脱离 TSL 部署,但 Chrome 和 Firefox 都表示不支持非 TLS 的 HTTP/2,之后很可能一个网站会同时提供 HTTP/1.1、HTTP/1.1 over TLS、HTTP/2 over TLS 三种服务。如何在每种情况下,都能给用户提供最好的体验,需要更加深入的优化研究和更加精细的优化策略。

常见状态码

  • 200 OK 处理成功
  • 303 See Other 服务器把你redirect到其它的页面,目标的URL通过响应报文头的Location告诉你
  • 304 Not Modified 告诉客户端,你请求的这个资源至你上次取得后,并没有更改,你直接用你本地的缓存吧
  • 404 Not Found 即找不到页面
  • 500 Internal Server Error 这个错误说明服务器内抛出一堆Error了

响应首部

Accept-Ranges:
用来告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。
Age:
告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
ETag:
能告知客户端实体标识,一种可将资源以字符串形式做唯一标识的方式,服务器会为每份资源分配对应的ETag值。
强ETag值和弱ETag值
强ETag值,不论实体发生多么细微的变化都会改变其值。
弱ETag值,只用于提示资源是否相同,只有资源发生了根本改变,产生差异时才会改变ETag值。这时会在字段值最开始处附加W/,ETag:W/"usagi-1234"
Location:
使用首部字段Location可以将响应接收方引导至某个与请求URI位置不同的资源。
Retry-After:
告知客户端应该在多久之后再次发送请求。
Server:
告知客户端当前服务器上安装的HTTP服务器应用程序的信息。
例子:Server:Apache/2.2.6(Unix)PHP/5.2.5
Vary:
对缓存进行控制,源服务器会向代理服务器传达关于本地缓存使用方法的命令。
WWW-Authenticate:
首部字段WWW-Authenticateu用于HTTP访问认证。告知客户端适用于访问请求URI所指定资源的认证方案和带参数提示的质询。

客户端渲染

客户端接受到服务端传输过来的网络资源,然后进行渲染,绘制等,最终展示给用户。

  HTTP协议肯定是先从客户端开始建立通信。对于一条通信路线来说,服务器端和客户端的角色是固定的。

实际上,除了前两篇文章中提到的这些需要为 HTTP/2 做出调整的优化策略之外,其余大部分 HTTP/1 时期的优化策略依然有效。HTTP/1 的 WPO 并不是什么新鲜话题,大家早就熟门熟路了,本文只打算列举其中几个:

HTTP请求报文头属性

  • Age : 当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。
  • Server : WEB 服务器表明自己是什么软件及版本等信息。例如:Server:Apache/2.0.61 (Unix)
  • Accept-Ranges : 对应请求头的Range,WEB服务器表明自己是否接受获取其某个实体的一部分(比如文件的一部分)的请求。bytes表示接受,none表示不接受
  • ETag 一个代表响应服务端资源(如页面)版本的报文头属性,如果某个服务端资源发生变化了,这个ETag就会相应发生变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应。
  • Location : 告诉浏览器redirect的url
  • Set-Cookie 服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的,例如:Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

实体首部

Allow:
告知客户端能够支持Request-URI指定资源的所有HTTP方法。
Content-Encoding:
通知客户端服务器对实体的主体部分选用的内容编码方式(gzip、compress、deflate、identity)。
Content-Language:
通知客户端服务器对实体的主体部分使用的自然语言。
Content-Location:
Content-Location:http://www.baidu.com
表示报文主体返回资源对应的URI。
Content-MD5:
客户端会对接收的报文主体执行相同的MD5算法,然后与首部字段Content-MD5的字段值比较。
Content-Range:
返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表达当前发送部分及整个实体大小。
Content-Type:
说明了实体主体内对象的媒体类型。
Expires:
将资源失效的日期告知客户端。
Last-Modified:
指明资源最终修改的时间。

0×02 优化点在哪里?

通过简单的了解,我们了解到TCP建立连接是有资源消耗,时间消耗的,那么如果我们无需每次简历TCP连接,那是否可以提高网站的性能呢?答案是肯定的。

  • 优化点1:减少TCP连接

我们知道,在获取资源的时候,以获取速度从慢到快是:网络资源->本地硬盘资源->本地内存资源。而网络资源也分硬盘资源以及内存资源。并且网络资源的传输,也是有相当大的时延的。

  • 优化点2:对数据进行缓存
  • 优化点3:减少数据传输量

  HTTP是无状态协议。

启用压缩

实例

下面贴出百度搜索时的HTTP请求与相应报文

General
Request URL:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=monline_3_dg&wd=&oq=cookie&rsv_pq=a23841fb00006729&rsv_t=108aWY5cR+miRe/F/5HEoTcO2aUOBpm&rqlang=cn&rsv_enter=1&rsv_sug3=46&rsv_sug1=48&rsv_sug7=100&bs=cookie
Request Method:GET
Status Code:200 OK
Remote Address:61.135.169.125:443
Referrer Policy:no-referrer-when-downgrade

Request Headers
Accept:text/html,application/xhtml xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9
Cache-Control:max-age=0
Connection:keep-alive
Cookie:BAIDUID=B1E65BC97065E85E745CA39BFA616632:FG=1; BIDUP...后面一大串就不贴了
Host:www.baidu.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36

Response Headers
Bdpagetype:3
Bdqid:0x9eb46b2f0002276f
Bduserid:1452321556
Cache-Control:private
Ckpacknum:2
Ckrndstr:f0002276f
Connection:Keep-Alive
Content-Encoding:gzip
Content-Type:text/html;charset=utf-8
Date:Wed, 14 Mar 2018 03:29:37 GMT
P3p:CP=" OTI DSP COR IVA OUR IND COM "
Server:BWS/1.1
Set-Cookie:PSINO=2; domain=.baidu.com; path=/
Set-Cookie:BD_CK_SAM=1;path=/
Set-Cookie:BDSVRTM=37; path=/
Set-Cookie:H_PS_PSSID=1459_19033_21088_22157; path=/; domain=.baidu.com
Set-Cookie:BDRCVFR[Fc9oatPmwxn]=mk3SLVN4HKm; path=/; domain=.baidu.com
Strict-Transport-Security:max-age=172800
Transfer-Encoding:chunked
Vary:Accept-Encoding
X-Powered-By:HPHP
X-Ua-Compatible:IE=Edge,chrome=1

其他

Cookie:服务器接收到的Cookie信息
例子:
set-Coolie:开始状态管理所使用的Cookie信息
例子:set-Cookie:status=enable;expires=Tue,05 Jul 2016 08:00:00 GMT;path=/;domain=www.baidu.com

0×03 如何进行优化?

本篇文章主要说的优化点是与HTTP首部有关的优化,或者说是与浏览器端有关的优化,其它优化这里暂不赘述。

  HTTP可以保持TCP连接状态,在建立一次TCP连接后可进行多次HTTP请求和响应。

压缩的目的是让传输的数据变得更小。我们的线上代码(JS、CSS 和 HTML)都会做压缩,图片也会做压缩(PNGOUT、Pngcrush、JpegOptim、Gifsicle 等)。对于文本文件,在服务端发送响应之前进行 GZip 压缩也很重要,通常压缩后的文本大小会减小到原来的 1/4 - 1/3。对代码进行内容压缩已经有成熟的工具和标准流程了,而服务端的 GZip 更是标配,所以「压缩」是一项收益投入比很高的优化手段。

加密机制

持久连接:Keep-Alive

HTTP连接设计之初是请求-响应-关闭,也就是每建立一次HTTP连接,只能进行一次资源请求,当需要在同一目标服务器上获取多个资源的时候,就需要多次建立HTTP连接,而这个多次建立连接的过程,便降低了网站的性能。

于是,出现了Connection:Keep-Alive,人称持久连接。Keep-Alive避免了建立或者说重新建立连接的过程,减少了HTTP连接。

而与此配套的有Keep-Alive:timeout=120,max=5

其中,timeout=120 是指这个TCP通道保持120S,max=5 指这个TCP通道最多接收5个HTTP请求,之后便自动关闭该连接。

  HTTP管线化:下一次请求不需要等待上一次的响应完成就可以进行。

使用 HTTP 缓存

HTTP与HTTPS

HTTP协议:使用HTTP协议时,客户端与服务端的80端口建立一个TCP连接,然后就在这个连接的基础上进行请求和应答,以及数据的交换。
[注]:HTTP1.0和HTTP1.1的区别是:1.0每次请求都要建立一个新的TCP,1.1可以运行在一个连接上发送多次命令和应答,提高效率。

HTTPS的优势:加密 认证 完整性保证。
HTTPS的劣势:

1.加密需要占用大量cpu和内存
2.多了一层SSL和TLS通信层,必然拖慢速度。

修改时间:Last-Modified 和 If-Modified-Since

Last-Modified首部是服务端对客户端的HTTP响应所加的一个与缓存有关的HTTP首部,该首部标记了所请求资源在服务端的最后修改时间。类似:

Last-Modified : Fri , 12 May 2015 13:10:33 GMT

当客户端发现HTTP响应头中有Last-Modified,会对资源进行缓存,在下次请求资源时,在HTTP请求头中添加If-Modified-Since首部,首部中将会添加上次成功请求资源时响应头部的Last-Modified属性值,即:

If-Modified-Since : Fri , 12 May 2015 13:10:33 GMT

当服务端接收到的HTTP请求中,发现有If-Modified-Since头部时,会将该属性值与请求资源的最后修改时间进行比对,如果最后修改时间与该属性值一致时,服务端会返回一个304 Not Modified响应,该响应中不包括响应实体。浏览器收到304的响应后,会进行重定向,获取本地缓存资源。如果最后修改时间与该属性值不一致,则会从服务端重新获取资源,做出200响应。

  Cookie进行状态管理:服务器端在响应报文里添加Set-Cookie首部字段,通知客户端保存Cookie,下次客户端往服务器发送请求时,客户端在请求报文添加Cookie首部字段,服务器发现请求报文的Cookie后,检查究竟是哪一个客户端发送来的连接请求,然后对比服务器的记录,最后得到之前的状态信息。

任何一个 WEB 项目,要提高性能,各个环节的缓存必不可少。利用好 HTTP 协议的缓存机制,可以大幅减少传输数据,减少请求,这又是一项收益投入比超高的优化手段。这里把之前我写的 HTTP/1.1 缓存机制介绍翻出来:

Cookie和Session

作用:因为HTTP是一种无状态的连接,所以无法记录上次传输的数据。
1.Cookie保存客户端,Session保存在服务器。
2.Cookie相对来说不安全,浏览器可以分析本地的Cookie,进行Cookie欺骗。
3.Session可以设置超时时间,超过这个时间就会失效,以免长期占用服务器内存。
4.单个Cookie大小限制(4kb),每个站点的Cookie数量一般也有限制(20个)。
5.客户端每次都会把Cookie发送到服务器,因此服务器可以知道Cookie,但是客户端不知道Session。

服务器收到Cookie后,会根据Cookie中的SessionID来找到客户的Session,如果没有,会生成一个新的SessionID随Cookie发送给客户端。

版本标记:ETag 和 If-None-Match

ETag其实与Last-Modified是差不多的方式,但是ETag并没有选择以时间作为标记,而是对所请求文件进行某些算法来生成一串唯一的字符串,作为对某一文件的标记。当收到客户端对某一资源的请求时,服务端在响应时,添加ETag首部,如下:

ETag:W/"a627ff1c9e65d2dede2efe0dd25efb8c"

当客户端发现ETag头部时,同样会对资源进行缓存,并在下次请求时,在请求头部添加If-None-Match,如:

If-None-Match:W/"a627ff1c9e65d2dede2efe0dd25efb8c"

当服务端收到请求中含有该头部时,会使用同样的ETag生成算法对文件ETag进行计算,并与If-None-Match属性值进行比对,如果一致,则返回一个304 Not Modified响应,基本与上一种方式是一致的。

3.HTTP报文

首先,服务端可以通过响应头里的 Last-Modified(最后修改时间) 或者 ETag(内容特征) 标记实体。浏览器会存下这些标记,并在下次请求时带上 If-Modified-Since: 上次 Last-Modified 的内容 或 If-None-Match: 上次 ETag 的内容,询问服务端资源是否过期。如果服务端发现并没有过期,直接返回一个状态码为 304、正文为空的响应,告知浏览器使用本地缓存;如果资源有更新,服务端返回状态码 200、新的 Last-Modified、Etag 和正文。这个过程被称之为 HTTP 的协商缓存,通常也叫做弱缓存。

缓存时间:Expires 和 Cache-Control

上述两种方式中,每次请求资源时,虽然在有缓存的情况下,选择缓存进行渲染绘制,但是在这之前还是发起了一次HTTP请求,虽然并没有真实的响应实体,但是依然会造成一些资源消耗。而Expires与上述两种方式使用了不同的思路。

当服务端希望客户端浏览器对某一资源进行缓存时,为了免去客户端每次都要询问自己:我上次的缓存现在还能用吗?所以,服务端选择了放权。只去告诉浏览器,我这次给你的资源你可以用多长时间,在这个时间段内,你可以一直使用它,无需每次咨询我。而服务端就是通过Expires属性来告诉客户端浏览器可以多长时间内不需要询问服务端。如下:
Expires:Thu, 19 Nov 2015 15:00:00 GMT

当客户端在响应首部中发现该属性值时,便会将该资源缓存起来,而缓存的过期时间即是Expires中的时间。在这个时间段内,浏览器完全自主。

但是,Expires有一个不足的地方是,如果服务端时间与客户端本地时间不统一时,可能服务端让客户端可以对该资源缓存一个小时,而客户端本地时间比服务端时间快了两个小时,那就意味着,所有缓存都将不会生效。

于是有了弥补该不足的一个属性,即:Cache-Control。如果服务端在响应首部添加该属性时,客户端将直接使用该属性值来生成本地时间的缓存过期时间,这样便解决了这个问题,如下:

Cache-Control:max-age=3600

如果客户端在2015年10月01日13时00分00秒收到该响应时,便会加上3600秒也就是2015年10月01日14时00分00秒作为缓存过期时间。如果响应头部既有ExpiresCache-Control,浏览器会首选Cache-Control

  报文分请求报文和响应报文。报文由报文首部 空行 报文主体构成。

可以看到协商缓存并不会节省连接数,但是在缓存生效时,会大幅减小传输内容(304 响应没有正文,一般只有几百字节)。另外为什么有两个响应头都可以用来实现协商缓存呢?这是因为一开始用的 Last-Modified 有两个问题:1)只能精确到秒,1 秒内的多次变化反映不出来;2)在轮询的负载均衡算法中,如果各机器读到的文件修改时间不一致,有缓存无故失效和缓存不更新的风险。HTTP/1.1 并没有规定 ETag 的生成规则,而一般实现者都是对资源内容做摘要,能解决前面两个问题。

0×04 结束

这里,基本上说的都是与HTTP首部有关的网站性能优化。本文主要是在对《构建高性能WEB站点. 郭欣著》中第六章浏览器缓存的学习总结笔记。这本书对于WEB站点的优化,从各个层面都做了很详尽的讲解,确实是一本很棒的书,也在这里感谢HQBOSS的推荐。

1 赞 1 收藏 评论

  请求报文首部:请求行,请求首部字段,通用首部字段,实体首部字段,其他

另外一种缓存机制是服务端通过响应头告诉浏览器,在什么时间之前(Expires)或在多长时间之内(Cache-Control: Max-age=xxx),不要再请求服务器了。这个机制我们通常称之为 HTTP 的强缓存。

关于作者:十三号线上的蝼蚁

澳门新浦京娱乐场网站 3

哈哈哈 个人主页 · 我的文章 · 3 ·  

澳门新浦京娱乐场网站 4

  响应报文首部:状态行,响应首部字段,通用首部字段,实体首部字段,其他

一旦资源命中强缓存规则后,再次访问完全没有 HTTP 请求(Chrome 开发者工具的 Network 面板依然会显示请求,但是会注明 from cache;Firefox 的 firebug 也类似,会注明 BFCache),这会大幅提升性能。所以我们一般会对 CSS、JS、图片等资源使用强缓存,而入口文件(HTML)一般使用协商缓存或不缓存,这样可以通过修改入口文件中对强缓存资源的引入 URL 来达到即时更新的目的。

  HTTP状态码:1XX信息性状态码,接受的请求正在处理。

这里也解释下为什么有了 Expire,还要有 Cache-Control。也有两个原因:1)Cache-Control 功能更强大,对缓存的控制能力更强;2)Cache-Control 采用的 max-age 是相对时间,不受服务端 / 客户端时间不对的影响。

                     2XX成功状态码,请求正常处理完毕。200,204(响应不返回资源)

另外关于浏览器的刷新(F5 / cmd r)和强刷(Ctrl F5 / shift cmd r):普通刷新会使用协商缓存,忽略强缓存;强刷会忽略浏览器所有缓存(并且请求头会携带 Cache-Control:no-cache 和 Pragma:no-cache,用来通知所有中间节点忽略缓存)。只有从地址栏或收藏夹输入网址、点击链接等情况下,浏览器才会使用强缓存。

          3XX重定向状态码,需要进行附加操作完成请求。304(服务器资源未改变,可直接使用客户端未过期的缓存)

减少 DNS 查询

          4XX客户端错误状态码,服务器无法处理请求。403(不允许访问该资源)404(服务器找不到请求资源)

我们知道,建立 TCP 连接需要知道目标 IP,而绝大部分时候给浏览器的是域名。浏览器需要先将域名解析为 IP,这个过程就是 DNS 查询,一般需要几毫秒到几百毫秒,移动环境下会更慢。DNS 解析完成之前,请求会被 Block。浏览器一般都会缓存 DNS 查询结果,页面使用的域名(包括子域名)越少,花费在 DNS 查询上的开销就越小。另外,合理使用浏览器的 DNS Prefetching 技术,也是很好的做法。

          5XX服务器错误状态码,服务器处理出错。500(服务器内部出错)503(服务器处于超负荷或者停机维护)

减少重定向

4.WEB服务器

无论是通过服务端响应头产生的重定向,还是通过 或者 JS 产生的重定向,都可能引入新的 DNS 查询、新的 TCP 连接以及新的 HTTP 请求,所以减少重定向也很重要。浏览器基本都会缓存通过 301 Moved Permanently 指定的跳转,所以对于永久性跳转,可以考虑使用状态码301。对于启用了 HTTPS 的网站,配置 HSTS 策略,也可以减少从 HTTP 到 HTTPS 的重定向。

  代理:位于客户端和服务器之间,进行转发。作用:缓存,访问控制,获取访问日志。

WEB 性能优化是一个系统工程,不可能在这一篇文章里写完,我决定先就写到这儿。最后,推荐一个 Chrome 扩展:HTTP/2 and SPDY indicator,它可以在地址栏显示当前网站是否启用了 SPDY 或者 HTTP/2,点击图标可以直接打开 Chrome 的 HTTP/2 的调试界面,十分方便。

  网关:接收客户端请求时,把自己当作源服务器处理请求。作用:可以使网关与服务器通信提供非HTTP协议服务。

【编辑推荐】

  隧道:对相隔很远的客户端和服务器进行中转,保持双方通信连接。作用:保证安全通信

  缓存:代理服务器或者客户端本地保存的资源副本。减少对源服务器的访问,节省通信流量和时间。在判断缓存过期后,要向源服务器确认缓存的有效性。

5.HTTPS

  HTTP的缺点:通信不加密,可能被窃听。

          通信方身份不验证,可能遭遇伪装。

          无法证明报文完整性,可能被篡改。(中间人攻击)

  解决办法:使用SSL(安全套接层)和TLS(安全传输协议)对通信进行加密

       使用证书查明通信对方的身份

         使用证书证明传输数据的完整。

  HTTPS:HTTP 加密 认证 完整性保护。

  SSL加密方式:共享密钥加密(加密和解密用同一个密钥),处理速度快,但密钥传递过程不可靠。

           公开密钥加密(公开密钥加密,私有密钥解密),更安全,但处理速度更慢。

         HTTPS使用公开密钥加密方式安全交换稍后共享密钥加密中要使用的密钥,然后使用共享加密方式进行通信。

  使用SSL时,HTTPS的处理速度会变慢:SSL通信要消耗网络资源,同时对通信进行处理,使得通信时间延长。SSL做很多加密解密处理,消耗CPU和内存,导致处理速度变慢。

6.用户身份验证

  BASIC认证:客户端发送请求,服务器返回状态码401要求认证,客户端发送账号密码。不安全

  DIGEST认证:客户端发送请求,服务器返回401要求认证,并发送质询码,客户端发送质询码计算的响应码。不能防止用户伪装。

  SSL客户端认证:客户端发送事先安装的证书进行验证,通过后领取证书的公开密钥,开始HTTPS通信

  表单认证:通过输入用户ID和密码等登录信息发送至服务端进行验证。

       用户将ID和密码发送至服务端后,服务端进行身份验证,将认证状态和SessionID绑定后记录在服务端,并同时在Cookie中返回SessionID给用户端。客户端接收到SessionID后作为Cookie保存在本地,下次发送请求时,SessionID随着Cookie发送给服务端,服务端可以验证接受的SessionID识别用户和其验证状态。

7.基于HTTP的其他协议

  WebSocket:使用HTTP建立连接,之后使用专有协议进行通信。

          建立连接的时候发起方还是客户端,一旦连接确立,无论客户端还是服务端,都可以直接向对方发送报文。

          特点:支持由服务器向客户端推送数据,不必等待客户端的请求。一旦建立连接,可以保持连接状态,减少开销。

8.WEB攻击技术

  针对WEB应用的攻击模式:主动攻击,直接访问WEB应用,传入攻击代码。(SQL注入攻击和OS命令注入攻击)

               被动攻击,利用圈套策略执行攻击代码。(跨站脚本攻击XSS和跨站点请求伪造CSRF)

  XSS:在有安全漏洞的网站用户的浏览器运行非法的HTML标签或者JS脚本。一般在表单中添加特殊字段

  SQL注入:针对WEB应用使用的数据库通过运行非法的SQL语句。一般在URI的查询字符串中添加特殊字符

  HTTP首部注入攻击(被动):在响应首部字段添加换行添加任意首部字段。

  HTTP响应截断攻击:在响应首部添加两个换行符,往报文主体添加内容,并注释原本内容,达到伪造的目的。

  CSRF:通过其他网站获取当前浏览器针对某一网站的Cookie中的会话ID,让服务端误以为假冒网站就是当前已认证的用户,进行一些非法操作。

  Dos攻击:集中利用访问请求造成资源过载,使服务器停止。

  DDos攻击:利用多台计算机发起Dos攻击。

 

 

 

 

 

  

 

本文由澳门新浦京娱乐场网站发布于新浦京娱乐场官网,转载请注明出处:澳门新浦京娱乐场网站:HTTP请求与相应报文,营