第二章 网络应用 3 Web应用

第二章 网络应用
3 Web应用
3.1 Web应用概述
Web与HTTP
问题: Web是由什么构成?
答:Web是由网页构成,但只有网页是不够的,是所有的网页之间互相链接,从而形成一个极其庞大的信息网络和内容网络。
问题:网页包含了多个对象,那对象又是什么?
对象如HTML文件,JPEG图片,视频文件,动态脚本等。每个网页会有一个基本的HTML文件,有包含对其它对象引用的链接。

对象的寻址:
互联网上有众多的网页,因此我们需要对其进行寻址。我们之前讲过,网络进程间的通信需要经过进程的寻址,那现在需要对web进行寻址。
Web对象通过URL(Uniform Resoure Locator)统一资源定位器 进行寻址(RFC1738)
URL有一个基本的格式:

最前面是一个基本的协议, 然后是主机(域名或IP), 然后是端口号,最后是路径。

例子:
协议省略了HTTP,省略时我们就默认省略了HTTP。someDept是一个具体的路径,pic.gif是具体的文件名。URL使得Web所有的标识符都有了一个唯一的名字。

HTTP协议概述:
万维网应用遵循HTTP协议,叫做超文本传输协议(HyperText Transfer Protocol).
HTTP采用C/S架构。
客户机为浏览器,作用是请求、接收、展示Web对象。
服务器—Web Serve: 作用为响应客户的请求,发送对象给客户。

最典型的WEB serve 软件是Apache。
HTTP的两个版本:
1.0 RFC 1945
1.1 RFC 2068

HTTP使用TCP传输服务

HTTP是一种无状态的协议

问题:为什么用无状态?
1、有状态的协议更加复杂。
2、需要维护这个状态,如果客户机死机了,那么两边状态就不一致了,那么需要来解决这种不一致,代价比较高。

3.2 HTTP连接类型
我们已经知道,web所遵循的应用层协议是HTTP,我们也知道,HTTP依靠TCP建立连接。那么,在对TCP的使用方法上,HTTP具有两种连接方式。

HTTP两种连接方式
非持久性连接和持久性连接
在非持久性连接中,我们建立一个TCP连接后最多允许传输一个对象。(HTTP1.0)
在持久性连接中,我们允许TCP传输多个对象,如HTTP1.1
二者之间有什么不同?

非持久性连接的工作过程:

主机请求的是,www.someSchool.edu 主机上的someDepartment目录下的home.index文件
我们假设这个HTML文件里面包含了一个基本的文本,同时还包含了指向10个jpeg图片的链接,那这10张图片将在另外的10个文件内存放。
图中从上到下时间依次推进,左边均为客户机,右边均为服务器。
在非持久性连接中,HTTP把对象发送完之后,就会关闭TCP连接,并且告知客户机。
HTTP解析并显示html文件后,发下里面居然有10个指向jepg对象 的超链接,但是此时TCP连接已经关闭,所以没有办法,客户端将会重复1~5,直到把10张图片全部显示完。
类似的情况在日常生活中,比如网速比较慢,那么网页会先把文本显示出来,后来才把一张张图片显示完全。这个就说明先收到网页解析,然后再去请求对象。

问题:这个过程的时间有多长呢?
响应时间分析与建模
我们定义RTT(Round Trip Time)为从客户端发送一个很小的数据包到服务器并返回所经历的时间。
那么从浏览器开始(即把URL输入进去开始)一直到最后你得到的文件,响应时间究竟是多少?
首先,客户端发起、建立TCP连接,这个需要一个RTT;
然后会发送HTTP请求消息到HTTP服务器,然后服务器形成响应消息直到响应消息的前几个字到达,这又是一个RTT;
然后在陆陆续续,把响应消息所包含的文件或对象传输过来,因此最后的时间为响应消息所含的文件或对象所用的传输时间。
总时间: Total = 2RTT + 文件发送时间
图示:(这个图的要求必须会画,这是在学习网络,分析网络时间的一种重要方法)

结论:一个TCP连接只用来获取一个对象
响应时间 = 两个RTT + 文件传输时间

问题:非持久性连接存在什么问题?
答: 1 慢,每个对象都需要2个RTT以上的时间才能获得,如上面的例子,我们获取一个文件加上10个图片对象,我们至少需要22个RTT加上文件传输的时间
2 操作系统建立每个TCP连接需要开销资源(overhead)

问题:那么浏览器怎么做更好?
答:如果接收到的网页可以同时建立10个TCP连接,用并行的TCP连接以获取网络资源。但是注意,TCP连接的资源是十分宝贵的,这个代价对服务器将是十分巨大的。

因此,我们应该改成持久性连接。既然TCP连接的建立是需要代价的,那么我们应该多利用利用。那么应该怎么操作?
方法是网页传过来以后,想让服务器别急着关闭TCP,保持TCP连接的打开,后续的HTTP消息可以通过这个连接发送。
这个细分的话有两种类型,一个是无流水的持久性连接:
即客户端只有收到前一个响应后才发送新的请求,那这样每个被引用的对象耗时为1个RTT。
仍然以上面的例子,第一个网页的需要两个RTT,后面的10个对象需要10个RTT,那么总共需要12个RTT。
有没有更好的方法?下面介绍带有流水机制的持久性连接
带有流水机制的持久性连接:
客户端只要遇到一个引用对象就尽快发送请求。那么在这种情况下,收到所有的引用对象只需要耗时约1个RTT。
仍然以上面的例子,一个网页为两个RTT,然后里面的十个链接只需要1个RTT,加起来大约3个RTT就可以了。

思考一下:计算机的所有协议、机制、算法都是由程序来完成的,这个程序应该怎么编写?

3.3 HTTP消息格式
HTTP协议一共有两类消息,分别是请求消息和响应消息。
请求消息使用ASCII码来写的,如图所示

这个请求消息怎么看呢?
这个消息分成这样几部分:
第一行是请求行(request line),第一个词是请求的命令,GET是其中的一个,类似的还有POST、HEAD等。后面跟的是一个URL,最后面是HTTP的版本。
第2、3、4、5行为头部行,这个是可扩展的。
Host行记录了访问地址为www.someschool.edu,你可能会问,TCP连接已经建立,为什么还要声明需要访问的主机呢?
这个问题是个好问题,这里卖个关子,这个信息是有用的,在后面讲到缓存和代理服务器时,再来说明有什么用处。
第三行:User-agent 这个代表浏览器,这个比如说是Firefox等,这个信息如果告诉服务器,服务器可以根据浏览器类型发送适合你的版本。
第四行:Connection:在这里的close表示建立完这个连接你就可以关闭了。
第五行:fr表示法语,表示客户机期望的语言。服务器可能会准备多个版本,有中文的、英文的等,看你需要哪个版本就发送哪个版本
下面有一个空行,表明消息已经结束

HTTP请求消息的通用格式:

Entity Body包含的有所携带的数据。

问题:请求消息有必要携带数据吗?
答:有些网页可能存在一些表格,这个时候是你往服务器端发送数据,那就可以放到这里面了。
问题:浏览器怎么向服务器上传数据?
答:最基本的方法有两种,一种为POST方法,一种为GET方法。
POST方法即上图所示,把数据传到Entity Body,服务器会从Entity Body中提取数据。
另外一种,我们可以用URL方法,输入信息通过request行的URL字段中上传
如下图所示:

那么我们回顾一下方法的类型:

Head方法写的是什么意思?
这里告诉服务器:请不要把请求对象放在响应消息中,这样,服务器只返回前面头部那些信息,这个主要用来做测试。
HTTP1.1又增加了两种方法,
PUT方法,可以支持上传文件和保存,delete可以删除URL字段所指定的文件。

接下来来看响应消息:
响应消息仍然是通过ASCII码来写,所以可读,如下图所示

第一条为状态行,在此处表示请求消息已经OK
头部行 Date:表示WEB服务器生成响应消息的时间,注意,隔一行后还有一个时间,下面的时间是什么意思?
下面的时间表示这个网页的上次修改时间是1998年6月22日,
Serve:用的软件是Apache ,这个是最主流的Web服务器软件
接下来是内容长度文本类型,最下面是响应消息的具体内容。
以上即表示HTTP响应消息。
下面说一下响应行表示的信息:
注意上面,200表示OK,常用的还有如下几种

作业:
换一种方式体验HTTP,如果我们想体验一下HTTP的整个过程,我们可以使用telnet

到此为止,我们已经把web应用的基本内容介绍完毕,后面还有两个扩展性的话题。

3.4 Web应用之Cookie技术
HTTP协议是一种无状态的协议,服务器不会记录客户机的历史行为,那么就会带来一些问题。
问题:为什么需要cookie?
HTTP协议是无状态的,但是很多应用仍然需要服务器掌握客户端的状态,如上网购物,那么该如何实现?或者说如何实现购物车?比如说你浏览网页买东西,逛了5个小时,放在购物车30件东西,但等你结账时只剩下一件东西,这肯定是不行的,因此有些网络应用是需要有会话状态的,那么原有的HTTP协议就不够用了,因此我们引入cookie,

Cookie技术是什么? (RFC6265)
Cookie技术是某些网站为了辨别用户身份,进行回话(session)跟踪而存储在用户本地终端上的数据(通常经过加密)

Cookie是架设在HTTP上的一个组件,
HTTP响应消息中会增加一个cookie的头部行,因此可以想象,HTTP的头部行是可扩展的。
HTTP的请求消息也会增加cookie的头部行,客户端上有一个cookie文件,由浏览器管理,Web服务器端有专门的后台数据库,那么现在是否可以解决那个问题呢?
下面看演示

假设有一个客户要访问亚马逊,假设这个客户没有访问过,我们可以看到,客户端的cookie已经有一行了,ebay 8734 , 首次访问时,用的是常规的HTTP请求消息,即不带cookie的头部行,当服务器收到这个常规的请求消息后,一看,咦,这个客户此前并没有访问过亚马逊,好,服务器为客户创建一个ID,ID号是1678,然后把ID号和客户信息(比如说是IP)放到数据库里面,然后在返回的响应消息中做一点手脚,这个时候我们用响应消息的头部行,加一个set-cookie 1678,浏览器收到后,会在自己的cookie中增加一行 ,客户机再访问亚马逊时,请求消息的头部行就增加了一行 ,然后服务器再看见时,就知道是哪个用户发的消息,亚马逊就会看看这个用户看过啥,是否可以推荐点啥,然后就生成一些对该客户的一些特定的动作,然后再发给用户。你肯定有过类似的体验,购物网站会给你推荐一些相似的东西。

问题:Cookie有什么用?
答:
(1) Cookie可以用于身份认证,比如说登录输入用户名密码后,浏览器提示:是不是要保存你的用户名密码?这个用的就是cookie技术
(2) 购物车
(3) 推荐
(4) Web e-mail
问题:Cookie 有什么问题?
答:最大的问题是隐私问题,你在网络上的一举一动都是被监测的。
因此很多厂商都在研究cookie的替代技术。

在本节,我们需要理解以下内容:
1 需要理解cookie的本身
2 体会有状态和无状态
3 体会HTTP原来的协议中如何扩展

思考:

3.5 Web缓存/代理服务器技术
问题:什么是Web缓存/代理服务器技术?
答:可以在访问服务器的前提下满足客户端的HTTP请求。

问题:为什么要发明这一项技术?
答:这是一项性能优化的技术,我们可以想到,任何网络应用既有功能性的一面又有性能性的一面,这个大家要注意区分清楚。

Web缓存/代理服务器技术有如下三点性能优化:
1 缩短客户请求的响应时间
2 减少机构/组织的流量
3 在大范围内实现有效的内容分发,也可以称之为CDN,内容分发网络。

听上去好像很美好,那么是如何实现?
首先,它是如下所示的结构,在客户和服务器之间,架设了一个代理服务器,

用户在访问时,都会访问这个代理服务器,浏览器会向缓存/代理服务器发送所有的HTTP请求,如果说客户所请求的缓存在缓存服务器有,缓存会返回对象;如果没有的话,缓存服务器向原始的服务器发送HTTP请求,从而获取对象,然后返回给客户端并保存该对象。缓存既充当客户端,也充当服务器,这个一般由ISP来架设。

看例子:
Web缓存示例(1)

我们看这样一个场景,上图是一个机构,内容是一个局域网,局域网的速率为10 Mbps,局域网接入到互联网,速率为1.5Mbps,
假定:

性能分析:

解决方法1:掏钱,升级为10M带宽接入互联网,

网络性能分析:

问题:成本太高

方法2 web缓存
我们在机构内部增加一个缓存服务器,接入互联网的带宽不做改动,则:

一般情况下,缓存服务器的命中率在0.2~0.7之间,这里假定命中率为0.4
网络性能分析:
40%的请求立刻得到满足
60%的请求通过原始服务器满足
接入互联网的链路的利用率下降到60%,从而其延迟可以忽略不计,例如10微秒
总的平均延迟:互联网上的延迟 + 访问延迟 + 局域网延迟 = 0.62.01秒 + 0.4n微秒 < 1.4秒,响应时间居然比花钱升级带宽效果还好。

计算机技术中广泛适用缓存,因此缓存/代理服务器技术是个普适的技术。
现在有个问题:我们说:客户访问,如果对象在代理服务器上有,自然会返回给客户,但现在,代理服务器如何保证自己的缓存就是远端服务器上的新版本?或者说缓存服务器的对象是否和远端的一致,只有一致,提供的服务才是好的服务。
解决方法:HTTP有一个条件GET方法,我们之前提到过,HTTP请求有一个Last Modified,将其结合到一起,似乎就可以解决这个问题。
如下图所示:

我们说条件性GET的基本思想是,如果缓存是最新的版本,则不需要发送请求对象。
那么我们这样解决,我们在HTTP请求消息中声明所持有版本的日期,即:

如果远端服务器版本的日期在这个日期之后,则需要将新版本发送,如果版本日期一致,则远端服务器需要告诉我没有改动。
因此在服务器端:
如果缓存的版本是最新的,则响应消息不包含对象,返回 HTTP/1.0 304 Not Modified.
因此,客户访问缓存时,缓存有必要利用条件性GET的方法向服务器发送请求,当没有发生改变时,它节省了带宽,真正改变时,它使用了带宽。

到此为止,我们把Web应用非常系统的讲完了。
课后作业:

猜你喜欢

转载自blog.csdn.net/qq_36475346/article/details/82926663