2 Web和HTTP
2.1 HTTP概述
- HTTP:超文本传输协议 HyperText Transfer Protocol,定义了Web客户向Web服务器请求Web页面的方式,以及服务器向客户传送Web页面的方式。HTTP使用TCP作为它的制成运输协议
- 无状态协议(stateless protocol):服务器向客户发送被请求的文件,而不存储任何关于该用户的状态信息。
2.2 非持续连接和持续连接
HTTP在默认方式下使用持续连接
- 非持续连接:每个请求/响应对是经一个单独的TCP连接发送,TCP连接在发送完一个对象后关闭。
- 非持续连接的缺点:
- 必须为每一个请求的对象建立和维持一个全新的连接,服务器的负担大。
- 2*往返时间+传输对象时间>往返时间+传输对象时间
- 持续连接:在相同的客户和服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。
2.3 HTTP报文格式
2.3.1 HTTP请求报文
-
请求行
方法字段:GET POST HEAD PUT DELETE- GET:发送一个请求来取得服务器上的某一资源。
- POST:向服务器提交数据。
- HEAD:HEAD和GET本质是一样的,区别在于HEAD不含有呈现数据,而仅仅是HTTP头信息。有的人可能觉得这个方法没什么用,其实不是这样的。想象一个业务情景:欲判断某个资源是否存在,我们通常使用GET,但这里用HEAD则意义更加明确。
- PUT: PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定。
- DELETE:删除某一个资源。
URL字段:带有请求对象的标识
HTTP版本: -
首部行
- Host:指明了对象所在的主机
- Connection:close表示该浏览器告诉服务器不要使用持续连接,要求服务器在发送完被请求的对象后就关闭这条连接。Keep-Alive,使用持续连接
- User-agent:指明用户代理,向服务器请求的浏览器的类型。
- Accept-language:用户想得到该对象的语言版本,否则发送默认版本
-
实体体
2.3.2 HTTP响应报文
- 初始状态行status line
- 协议版本字段
- 状态码
- 响应状态信息
HTTP/1.1 200 OK
状态码 | 文本 | 含义 |
---|---|---|
200 | OK | 请求成功,信息在返回的响应报文中 |
301 | Moved Permanently | 请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行的一种,客户软件将自动获取新的URL |
304 | Not Modified | 服务器回给web缓存器,表示请求对象未被修改,可以使用 |
400 | Bad Request | 一个通用差错代码,指示该请求不能被服务器理解 |
404 | Not Found | 被请求的文档不在服务器上 |
505 | HTTP Version Not Supported | 服务器不支持请求报文使用的HTTP协议版本 |
- 首部行
- Connection
- Data:服务器产生并发送该响应报文的日期和时间
- Server:指示服务器类型
- Last-Modified:指示了对象被创建或者最后修改的日期和时间
- Content-Length:被发送对象的字节数
- Content-Type:实体体中对象的类型,HTML,
- 实体体
2.4 用户与服务器的交互,cookie
使用场景:一个Web站点通常希望能够识别用户,可能是因为服务器希望限制用户的访问,或者希望把内容与用户身份联系起来,HTTP中使用了cookie,允许站点对用户进行跟踪。
- web站点产生唯一识别码,并以此为索引在它的后端数据库中产生一个表项
- 服务器用一个包含Set-cookie的首部行对浏览器进行响应。
Set-cookie: 1678
- 浏览器收到HTTP响应报文,在自己管理的cookie文件中添加一行,包含服务器的主机名和Set-cookie中的识别码。
- 以后再访问该Web站点时,请求报文都会带有包含识别码的首部行
Cookie: 1678
cookie用于标识一个用户
2.5 web缓存
Web缓存(web cache):即代理服务器proxy server,能够代表初始web服务器来满足HTTP请求的网络实体。代理服务器拥有磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。下面是某浏览器请求对象 http://www.xxx.edu.cn/aaa.jpg 的过程
部署web缓存器的好处
-
能够大大降低对客户请求的响应时间;
-
能够大大减少一个机构的接入链路到因特网的通信量 see case(机构内部路由器到因特网路由器);
web缓存器存在一个命中率的问题,即一个缓存器所能够满足的请求的概率(比率),实际常为0.2~0.7,其余的请求将仍由初始服务器满足。
case A
1:机构---100Mbps局域网---> 内部路由器---15Mbps接入链路--->因特网路由器
2:初始服务器(处于世界各地)---> 因特网
if 15个*1Mb请求/s 从机构发出
局域网流量强度 = 15*1Mb/s / 100Mbps = 0.15
接入链路流量强度 = 15*1Mb/s / 15Mbps = 1.0,链路上的时延会变得非常大并且无限增长。
case B OKKKKKK
1:(机构+机构缓存器)---100Mbps局域网---> 内部路由器---15Mbps接入链路--->因特网路由器
2:初始服务器(处于世界各地)---> 因特网
假设web缓存器的命中率为0.4,web缓存器的响应时间10ms;15Mbps链路上,流量强度0.6,当小于0.8时,时延增量都将在几十毫秒
计算平均时延 = 0.4*10ms + 0.6*(2s+10ms) = 1.2s
case C
增大接入链路的速率为100Mbps,接入链路的流量强度也为0.15
则总的时延可以大致认为 = 接入链路转发HTTP请求报文开始,一直到收到因特网的响应报文,大约2s
可见增加web缓存器的方案更优
内容分发网络 content distribution network CDN
2.6 条件GET方法
保存在web服务器中的对象自该副本缓存在客户上以后可能已经被修改了
HTTP中的条件GET机制就是允许缓存器证实它的对象是最新的。
case A:一个浏览器向代理缓存器请求了。。。
代理缓存器 -> web服务器
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotique.com
web服务器 -> 代理服务器
HTTP/1.1 200 OK
Date: Sat, 3 Oct 2015 xx:xx:xx
Server: XXX
Last-Modified: Web, 9, Sep 2015 12:12:12
Content-Type: image/gif
...data...
case B:one week late,另一个浏览器向代理缓存器又请求了同一对象
代理缓存器 -> web服务器
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotique.com
If-modified-since: Web, 9, Sep 2015 12:12:12
web服务器 -> 代理服务器
HTTP/1.1 304 Not Modified
Date: Sat, 10 Oct 2015 xx:xx:xx
Server: XXX
(empty entity body)