您的位置:首页 > 理论基础 > 计算机网络

深入HTTP协议

2016-04-22 00:30 375 查看
就像在招待客人一样得遵守一定礼节,浏览器与web服务器一问一答的交互过程也得遵守一定的规则——HTTP协议(HyperText Transfer Protocol)。现代B/S架构都是基于统一的HTTP协议,基于此协议的服务器有Apache、IIS、Nginx、Tomcat、JBoss等。目前被广泛使用的是HTTP1.1(主要讨论此版本),与上个版本最大的区别是支持持续连接。B/S固定不变的原则:URL、HTTP、浏览器。

当浏览器向服务器发出一次请求,web服务器返回HTML文档给浏览器后,两者不再有任何关系。上一次请求的响应结果不影响下次请求的响应结果,如用户网线接触不良,重新插好网线后,再次发送请求,web服务器是感知不到的,只要浏览器发出的请求内容一样,它的处理过程就完全一样。所以说HTTP协议是无状态的。

代理服务器(可有效减少服务器的访问负载)的工作流程:



①当浏览器发出请求后,若本地缓存有请求的资源,直接取出保存的副本进行响应;

②若本地没有请求的资源,代理服务器就向web服务器请求该资源并返回给用户,同时将资源保持在本地缓存。

HTTP协议采用无状态短连接的通信方式。因为web应用每天都要处理大量的请求,不可能每个用户访问都保持住这个连接。HTTP1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应。eg.一个网页中的css、JavaScript、图片文件(HTTP1.0都要单独建立TCP连接,非常耗时)。一个页面的css文件经常要发送多个HTTP请求,但每个单独的页面还是需要使用各自的TCP连接,所以称为短连接。

在浏览器输入http://www.sina.com.cn/:

①首先请求DNS把该域名映射成IP地址;

②根据IP地址在互联网找到对应的服务器;

③向该服务器发送一个get请求;

④服务器返回数据资源。

发起请求

一个完整的请求消息包括:一个请求行、若干消息头、以及实体内容。

一个完整的响应消息包括:一个状态行、若干消息头、以及实体内容。

消息头和实体内容要用空行隔开(即回车和换行两个字符)

若HTTP消息包括实体内容,且没采用chunked传输编码方式,则消息头必须包含实体内容的长度的字段,否则客户端和服务程序无法知道实体内容何时结束。

1.请求行

格式:请求方式 资源路径 HTTP版本号<CRLF>

举例:GET/test.html HTTP/1.1

请求方式:POST,HEAD,OPTIONS,DELETE,TRACE,PUT

2.状态行

格式:HTTP版本号 状态号 原因描述<CRLF>

举例:HTTP/1.1 200 OK

实例:telnet localhost 8080(“ctr+]”,组合键打开本地回显)

我们来解析一下在浏览器输入http://www.sina.com.cn/的url后,各请求头和响应头的部分:

请求头:

Host: www.sina.com.cn(指定被请求资源)

User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0(客户端的操作系统、浏览器和其他属性)

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8(指出浏览器能够处理的MIME类型)

Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3(指定一种自然语言)

Accept-Encoding: gzip, deflate(指定可接受的内容编码)

DNT: 1

Connection: keep-alive(当前连接是否保持)

If-Modified-Since: Thu, 21 Apr 2016 14:22:29 GMT(缓存文档最后更新时间)

补充:Referer:

①如果从浏览器地址输入URL发出,则不应发送Referer请求头;

②使用指定的超链接的URL发出,发送Referer请求头。(这样可以追踪和了解发出本次请求的起源URL地址)

响应头:

Age: 51(可在客户机或代理服务器中缓存的有效时间,单位秒)

Cache-Control: max-age=60(缓存的内容将在60秒后失效)

Content-Encoding: gzip(指定实体内容的压缩编码方式)

Content-Length: 120981(指明实体内容长度)

Content-Type: text/html(发送给接受者实体正文类型)

Date: Thu, 21 Apr 2016 15:42:42 GMT

Expires: Thu, 21 Apr 2016 15:43:42 GMT(指定当前文档什么时候过期,不能继续使用本地缓存)

Last-Modified: Thu, 21 Apr 2016 15:42:12 GMT(缓存文档最后更新时间)

Server: nginx(指定服务器软件的产品名称)

Vary: Accept-Encoding(指定影响了服务器所生成的响应内容的那些请求头字段名)

X-Cache: HIT from cmnet.xxg.18a4.31.spool.sina.com.cn

X-Powered-By: shci_v1.03

补充:

Cache-directive

说明

public

所有内容都将被缓存

private

内容只缓存到私有缓存中

no-cache

必须先与服务器确认返回的响应是否被更改,然后才能使用该响应来满足后续对同一个网址的请求。因此,如果存在合适的验证令牌
(ETag),no-cache会发起往返通信来验证缓存的响应,如果资源未被更改,可以避免下载。

no-store

所有内容都不会被缓存到缓存或 Internet 临时文件中

must-revalidation/proxy-revalidation

如果缓存的内容失效,请求必须发送到服务器/代理以进行重新验证

max-age=xxx (xxx is numeric)

缓存的内容将在 xxx 秒后失效,这个选项只在HTTP 1.1可用,并如果和Last-Modified一起使用时,优先级较高

Ctrl+F5可以绕过本地缓存和远程缓存,通过增加请求头:Pragma: no-cache、Cache-Control: no-cache,重新发送请求响应新内容。

CDN工作机制:

CDN(Content Delivery Network,内容分布网络),是一种先进的流量分配网络,使用户就近取得所需内容,提高访问网站的速度。

可近似认为CDN=镜像(mirror)+缓存(cache)+整体负载均衡(GSLB)。可明显提高Internet中信息流动效率。CDN以缓存静态数据为主,eg.CSS、JS、图片和静态页面。淘宝有90%以上的数据都是由CDN来提供的。

作者: @nanphonfy

Email:
nanphonfy
(Nfzone) gmail.com 请将(Nfzone)换成@
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: