请求报文、响应报文的起始行和响应头部里的字段都是文本化、结构化的。而请求body却可以包含任意二进制数据(如图片、视频、软件等),当然也可以包含文本。
有些首部是通用的,有些则是请求或者响应报文才会有的。
首部 属性 值 含义Date 通用 Thu, 03 Jan 2019 12:23:47 GMT 报文构建的时间
Accept 请求报文 text/html,application/xhtml+xml,application/xm 客户端能接收的数据类型
Content-Type 响应报文 Content-Type: text/plain; charset=utf-8 响应报文中的body部分的数据类型
顺便提一下, 用telnet直连服务器的http端口,telnet命令会建立一条TCP通道,然后我们可以直接发送请求数据,获取响应数据了。
HTTP协议进阶 代理HTTP的代理是服务器即是Web服务器,又是Web客户端。
使用代理可以“接触”到所有流过的HTTP流量,代理可以对其进行监视和修改。常见的就是对儿童过滤一些“成人”内容;网络工程师会利用代理服务器来提高安全性,它可以限制哪些应用层的协议数据可以通过,过滤“病毒”等数据;代理可以存储缓存的文件,直接返回给访问者,无需请求原始的服务器资源;对于访问慢速网络上的公共内容时,可以假扮服务器提供服务,从而提高访问速度;这被称为反向代理;可以作为内容路由器,如对付费用户,则将请求导到缓存服务器,提高访问速度;可以将页面的语言转换到与客户端相匹配,这称为“内容转码器”;“匿名代理”会主动从HTTP报文中删除身份相关的信息,如User-Agent, Cookie等字段。
现实中,请求通过以下几种方式打到代理服务器上去:
报文每经过一个中间点(代理或网关),都需要在首部via字段的末尾插入一个可以代表本节点的独特的字符串,包含实现的协议版本和主机地址。
请求和响应的报文传输路径通常都是一致的,只不过方向是相反的。因此,响应报文上的via字段表示的中间节点的顺序是刚好相反的。
缓存当有很多请求访问同一个页面时,服务器会多次传输同一份数据,这些数据重复地在网络中传输着,消耗着大量带宽。如果将这些数据缓存下来,就可以提高响应速度,节省网络带宽了。
大部分缓存只有在客户端发起请求,并且副本已经比较旧的情况下才会对副本的新鲜度进行检测。最常用的请求首部是If-Modified-Since, 如果在xx(此时间即为If-Modified-Since的值)时间之后内容没有变化,服务器会回应一个304 Not Modified. 否则,服务器会正常响应,并返回原始的文件数据,而这个过程中被称为再验证命中。
再验证可能出现命中或未命中的情况。未命中时,服务器回复200 OK,并且返回完整的数据;命中时,服务器回复304 Not Modified; 还有一种情况,缓存被删除了,那么缓存服务器也会删除自己缓存的副本。
顺带提一句,若要在项目中使用缓存,就一定要关注缓存命中比例。若命中比例不高,就要重新考虑设置缓存的必要性了。
缓存服务器返回响应的时候,是基于已缓存的服务器响应的首部,对一些首部字段做一些微调。比如向其中插入新鲜度信息(如Age, Expires首部等),而且通常会包含一个via首部来说明缓存是由一个缓存代理提供的。注意,这时不要修改Date字段,它表示原始服务器最初构建这条响应的日期。
HTTP通过文档过期机制和服务器再验证机制保持已缓存数据和服务器间的数据充分一致。
文档过期通过如下首部字段来表示缓存的有效期: