万维网WWW(下)
1:HTTP超文本传输协议的报文的基本概念
1:基本概念
2:HTTP请求报文格式
1:基本概念与简单举例
我们用很窄的小格子表示空格,用标有CRLF的格子表示回车换行,HTTP请求报文的第一行是请求行,由方法字段开始,其后跟一个空格,后跟统一资源定位符字段,其后跟一个空格,后跟版本字段最后是回车换行,如下图所示:
从第二行开始,就是首部行,每一个首部行由首部字段名开始,其后跟一个冒号,在跟一个空格,然后是该字段的取值,最后是回车换行,可以有多个首部行,如下图所示:
在最后的首部行下面是一个空行,在空行下面是实体主体,通常不使用,如下图所示:
我们来举例说明HTTP请求报文的格式:
下图是浏览器发送的HTTP请求报文的具体内容
第一行为请求行,指明了请求方法GET,统一资源定位符URL,以及HTTP的版本
第二行为第一个首部行,首部字段名为Host,指明为服务器的域名或者IP地址
第三行为第二个首部行,首部字段名为Connection,其值为close,这是告诉服务器,发送完请求的文档后就可以释放连接
第四行为第三个首部行,首部字段名为User-Agent,其值是浏览器的类型以及版本
第五行为第四个首部行,首部字段名为Accept-Language,其值为cn,这是告诉服务器用户希望优先得到中文版本的文档
在最后一个首部行的下面是一个空行,表明该HTTP请求报文没有实体主体
如下图所示:
2:HTTP请求报文支持的方法
如下图所示:
3:HTTP响应报文格式
1:基本概念与简单举例
HTTP响应报文的第一行是状态行,由版本字段开始,其后跟一个空格,后跟状态码字段,其后跟一个空格后跟短语字段,最后是回车换行,除状态行外
HTTP响应报文的其他部分与HTTP请求报文格式的对应部分是相似的,我们就不在赘述了
如下图所示:
2:状态行中的状态码
状态行中的状态码共分为五大类共33种,如下图所示:
我们举例说明响应报文中的常见的状态行:
如下图所示:
上图该状态行表示服务器接受了该请求,其中HTTP/1.1表示版本,202是状态码,Acccepted是短语,也就是对状态码的简单描述
上图该状态行表示请求错误
上图该状态行表示找不到请求的页面
一般来说,浏览器并不会直接显示出服务器发送来的这些状态行信息,而是以更友好的形式向用户告知服务器所返回的状态信息
例如:
当我们访问某些网站,浏览器可能会显示类似该图所示的提示信息,其背后的本质是浏览器收到了包含这条状态行的响应报文
4:储存在用户本地终端上的数据Cookie
在我们访问网站时,浏览器通常会使用Cookie在服务器上记录用户信息
1:简单概述和发展历史
早期的万维网非常简单
现在的万维网有着各种各样的动态交互功能,需要识别用户信息
简单举例:
我们使用浏览器在某个网站上已经注册了自己的账号,当在该网站登录自己的账号时,除了输入用户名和密码外,我们还可以选择记住我选项,这样,当我们下一次使用该浏览器再次访问该网站时,网站可以自动识别出我们,而不用我们再次输入账号信息
如下图所示:
2:Cookie的作用与工作原理
Cookie提供了一种机制,使得万维网服务器能够“记住”用户
我们简单举例Cookie的工作原理:
用户主机中的浏览器进程首先与万维网服务器中的服务器进程,建立TCP连接,当用户的浏览器进程初次向服务器进程发送HTTP请求报文时,服务器进程就会为其产生一个唯一的Cookie识别码,并以此为索引在服务器的后端数据库中创建一个项目,用来记录该用户访问该网站的各种信息,接着就会给浏览器进程发送HTTP响应报文,在响应报文中包含有一个首部字段为Set-Cookie的首部行,该字段的取值就是Cookie的识别码,当浏览器进程收到该响应报文之后,就在一个特定的Cookie文件中添加一行,记录该服务器的域名和Cookie识别码,如下图所示:
当用户再次使用该浏览器访问这个网站时,每发送一个HTTP请求报文,浏览器都会从Cookie文件中取出该网站的Cookie识别码,并放到HTTP请求报文的Cookie首部行中,服务器根据Cookie识别码就可以识别出该用户,并返回该用户的个性化网页
接下来,我们介绍万维网缓存与代理服务器
5:万维网缓存和代理服务器
在万维网中还可以使用缓存机制以提高万维网的效率,万维网缓存又被称为web缓存
Web缓存的功能
我们来举例说明:
假设下图是因特网上面的某台万维网服务器,为了与万维网代理服务器的名称区分,我们简称该服务器为原始服务器,这是校园网中的某台万维网代理服务器,我们简称其为代理服务器,当校园网中的某台主机要访问因特网上的原始服务器时
它首先会向校园网中的代理服务器发送请求,若代理服务器中存放有所请求的对象,则代理服务器会向该主机发回包含所请求对象的响应,如下图所示:
若代理服务器中没有所请求的对象,则代理服务器会向因特网上的原始服务器发送请求,原始服务器将包含有所请求对象的响应发回给代理服务器,代理服务器将该响应存入web缓存,然后给该主机发回该响应,如下图所示:
可以想象,如果web缓存的命中率比较高,则路由器R1和R2之间的链路上的通信量将会大大减少,因而可以减少校园网各主机访问因特网的时延
但是还是有疑问,如下图所示:
这是原始服务器中的某个文档,以及该文档在代理服务器当中的副本,假设原始服务器中的该文档已经被更改,之后校园网中的某台主机要请求该文档,它首先向校园网中的代理服务器发送请求,代理服务器找到该文档后将其封装在响应报文中发回给主机,这样主机所请求到的文档与原始服务器中的文档就不一致了,实际上原始服务器通常会给所响应的对象设定一个修改时间字段和一个有效日期字段,当校园网中的某台主机要请求原始服务器中的该文档时,它首先向校园网中的代理服务器发送请求,若代理服务器中的该文档未过期,则代理服务器将其封装在响应报文中发回给该主机,若代理服务器中的文档已经过期,则代理服务器会向因特网上的原始服务器发送请求,在请求报文中包含有一个首部字段为If-modified-since的首部行,该字段的取值就是该文档的修改日期,原始服务器根据该文档的修改日期,就可以判断出代理服务器中存储的该文档是否与自己存储的该文档一致,如果一致,则给代理服务器发送不包含实体主体的响应,状态码为304,短语为Not Modified
代理服务器重新更新该文档的有效日期,然后将该文档封装在响应报文中发回给主机,如果不一致,则给代理服务器发送封装有该文档的响应报文,如下图所示:
这样代理服务器就更新了该文档,然后将更新后的该文档封装在响应报文中发回该主机
简单总结,万维网缓存和代理服务器,代理服务器就是中间件下面的web缓存,如果一个文档和一个请求相同,则不需要在访问原始服务器去浪费时间,占用信道资源,web缓存直接给你打开,如果请求变化了,则通过一些手段改变原有的web缓存,例如,我不小心关闭了一个网页课程,我在打开,则就是原有的样子,而不是重新访问课程网站首页
最后我们在练习一下:
答案是选项C
我们来一起分析一下,请求报文的第一行为请求行,指明了请求方法GET,URL,HTTP版本,第二行为首部行,字段名为HOST,其值为网站的域名,选项B正确了,如下图所示:
练习题2: