#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)

一 万维网概述 万维网 WWW(World Wide Web) 并非某种特殊的计算机网络。 万维网是一个大规模的、联机式的信息储藏所,英文简称为 Web。
万维网用链接的方法能非常方便地从互联网上的一 个站点访问另一个站点(也就是所谓的 “链接到另一个站点”),从而主动地按需获取丰富的信息。
下图 1 说明了万维网提供分布式服务的特点。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图1万维网提供分布式服务
上图 1 画出了五个万维网上的站点,它们可以相隔数千公里,但都必须连接到互联网上。每一个万维网站点都存放了许多文档。在这些文档中有一些地方的文字是用特殊方式显示的(例如用不同的颜色,或添加了下划线),而当我们将鼠标移动到这些地方时,鼠标的箭头就变成了一只手的形状。这就表明这些地方有一个链接(Link)(这种链接有时也称为超链 Hyperlink),如果我们在这些地方点击鼠标,就可以从这个文档链接到可能相隔很远的另一个文档。经过一定的时延(几秒钟、几分钟甚至更长,取决于所链接的文档的大小和网络的拥塞情况),在我们的计算机屏幕上就能将远方传过来的文档显示出来。

例如,站点 A 的某个文档中有两个地方①和②可以链接到其他的站点。当我们点击链接①时,就可链接到站点 B 的某个文档。若点击②则可链接到站点 E。站点 B 的文档也有两个地方③和④有链接。若点击链接③就可链接到站点 D,而点击链接④就链接到站点 E,但从 E 的这个文档已不能继续链接到其他任何的站点。站点 D 的文档中有两个地方⑤和⑥有链接,可以分别链接到站点 A 和站点 C。
万维网的出现使网站数按指数规律增长,因此,万维网的出现是互联网发展中的一个非常主要的里程碑。
万维网是一个分布式的超媒体(Hypermedia) 系统,它是超文本(Hypertext) 系统的扩充。所谓超文本是指包含指向其他文档的链接的文本(text)。也就是说,一个超文本由多个信息源链接成,而这些信息源可以分布在世界各地,并且数目也是不受限制的。利用一个链接可使用户找到远在异地的另一个文档,而这个文档又可链接到其他的文档,依此类推。这些文档可以位于世界上任何一个接在互联网上的超文本系统中。超文本是万维网的基础。
超媒体与超文本的区别是文档内容不同。超文本文档仅包含文本信息,而超媒体文档还包含其他表示方式的信息,如图形、图像、声音、动画以及视频图像等。
万维网以客户服务器方式工作,其中客户端程序就是运行在用户主机上的浏览器,万维网文档所驻留的主机则运行服务器端程序,因此这台主机也称为万维网服务器,简称为Web服务器。万维网的这种客户服务器工作方式也称之为 B/S 模式。其中,B 是 Browser 的首字母,S 是 Server 的首字母。客户程序向服务器程序发出请求,服务器程序向客户程序返回客户所要的万维网文档。在一个客户程序主窗口上显示出的万维网文档称为页面(Page)。
从以上所述可以看出,万维网必须解决以下几个问题:
(1)怎样标志分布在整个互联网上的万维网文档?
(2)用什么样的协议来实现万维网上的各种链接?
(3)怎样使不同作者创作的不同风格的万维网文档,都能在互联网上的各种主机上显示出来,同时使用户清楚地知道在什么地方存在着链接?
(4)怎样使用户能够很方便地找到所需的信息?
为了解决第一个问题,万维网使用统一资源定位符(Uniform Resource Locator)来标识万维网上的各种文档,并使每一个文档在整个互联网的范围内具有唯一的标识符 URL。
为了解决上述的第二个问题,就要使万维网客户程序与万维网服务器程序之间的交互遵守严格的协议,这就是超文本传送协议 HTTP(HyperText Transfer Protocol)。HTTP 是一个应用层协议,它使用 TCP 连接进行可靠的传送。
为了解决上述的第三个问题,万维网使用超文本标记语言 HTML(HyperText Markup Language),使得万维网页面的设计者可以很方便地用链接从本页面的某处链接到互联网上的任何一个万维网页面,并且能够在自己的主机屏幕上将这些页面显示出来。最后,用户可使用搜索工具在万维网上方便地查找所需的信息。
二统一资源定位符 - URL 【#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)】统一资源定位符 URL 是用来表示从互联网上得到的资源位置和访问这些资源的方法。URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。由此可见,URL 实际上就是在互联网上的资源的地址。只有知道了这个资源在互联网上的什么地方,才能对它进行操作。显然,互联网上的所有资源,都有一个唯一确定的 URL。
这里所说的 “资源” 是指在互联网上可以被访问的任何对象,包括文件目录、文件、文档、图形、声音等,以及与互联网相连的任何形式的数据。“资源” 还包括电子邮件的地址和 USENET 新闻组,或 USENET 新闻组中的报文。
<注> USENET 新闻组实际上是一个世界范围的电子公告牌系统 BBS(Bulletin Board System),用于发布公告、新闻和各种文章供大家使用。
URL 相当于一个文件名在网络范围的扩展。因此,URL 是与互联网相连的机器上的任何一个可访问对象的指针。由于访问不同对象所使用的协议不同,所以 URL 还指出读取某个对象时所使用的协议。URL 的一般形式由以下四个部分组成:
<协议>://<主机>:<端口号>/<路径>

URL 的第一部分是最左边的<协议>。这里的<协议>就是指出使用什么协议来获取该万维网文档。现在最常用的协议就是 http(或 https),其次是 ftp (文件传送协议 FTP)。
在<协议>后面的 “ :// ” 是规定的格式。它的右边是第二部分<主机>,它指出这个万维网文档是在哪一台主机上。这里的<主机>就是指该主机在互联网上的域名。再后面是第三部分和第四部分<端口>和<路径>,有时可省略。
现在有些浏览器为了方便用户,在输入 URL 时,可以把最前面的 “ http:// ” 甚至把主机名最前面的 “ www ” 省略,然后浏览器替用户把省略的字符补上。例如,用户只要键入 baidu.com,浏览器就自动把未键入的字符补齐,变成 http://www.baidu.com。
2.1 使用 HTTP 的 URL
下面我们简单介绍使用得最多的一种 URL。
对于万维网的网点的访问要使用 HTTP 协议。HTTP 的 URL 的一般形式是:
http://<主机>:<端口>/<路径>

HTTP 的默认端口号是 80,通常可以省略。若再省略文件的<路径>项,则 URL 就指到互联网上的某个主页(Home page)。主页是个很重要的概念,它可以是以下几种情况之一:
(1)一个 WWW 服务器的最高级别的页面。
(2)某一个组织或部门的一个定制的页面或目录。从这样的页面可链接到互联网上的与本组织或部门相关的其他站点。
(3)由某一个人自己设计的描述他本人情况的 WWW 页面。
例如,要查看有关清华大学的信息,就可先进入到清华大学的主页,其 URL 为:http://www.tsinghua.edu.cn
这里省略了默认的端口号 80。我们从清华大学的主页入手,就可以通过许多不同的链接找到所要查找的各种有关清华大学各个部门的信息。
更复杂的一些路径是指向层次结构的从属页面。例如:
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图1清华大学的页面路径 是清华大学的 “院系设置” 页面的 URL。注意:上面的 URL 中使用了指向文件的路径,而文件名就是最后的 index.html。后缀 htm(有时可写为 html)表示这是一个超文本标记语言 HTML 写出的文件。
URL里面的字母不分大小写,但为了便于阅读,有时故意使用一些大写字母。
用户使用 URL 并非仅仅能够访问万维网的页面,而且还能够通过 URL 使用其他的互联网程序,如 FTP 或 USENET 新闻组等。更重要的是,用户在使用这些应用程序时,只使用一个程序,即浏览器。这显然是非常方便的。
三超文本传送协议 - HTTP 3.1 HTTP 的操作过程
HTTP 协议定义了浏览器(即万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。从层次角度看,HTTP 是面向事务的(transaction-oriented)应用层协议,它是万维网撒上可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。请注意,HTTP 不仅传送完成超文本跳转所必须的信息,而且也传送任何可从互联网上得到的信息,如文本、超文本、声音和图像等。
万维网的大致工作过程如下图 2 所示。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图2万维网的工作过程 每个万维网网点都有一个服务器进程,它不断地监听 TCP 的端口 80,以便发现是否有浏览器(即万维网客户。请注意,浏览器和万维网客户是同义词)向它发起连接建立请求。一旦监听到连接建立请求并建立了 TCP 连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应。最后,TCP 连接就被释放了。在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则。这些格式和规则就是超文本传送协议 HTTP。
HTTP 规定在 HTTP 客户与 HTTP 服务器之间的每次交互,都由一个 ASCII 码串构成的请求和一个类似的通用互联网扩充,即 “类 MIME(MIME-like)” 的响应组成。HTTP 报文通常都使用 TCP 连接传送。
用户浏览页面的方法有两种。一种方法是在浏览器的地址窗口中键入所要找的页面的 URL。另一种方法是在某一个页面中用鼠标点击一个可选部分,这时浏览器会自动在互联网上找到所要链接的页面。
HTTP 使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。HTTP 不必考虑数据在传输过程中被丢弃又怎样被重传。但是,HTTP 协议本身是无连接的。这就是说,虽然 HTTP 使用了 TCP连接,但通信的双方在交换 HTTP 报文之前不需要先建立 HTTP 连接。在 1997 年以前使用的是 [RFC 1945] 定义的 HTTP/1.0 协议。现在普遍使用的升级版本 HTTP/1.1 已是互联网建议标准 [RFC 7231]。
HTTP 协议是无状态的(stateless)。也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时相同(假定现在服务器还没有把该页面更新),因为服务器并不记得曾经访问过的这个客户,也不记得为该客户曾经服务过多少次。HTTP 的无状态特性简化了服务器的设计,使服务器更容易支持大量并发的 HTTP 请求。
下面我们粗略估算一下,从浏览器请求一个万维网文档到收到整个文档所需的时间(图 3)。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图3请求一个万维网文档所需的时间 用户在点击鼠标链接某个万维网文档时,HTTP 协议首先要和服务器建立 TCP 连接。这需要使用三报文握手。当建立 TCP 连接的三报文握手的前两部分完成后(即经过一个 RTT 时间后),万维网客户就把 HTTP 请求报文,作为建立 TCP 连接的三报文握手中的第三个报文的数据部分,发送给万维网服务器。服务器收到 HTTP 请求报文后,就把所请求的文档作为响应报文返回给客户。
从上图 3 可看出,请求一个万维网文档所需的时间是该文档的传输时间(与该文档大小成正比)+ 两倍往返时间 RTT(一个 RTT 用于建立TCP 连接,另一个 RTT 用于请求和接收万维网文档)。TCP 建立连接的三报文握手的第三个报文段中的数据部分,就是客户对万维网文档的请求报文。
  • RTT(Round Trip Time,往返时间):一个TCP连接的往返时间,即数据发送时刻到接收到确认的时刻的时间间隔。
HTTP/1.0 的主要缺点,就是每请求一个万维网文档就要有两倍 RTT 的开销。若一个主页上有很多链接的对象(如图片等)需要依次进行链接,那么每一次链接下载都导致 2 × RTT 的开销。另一种开销就是万维网客户和服务器每一次建立新的 TCP 连接都要分配缓存和变量。特别是万维网服务器往往要同时服务于大量客户的请求,所以这种非持续连接会使万维网服务器的负担很重。好在浏览器能够打开 5 ~ 10 个并行的 TCP 连接,而每一个 TCP 连接处理客户的一个请求。因此,使用并行 TCP 连接可以缩短响应时间。
HTTP/1.1 协议较好地解决了这个问题,它使用了持续连接(persistent connection)。所谓持续连接就是万维网服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户(浏览器)和该服务器可以继续在这条连接上传送后续的 HTTP 请求和响应报文。这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。目前一些流行的浏览器(如 IE 11.0)的默认设置就使用了 HTTP/1.1。如果用户不愿意使用持续连接的浏览器,可以选择 IE 浏览器上面的 “工具”—> “Internet 选项”—> “高级”等项目,把 “HTTP/1.1 设置” 的选择取消即可。
HTTP/1.1 协议的持续连接有两种工作方式,即非流水线方式(without pipelining) 和 流水线方式(with pipelining)。
非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在 TCP 连接已建立后,客户每访问一次对象都要用去一个往返时间 RTT。这比非持续连接要用去两倍 RTT 的开销,节省了建立 TCP 连接所需的一个 RTT 时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其 TCP 连接就处于空闲状态,浪费了服务器资源。
流水线方式的特点,是客户在收到 HTTP 的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需花费一个 RTT 时间。流水线工作方式使 TCP 连接中的空闲时间减少,提高了下载文档效率。
3.2 代理服务器
代理服务器(Proxy server)是一种网络实体,它又称为万维网高速缓存(Web Cache)。代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按 URL 的地址再次去互联网访问该资源。代理服务器可在客户端或服务器端工作,也可在中间系统工作。下面我们用例子说明它的作用。
设下图4(a) 是校园网不使用代理服务器的情况。这时,校园网中所有的计算机都通过 2 Mbit/s 专线链路(R1-R2)与互联网上的源点服务器建立 TCP 连接。因而校园网各计算机访问互联网的通信量往往会使这条 2 Mbit/s 的链路过载,使得时延大大增加。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图4代理服务器的作用 图4(b) 是校园网使用代理服务器的情况。这时,访问互联网的过程是这样的:
(1)校园网的计算机中的浏览器向互联网的服务器请求服务时,就先和校园网的代理服务器建立 TCP 连接,并向代理服务器发出 HTTP 请求报文(见图4(b)中的①)。
(2)若代理服务器已经存放了所请求的对象,代理服务器就把这个对象放入 HTTP 响应报文中直接返回给计算机的浏览器。
(3)否则,代理服务器就代表发出请求的用户浏览器,与互联网上的源点服务器(Origin server) 建立 TCP 连接(如图4(b)中的②所示),并发送 HTPP 请求报文。
(4)源点服务器把所请求的对象放在 HTTP 响应报文中返回给校园网的代理服务器。
(5)代理服务器收到这个对象后,先复制在自己的本地存储器中(留待以后用),然后再把这个对象放在 HTTP 响应报文中,通过已建立的 TCP 连接(见图4(b)中的①),返回给请求该对象的浏览器。
我们注意到,代理服务器有时是作为服务器(当接受浏览器的 HTTP 请求时),但有时却作为客户(当向互联网上的源点服务器发送 HTTP 请求时)。
在使用代理服务器的情况下,由于有相当大一部分通信量局限在校园网的内部,因此,2 Mbit/s 专线链路(R1-R2)上的通信量大大减少,因而减少了访问互联网的时延。
3.3 HTTP 的报文结构
HTTP有两类报文:
(1)请求报文:从客户向服务器发送请求报文,见图5(a)。
(2)响应报文:从服务器到客户的应答报文,见图5(b)。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图5HTTP的报文结构 由于 HTTP 是面向文本的(Text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而各个字段的长度都是不确定的。
HTTP 请求报文和响应报文都是由三个部分组成的。可以看出,这两种报文格式的区别就是开始行不同。
(1)开始行,用于区分是请求报文还是响应报文。在请求报文中的开始行叫做请求行(Request-Line),而在响应报文中的开始行叫做状态行(Status-Line)。在开始行的三个字段之间都以空格分隔,最后的 “CR” 和 “LF” 分别代表 “回车” 和 “换行”。
(2)首部行,用来说明浏览器、服务器或报文主体的一些信息。首部可以有好几行,但也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有 “回车” 和 “换行”。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
(3)实体主体(entity body),在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。
  • 下面介绍 HTTP 请求报文的一些主要特点。
请求报文的第一行 “请求行” 只有三个内容,即方法、请求资源的 URL,以及 HTTP 的版本。
请注意:这里的名词 “方法”(method) 是面向对象技术中使用的专门名词。所谓 “方法” 就是对请求的对象进行的操作,这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的。下表 1 给出了请求报文中常用的几种方法。
表1 HTTP 请求报文的一些方法
方法(操作) 意义
OPTION 请求一些选项的信息
GET 请求读取由 URL 所标志的信息
HEAD 请求读取由 URL 所标志的信息的首部
POST 给服务器添加信息(例如,注释)
PUT 在指明的 URL 下存储一个文档
DELETE 删除指明的 URL 所标志的资源
TRACE 用来进行环回测试的请求报文
CONNECT 用于代理服务器
下面是 HTTP 的请求报文的开始行(即请求行)的格式。请注意,在 GET 后面有一个空格,接着是某个完整的 URL,其后面又有一个空格,最后是 HTTP/1.1。
GET http://www.xyz.edu.cn/dir/index.htm HTTP/1.1

下面是一个完整的 HTTP 请求报文的例子:
GET /dir/index.htm HTTP/1.1{请求行使用了相对URL} Host: www.xyz.edu.cn{此行是首部行的开始。这行给出主机的域名} Connection: close{告诉服务器发送完请求的文档后就可释放连接} User-Agent: Mozilla/5.0{表明用户代理是使用火狐浏览器 Firefox} Accept-Language: cn{表示用户希望优先得到中文版的文档} {请求报文的最后还有一个空行}

<说明> 在请求行使用了相对 URL(即省略了主机的域名)是因为下面的首部行(即第 2 行)给出了主机的域名。第 3 行是告诉服务器不使用持续连接,表示浏览器希望服务器在传送完所请求的对象后即关闭 TCP 连接。这个请求报文没有实体主体。
  • HTTP 响应报文的主要特点
每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行。
状态行包括三项内容,即 HTTP 的版本,状态码,以及解释状态码的简单短语。
状态码(Status-Code) 都是三位数字的,分为 5 大类,原先有 33 种[RFC 2616],后来又增加了几种[RFC 6585]。这 5 大类的状态码都是以不同的数字开头的。
  • 1xx:表示通知信息,如请求收到了或正在进行处理。
  • 2xx:表示成功,如接受或知道了。
  • 3xx:表示重定向,如要完成请求还必须采取进一步的行动。
  • 4xx:表示客户的差错,如请求中有错误的语法或不能完成。
  • 5xx:表示服务器的差错,如服务器失效无法完成请求。
下面三种状态行在响应报文中是经常见到的。
HTTP/1.1 202 Accepted{接受} HTTP/1.1 400 Bad Request{错误的请求} HTTP/1.1 404 Not Found{找不到}

若请求的网页从 http://www.ee.xyz.edu/index.html 转移到一个新的地址,则响应报文的状态行和一个首部行就是下面的形式:
HTTP/1.1 301 Moved Permanently{永久性地转移了} Location: http://www.xyz.edu/ee/index.html{新的URL}

3.4 在服务器上存放用户的信息 - Cookie
在上文 3.1 节 “HTTP的操作过程” 中已经讲过,HTTP 是无状态的。这样做虽然简化了服务器的设计,但在实际工作中,一些万维网站点却常常希望能够识别用户。例如,在网上购物时,一个顾客要购买很多物品。当他把选好的一件物品放入 “购物车” 后,他还要继续浏览和选购其他物品。因此,服务器需要记住用户的身份,使他接着选购的一些物品能够放入同一个 “购物车” 中,这样就便于集中结账。有时某些万维网站点也可能想限制某些用户的访问。要做到这点,可以在 HTTP 中使用 Cookie。在 [RFC 6265] 中对 Cookie 进行了定义,规定万维网站点可以使用 Cookie 来跟踪用户。Cookie 原意是 “小甜饼”(广东人用方言音译为 “曲奇”),目前尚无标准译名,在这里 Cookie 表示在 HTTP 服务器和客户之间传递的状态信息。现在很多网站都已广泛使用 Cookie。
Cookie 是这样工作的。当用户 A 浏览某个使用 Cookie 的网站时,该网站的服务器就为 A 产生一个唯一的识别码,并以此作为索引在服务器的后端数据库中产生一个项目。接着在给 A 的 HTTP 响应报文中添加一个叫做 Set-cookie 的首部行。这里的 “首部字段名” 就是 “Set-cookie”,而后面的 “值” 就是赋予该用户的 “识别码”。例如这个首部行是这样的:
Set-cookie: 31d4d96e407aad42

当 A 收到这个响应时,其浏览器就在它管理的特定 Cookie 文件中添加一行,其中包括这个服务器的主机名和 Set-cookie 后面给出的识别码。当 A 继续浏览这个网站时,每发送一个 HTTP 请求报文,其浏览器就会从其 Cookie 文件中取出这个网站的识别码,并放到 HTTP 请求报文的 Cookie 首部行中:
Cookie: 31d4d96e407aad42

于是,这个网站就能跟踪用户 31d4d96e407aad42(即用户A)在该网站的活动。需要注意的是,服务器并不需要知道这个用户的真实姓名以及其它信息。但服务器能够知道用户 31d4d96e407aad42 在什么时间访问了哪些页面,以及访问这些页面的顺序。如果 A 是在网上购物,那么这个服务器可以为 A 维护一个所购物品的列表,使 A 在结束这次购物时可以一起结账。
如果 A 在几天后再次访问这个购物网站,那么他的浏览器会在其 HTTP 请求报文中继续使用首部行 Cookie: 31d4d96e407aad42,而这个网站服务器根据 A 过去的访问记录可以向他推荐商品。如果 A 已经在该网站登记过和使用过信用卡付费,那么这个网站就已经保存了 A 的姓名、电子邮件地址、信用卡号码等信息。这样,当 A 继续在该网站购物时,只要还使用同一台电脑上网,由于浏览器产生的 HTTP 请求报文中都携带了同样的 Cookie 首部行,服务器就可利用 Cookie 来验证出这是用户 A,因此以后 A 在这个网站购物时就不必重新在键盘上输入姓名、信用卡号码等信息。这对顾客显然是很方便的。
尽管 Cookie 能够简化用户网上购物的过程,但 Cookie 的使用一直引起很多争议。有人认为 Cookie 会把计算机病毒带到用户的计算机中。其实这是对 Cookie 的误解。Cookie 只是一个小小的文本文件,不是计算机的可执行程序,因此不可能传播计算机病毒,也不可能用来获取用户计算机硬盘中的信息。对于 Cookie 的另一个争议,是关于用户隐私的保护问题。例如,网站服务器知道了 A 的一些信息,就有可能把这些信息出卖给第三方。Cookie 还可用来收集用户在万维网网站上的行为。这些都属于用户个人的隐私。有些网站为了使顾客放心,就公开声明他们会保护顾客的隐私,绝对不会把顾客的识别码或个人信息出售或转移给其他厂商。
为了让用户有拒绝接受 Cookie 的自由,在浏览器中用户可自行设置接受 Cookie 的条件。例如在浏览器 IE 11.0 中,选择工具栏中的 “工具”—>“Internet选项” —> “隐私” —> “高级” 选项中设置。它有六个可选项,如下图 6 所示。最高的位置是阻止所有的 Cookie,而最低的位置是接受所有 Cookie,中间的位置是在不同条件下可以接受 Cookie。用户可根据自己的情况对 IE 浏览器进行必要的设置。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图6Cookie设置选项 四万维网的文档 - HTML 4.1 超文本标记语言 HTML
要使任何一台计算机都能显示出任何一个万维网服务器上的页面,就必须解决页面制作的标准化问题。超文本标记语言 HTML(HyperText Markup Language) 就是一种制作万维网页面的标准语言,它消除了不同计算机之间信息交流的障碍。但请注意,HTML 并不是应用层协议,它只是万维网浏览器使用的一种语言。由于 HTML 非常易于掌握且实施简单,因此它很快就成为了万维网的重要基础 [RFC 2854]。官方的 HTML 标准由万维网联盟 W3C(即 WWW Consortium)负责制定。有关 HTML 的一些参考资料[W-HTML]。从 HTML 在 1993 年问世后,就不断地对其版本进行更新。现在最新的版本是 HTML 5.0(2014年9月发布),新的版本增加了在页面中嵌入音频、视频以及交互式文档等功能。现在一些主流的浏览器都支持 HTML 5.0。
HTML 定义了许多用于排版的命令,即 “标签”(tag)。例如, 表示后面开始用斜体字排版,而 则表示斜体字排版到此结束。HTML 把各种标签嵌入到万维网的页面中,这样就构成了所谓的 HTML 文档。HTML 文档是一种可以用任何文本编辑器(例如,Windows的记事本 Notepad)创建的 ASCII 码文件。但应注意,仅当 HTML 文档是以 .html 或 .htm 为后缀时,浏览器才对这样的 HTML 文档的各种标签进行解释。如果 HTML 文档改为以 .txt 为其后缀,则 HTML 解释程序就不对标签进行解释,而浏览器只能看见原来的文本文件。
并非所有的浏览器都支持所有的 HTML 标签。若某一个浏览器不支持某一个 HTML 标签,则浏览器将忽略此标签,但在一对不能识别的标签之间的文本仍然会被显示出来。
下面是一个简单例子,用来说明 HTML 文档中标签的用法。在每一个语句后面的花括号中的字是注释说明,在实际的 HTML 文档中并没有这种注释。
{HTML文档开始} {首部开始} 一个HTML的例子{"一个HTML的例子"是文档的标题} {首部结束} {主体开始} HTML很容易掌握{"HTML很容易掌握"是主体的1级题头}这是第一个段落。
{和
之间的文字是一个段落}这是第二个段落。
{和
之间的文字是一个段落} {主体结束} {HTML文档结束}

把上面的 HTML 文档保存为文件名是 HTML-example.html(注意:实际的文档中没有注释部分)。当浏览器读取该文档后,就按照 HTML 文档中的各种标签,根据浏览器所使用的显示器的尺寸和分辨率大小,重新进行排版并显示出来。下图 7 表示 360极速浏览器在计算机上显示出的与该文档有关部分的画面。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图7在屏幕上显示的HTML文档主体部分的例子 文档的标题(title) “一个HTML的例子” 显示在浏览器最上面的标题栏中。文件的路径显示在地址栏中。再下面就是文档的主体部分。主体部分的题头(heading),即文档主体部分的标题 “HTML很容易掌握”,用较大的字号显示出来,因为在标签中指明了使用的是 1 级题头。
目前已开发出了很好的制作万维网页面的软件工具,使我们能够像使用 Word 文字处理器那样很方便地制作各种页面。即使我们用 Word 文字处理器编辑了一个文件,但只要在 “另存为(Save as)” 时选取文件后缀为 .htm 或 .html,就可以很方便地把 Word 的 .doc 格式文件转换为浏览器可以显示的 HTML 格式的文档。
HTML 允许在万维网页面插入图像。一个页面本身带有的图像称为内含图像(inline image)。HTML 标准并没有规定该图像的格式。实际上,大多数浏览器支持 GIF 和 JPEG 文件。很多格式的图像占据的存储空间太大,因而这种图像在互联网传送时就很浪费时间。例如,一幅位图文件(.bmp) 可能要占用 500 ~ 700 KB 的存储空间。但若将此图像改存为经压缩的 .gif 格式,则可能只有十几个KB,大大减少了存储空间。
HTML 还规定了链接的设置方法。我们知道每个链接都有一个起点和终点。链接的起点说明在万维网页面中的什么地方可引出一个链接。在一个页面中,链接的起点可以是一个字或几个字,或是一幅图,或是一段文字。在浏览器所显示的页面上,链接的起点是很容易识别的。在以文字作为链接的起点时,这些文字往往用不同的颜色显示(例如,一般的文字用黑色字时,链接起点的文字往往使用蓝色字),甚至还会加上下划线(一般由浏览器来设置)。当我们将鼠标移动到一个链接的起点时,表示鼠标位置的箭头就变成了一只手。这时只要点击鼠标,这个链接就被激活。
链接的站点可以是其他网站上的页面。这种链接的方式叫做远程链接。这时必须在 HTML 文档中指明链接到的网站的 URL。有时链接可以指向本计算机中的某一个文件或本文件中的某处,这叫做本地链接。这时必须在 HTML 文档中指明链接的路径。
实际上,现在这个链接方式已经不局限于用在万维网文档中。在最常用的 Word 文字处理器的工具栏中,也设有 “插入超链接” 的按钮。只要点击这个按钮,就可以看到设置超链接的窗口。用户可以很方便地在自己写的 Word 文档中设置各种链接的起点和终点。
最后,简单介绍一下和浏览器有关的几种其他语言。
  • XML
XML(Extensible Markup Language) 是可扩展标记语言,它和 HTML 很相似。但 XML 的设计宗旨是传输数据,而不是显示数据(HTML 是为了在浏览器上显示数据)。更具体些,XML 用于标记电子文件,使其具有结构性的标记语言,可用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 是一种简单、与平台无关并被广泛采用的标准。XML 相对于 HTML 的优点是它将用户界面与结构化数据分隔开来。这种数据与显示的分离使得集成来自不同源的数据成为可能。客户信息、订单、研究结果、账单付款、病历、目录数据及其他信息都可以转换为 XML。XML 不是要替换 HTML,而是对 HTML 的补充。XML 标记由文档的作者定义,并且是无限制的。HTML 标记则是预定义的;HTML 作者只能使用当前 HTML 版本的标准所支持的标记。
  • XHTML
XHTML(Extensible HTML) 可扩展超文本标记语言,它与 HTML 4.01 几乎是相同的。但 XHTML 是更严格的 HTML 版本,也是一个 W3C 标准(2000年1月指定),是作为一种 XML 应用被重新定义的 HTML,并将逐步取代 HTML。所有新的浏览器都支持 XHTML。
  • CSS
CSS(Cascading Style Sheets) 层叠样式表,它是一种样式表语言,用于为 HTML 文档定义布局。CSS 与 HTML 的区别就是:HTML 用于结构化内容,而 CSS 则用于格式化结构化内容。例如,在浏览器上显示的字体、颜色、边距、高度、宽度、背景图像等方面,都能够给出精确的定义。现在所有的浏览器都支持函 CSS。
4.2 动态万维网文档
上面讨论的万维网文档只是万维网文档中最基本的一种,即所谓的静态文档(static document)。静态文档在文档创作完毕后就存放在万维网服务器中,在被用户浏览的过程中,内容不会改变。由于这种文档的内容不会改变,因此用户对静态文档的每次读取所得到的返回结果都是相同的。
静态文档最大的优点是简单。由于 HTML 是一种排版语言,因此静态文档可以由不懂程序设计的人员来创建。但静态文档的缺点是不太灵活。当信息变化时就要由文档的作者手工对文档进行修改。可见,变化频繁的文档不适于做出静态文档。
动态文档(dynamic document) 是指文档的内容是在浏览器访问万维网服务器时才由应用程序动态创建的。当浏览器请求到达时,万维网服务器要运行另一个应用程序,并把控制转移到此应用程序。接着,该应用程序对浏览器发来的数据进行处理,并输出 HTTP 格式的文档,万维网服务器把应用程序的输出作为对浏览器的响应。由于对浏览器每次请求的响应都是临时生成的,因此用户通过动态文档所看到的内容是不断变化的。动态文档的主要优点是具体报告当前最新信息的能力。例如,动态文档可用来报告股市行情、天气预报或民航售票情况等内容。但动态文档的创建难度比静态文档大的高,因此动态文档的开发不是直接编写文档本身,而是编写用于生成文档的应用程序,这就要求动态文档的开发人员必须会编程,而所编写的程序还要通过大范围的测试,以保证输入的有效性。
动态文档和静态文档之间的主要差别体现在服务器一端。这主要是文档内容的生成方法不同。而从浏览器的角度看,这两种文档并没有区别。动态文档和静态文档的内容都遵循 HTML 所规定的格式,浏览器仅根据在屏幕上看到的内容无法判定服务器送来的是哪一种文档,只有文档的开发者才知道。
从以上所述可以看出,要实现动态文档就必须在以下两个方面对万维网服务器的功能进行扩充:
(1)应增加另一个应用程序,用来处理浏览器发来的请求数据,并创建动态文档。
(2)应增加一个机制,用来使万维网服务器将浏览器发来的数据传送给这个应用程序,然后万维网服务器能够解释这个应用程序的输出,并向浏览器返回 HTML 文档。
下图 8 是扩充了功能的万维网服务器的示意图。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图8扩充了功能的万维网服务器 通过上图 8 可以看到,万维网服务器增加了一个机制,叫做通用网关接口 CGI(Common Gateway Interface)。CGI 是一种标准,它定义了动态文档应如何创建,输入数据应如何提供给应用程序,以及输出结果应如何使用。
在万维网服务器中新增加的应用程序叫做 CGI 程序。取这个名字的原因是:万维网服务器与 CGI 的通信遵循 CGI 标准。“通用” 是因为这个标准所定义的规则对其他任何语言都是通用的。“网关” 二字的出现是因为 CGI 程序还可能访问其他的服务器资源,如数据库或图形软件包,因而 CGI 程序的作用有点像一个网关。也有人将 CGI 程序简称为 网关程序。“接口” 是因为有一些已定义好的变量和调用等可供其他 CGI 程序使用。需要注意的是:在看到 CGI 这个名词时,应弄清是指 CGI 标准,还是指 CGI 程序。
CGI 程序的正式名字是 CGI 脚本(script)。按照计算机科学的一般概念,“脚本” 指的是一个程序,它被另一个程序(解释程序)而不是计算机的处理机来解释或执行。有一些语言专门作为脚本语言(script language),如 Perl,Lua,REXX(在 IBM 主机上使用),JavaScript 以及 Tcl/Tk 等。脚本也可用一些常用的编程语言写出,如 C、C++等。使用脚本语言可更容易和更快地进行编码,这对一些有限功能的小程序是很合适的。但一个脚本程序运行起来比一般的编译程序要慢,因为它的每一条指令先要被另一个程序来处理(这就要一些附加的指令),而不是直接被指令处理器来处理。脚本不一定是一个独立的程序,它可以是一个动态装入的库,甚至是服务器的一个子程序。
CGI 程序又称为 cgi-bin 脚本,这是因为在许多万维网服务器上,为便于找到 CGI 程序,就将 CGI 程序放在 /cgi-bin 的目录下。
4.3 活动万维网文档
随着 HTTP 和万维网浏览器的发展,上一节所述的动态万维网文档已明显不能满足发展的需要。这是因为,动态文档一旦建立,它所包含的信息内容也就固定下来而无法及时刷新屏幕。另外,像动画之类的显示效果,动态文档也无法提供。
有两种技术可用于浏览器屏幕显示的连续更新。一种技术称为服务器推送(Server push),这种技术是将所有的工作都交给服务器。服务器不断地运行与动态文档相关联的应用程序,定期更新信息,并发送更新过的文档。
尽管从用户的角度看,这样做可达到连续更新的目的,但这也有很多的缺点。首先,为了满足很多客户的请求,服务器就要运行很多服务器推送程序。这将造成过多的服务器开销。其次,服务器推送技术要求服务器为每一个浏览器客户维持一个不释放的 TCP 连接。随着 TCP 连接的数目增加,每一个连接所能分配到的网络带宽就会下降,这就导致网络传输时延的增大。
另一种提供屏幕连续更新的技术是活动文档(active document)。这种技术是把所有的工作都转移到浏览器端。每当浏览器请求一个活动文档时,服务器就返回一段活动文档程序副本,使该程序副本在浏览器端运行。这时,活动文档程序可与用户直接交互,并可连续地改变屏幕的显示。只要用户运行活动文档程序,活动文档的内容就可以连续地改变。由于活动文档技术不需要服务器的连续更新推送,对网络带宽的要求也不会太高。
从传送的角度看,浏览器和服务器都把活动文档看成是静态文档。在服务器上的活动文档的内容是不变的,这点和动态文档时不同的。浏览器可在本地缓存一份活动文档的副本。活动文档还可处理成压缩形式,以便于存储和传送。另一点要注意的是,活动文档本身并不包含其运行所需的全部软件,大部分的支持软件是事先存放在浏览器中的。下图 9 说明了活动文档的创建过程。
#|计算机网络(应用层 - 万维网 WWW、HTTP 协议以及 HTML 语言)
文章图片
图9活动文档由服务器发送过来的程序在客户端创建 由美国 SUN 公司开发的 Java 语言是一项用于创建和运行活动文档的技术。在 Java 技术中使用了一个新的名词 “小应用程序”(applet) 来描述活动文档程序。当用户从万维网服务器下载一个嵌入了 Java 小应用程序的 HTML 文档后,用户可在浏览器的显示屏幕上点击某个图像,然后就可看到动画的效果;或是在某个下拉式菜单中点击某个项目,即可看到根据用户键入的数据所得到的计算结果。实际上,Java 技术是活动文档技术的一部分。限于篇幅,有关 Java 技术的进一步讨论这里从略。
参考 《计算机网络(第7版-谢希仁)》第6章 - 应用层:第6.4节 - 万维网WWW

    推荐阅读