web核心(3)响应头请求头状态码及dns解析过程
1.http
1.1 通用头
1.1.1Cache-Control:请求和响应遵循的缓存机制,请求消息或响应消息中设置的Cache-Control并不会修改另一个请求消息或响应消息缓存处理过程
参数:
Public(仅为响应标头):响应可被任何缓存区缓存,,可以无条件的缓存该响应.
Private(仅为响应标头): 对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。可以具体指定某个字段.如
private –“username”,则响应头中,名为username的标头内容,不会被共享缓存.
no-cache:请求或响应消息不能缓存,实际上Cache-Control: no-cache是会被缓存的,只不过每次在向客户端提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
no-store:请求消息中发送将使得请求和响应消息都不使用缓存,相对no-cache这个才是响应不被缓存
max-age:设置缓存最大的保存时间,单位秒,从服务端返回的时间开始计算
min-fresh(仅为请求标头) :当当前时刻加上一个指定时间超出过期时间,那么会得到一个新的数据。
max-stale 可以接收超出指定时间之内的过期缓存的响应消息。
.only-if-cached:(仅为请求标头):希望从缓存中获取数据,不论是否过期。
.must-revalidate(仅为响应标头) :如果缓存过期,那么必须重新验证,而不是试图返回一个不新鲜期的缓存,与no-cache的区别在于no-cache完全无视新鲜期的概念,总是强制重新验证,理论上must-
revalidate更节省流量,但相比no-cache可能并不那么精准,因为即使缓存者认为是新鲜的也不能保证服务器端没有做过更新,如果缓存者是一个缓存代理服务器,如果其试图重新验证时,无法连接上原始
服务器,则也不允许返回一个不新鲜的缓存中的副本,而是必须返回一个504 Gateway timeout。
.proxy-revalidate(仅为响应标头) :与must-revalidate类似,区别在于受体的范围,proxy-revalidate是要排除掉用户代理的缓存,其规则并不应用于用户代理的本地缓存上。
.s-maxage(仅为响应标头):与max-age的区别是s-maxage仅仅应用于共享缓存,而不引用于用户代理的本地缓存,s-maxage的优先级要高于max-age。
.cache-extension:自顶以拓展相关指令
1.1.2 Pragma//包含实现特定的指令
参数
no-cache:最常用,等同max-age效果。但是如果同时存在,则被Cache-Control的max-age覆盖。
1.1.3 Date//表示时间,在新鲜的的时候会用到
1.1.4 Connection
Close:WEB服务器或者代理服务器在完成本次请求的响应后断开连接,不再等待后续请求
Keepalive:WEB服务器或者代理服务器在完成本次请求的响应后保持连接,等待本次请求的后续请求
Keep-Alive:在Keepalive的基础上添加了设定值,在设定值的期限类没有响应则断开连接
1.1.5 Transfer-Encoding
传输编码,它不但不会减少实体内容传输大小,甚至还会使传输变大,最新的 HTTP 规范里,只定义了一种传输编码:分块编码(chunked),分块编码在头部加入Transfer-Encoding: chunked,用
于解决的问题,例如Content-Length 比实际长度短,会造成内容被截断;但是如果比实体内容长,会造成 pending,解决pending的方法是加入分块之后,每个分块包含十六进制的长度值和数据,长度值
独占一行,长度不包括它结尾的 CRLF(\r\n),也不包括分块数据结尾的 CRLF。最后一个分块长度值必须为 0,对应的分块数据没有内容,表示实体结束。
1.1.6 Upgrade
要求客户端升级到另一个高版本协议,例如Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
1.2请求头
1.2.1 Accept
指定客户端能够接收的内容类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,例如:Accept:text/html,application/xhtml+xm…plication/xml;q=0.9,*/*;q=0.8
1.2.2 Accept-Charset
用户指定客户端的字符集
1.2.3 Accept-Encoding
指定浏览器可以支持的web服务器返回内容压缩编码类型。例如:Accept-Encoding:gzip, deflate, br
1.2.4 Accept-Language
浏览器可接受的语言, 例如Accept-Language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
1.2.5 Authorization
HTTP授权的授权证书
1.2.6 If-Match
如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作,Etag是属于HTTP 1.1属性,它是由服务器生成返回给前端,当你第一次发起HTTP请求时,服务器会返回一个Etag,并在第二次发起同一个请求时,客户端会同时发送一个If-None-Match,而它的值就是Etag的值,然后,服务器会比对这个客服端发送过来的Etag是否与服务器的相同,如果相同,就将If-None-Match的值设为false,返回状态为304,客户端继续使用本地缓存,不解析服务器返回的数据(这种场景服务器也不返回数据,因为服务器的数据没有变化),如果不相同,就将If-None-Match的值设为true,返回状态为200,客户端重新解析服务器返回的数据。Etag实体的唯一标识
1.2.7 If-None-Match
如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作
1.2.8 If-Modified-Since
请求的对象在该头部指定的时间之后修改了才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
1.2.9 If-Unmodified-Since
如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
1.2.10 If-Range
如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体,参数也为Etag,总是跟 Range 头部一起使用。
1.2.11 Range
浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546
1.2.12 Proxy-Authenticate
代理服务器响应浏览器,要求其提供代理身份验证信息。
1.2.13 Proxy-Authorization
浏览器响应代理服务器的身份验证请求,提供自己的身份信息。
1.2.14 Host
指定请求的服务器的域名和端口号,如Host:rss.sina.com.cn
1.2.15 Referer
浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL,例如:Referer:http://www.ecdoer.com/,防盗链。
1.2.16 User-Agent
User-Agent的内容包含发出请求的用户信息,例如:User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0
1.3响应头
1.3.1 Access-Control-Allow-Origin
指定哪些网站可以跨域源资源共享,例如:Access-Control-Allow-Origin: *
1.3.2 Accept-Patch
指定服务器所支持的文档补丁格式,例如:Accept-Patch: text/example;charset=utf-8
1.3.3 Accept-Ranges
服务器所支持的内容范围,Accept-Ranges: bytes
1.3.4 Age
响应对象在代理缓存中存在的时间,以秒为单位,例如 Age: 12
1.3.5 Allow
对于特定资源的有效动作,例如:Allow: GET, HEAD
1.3.6 Content-Disposition
对已知MIME类型资源的描述,浏览器可以根据这个响应头决定是对返回资源的动作,如:将其下载或是打开。例如:Content-Disposition: attachment; filename="fname.ext"
1.3.7 Content-Encoding
响应资源所使用的编码类型,例如:Content-Encoding: gzip
1.3.8 Content-Language
响应内容所使用的语言,例如:Content-Language: zh-cn
1.3.9 Content-Length
响应消息体的长度,用8进制字节表示,例如:Content-Length: 348
1.3.10 Content-Location
所返回的数据的一个候选位置,例如:Content-Location: /index.htm
1.3.11 Content-Range
如果是响应部分消息,表示属于完整消息的哪个部分,例如:Content-Range: bytes 100-200
1.3.12 Content-Type
当前内容的MIME类型,例如:Content-Type: text/html; charset=utf-8
1.3.13 ETag
对于某个资源的某个特定版本的一个标识符,通常是一个 消息散列
1.3.14 Expires
指定一个日期/时间,超过该时间则认为此回应已经过期,例如:Expires: Thu, 01 Dec 1994 16:00:00 GMT
1.3.15 Last-Modified
所请求的对象的最后修改日期(按照 RFC 7231 中定义的“超文本传输协议日期”格式来表示)
1.3.16 Link
用来表示与另一个资源之间的类型关系,此类型关系是在RFC 5988中定义,例如:Link: ; rel="alternate"
1.3.17 Location
用于在进行重定向,或在创建了某个新资源时使用。 例如:Location: http://www.itbilu.com/nodejs
1.3.18 P3P
P3P策略相关设置
1.3.19 Refresh
用于重定向,或者当一个新的资源被创建时。默认会在5秒后刷新重定向,例如:Refresh: 5; url=http://itbilu.com
1.3.20 Status
通用网关接口的响应头字段,用来说明当前HTTP连接的响应状态,例如:Status: 200 OK
1.3.21 Server
服务器的名称,例如:Server: nginx/1.6.3
1.3.22 Set-Cookie
设置HTTP cookie,例如:Set-Cookie: UserID=itbilu; Max-Age=3600; Version=1
1.3.23 Proxy-Authenticate
要求在访问代理时提供身份认证信息。
1.3.24 Public-Key-Pins
用于防止中间攻击,声明网站认证中传输层安全协议的证书散列值
2.状态码(常用)
200 :客户端请求成功
302 :临时跳转 ,通常的地址通过Location指定,重定向
304:从缓存中读取数据,不从服务器重新获取数据。
400:客户端请求有语法错误
403:服务器收到请求,但是拒绝服务
404:请求失败,请求所希望得到的资源未被在服务器上发现。
405:请求行中指定的请求方法不能被用于请求相应的资源。
500:内部错误
完成请见:http://tools.jb51.net/table/http_status_code
3.url(统一资源定位符)解析过程
url—dns—ip
4.dns域名解析过程
首先查找的是浏览器缓存中是否有已经解析的域名地址,如果有,那么直接使用,这个域名解析过程结束,这个时间由ttl来设置,但是也受浏览器缓存大小的限制,缓存时间过长,ip地址变化找不到ip地址,导致域名不能正常解析,时间太短,那么导致每次访问网站都需要重新解析一次域名,如果在缓存中没有找到,那么会相应的在操作系统的缓存中选择是否有相应的解析ip地址解析结果,如果有那么久使用这个ip地址并返回,这里在以前的时候存在域名劫持,因为可以通过c:\windows\systems\driver\etc\hosts 来指定一个解析的ip地址,win7后这个只能读而不能改,当然linux的配置文件/etc/name.conf中也可以修改达到同样的目的,当然也受到缓存时间的影响,假如前两个无法解决,那么会相应的发送到ldns(本地区的域名服务器,公司的服务器),这window下可以使用ipconfig查询,在linux下可以查相应的配置文件 /etc/resolv.conf ,一般而言这个专门的域名解析性能都会比较好。一般会缓存域名解析的结果,也受缓存时间的控制,大约80%的域名解析都是在这里完成的,ldns主要承担了域名的解析工作,这里假如还是没有才会使用root server域名的解析工作,返回时一个逆过程,在dns解析的过程中主要在两个地方缓存结果,一个是ldns一个是本机,其中缓存控制是由缓存时间和缓存大小控制的,最大的缓存时间是ttl,ldns的缓存时间是我们很难由本地介入,本地的缓存可以使用 ipcongfig/flushdns,linux可以/etc/imit.d/nscd restart来清除缓存,当然在windows和linux下都可以使用nslookup来查看相应的解析结果
5.Http请求的处理
http发送一个请求,经过dns解析找到相应的ip,然后通过ajax等获取返回的信息,这些信息可能来自于数据库,分布式缓存(redis),或者是静态文件,当然假如需要提升加载图片等静态文件的时候,采用cdn(在用户和服务器之间架设缓存区,类似用户和数据库等之间架设的redis缓存),这里是在请求返回后发现没有某些数据然后再次发生http请求的方式获取cdn的数据