4 万维网 WWW

Wu Jun 2020-02-24 15:53:08
04 计算机网络 > 6 应用层

1 万维网概述

1.1 万维网的工作方式

1.2 万维网必须解决的问题

2 统一资源定位符 URL

3 超文本传送协议 HTTP

3.1 HTTP/1.x

1)HTTP/1.1 新特性
2)HTTP/1.x 缺陷

HTTP/1.x 实现简单是以牺牲性能为代价的:

3.2 HTTP/2.0

HTTP/2:2015年,[RFC 7540]

1)二进制分帧

HTTP/2.0 将 HTTP 1.x 的文本格式报文分成二进制格式的 HEADERS 帧和 DATA 帧。

image

2)多路复用

多路复用,代替原来的序列和阻塞机制。

image

3)服务端推送

HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。

例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML时再发送这些请求。

image

4)首部压缩

HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。

HTTP/2.0 要求客户端和服务器同时维护和更新一个包含之前见过的首部字段表,从而避免了重复传输。

不仅如此,HTTP/2.0 也使用 Huffman 编码对首部字段进行压缩。

image

3.3 通信数据转发

1)代理服务器

代理服务器接受客户端的请求,并且转发给其它服务器。

代理服务器把最近的一些请求和响应暂存在本地磁盘中。当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按 URL 的地址再次去互联网访问该资源。

使用代理服务器,将大部分通信量局限局域网内部,减少了通信量,因而减小了时延。

使用代理的主要目的是:

代理服务器分为正向代理和反向代理两种:

image

2)网关

与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而请求其它非 HTTP 服务器的服务。

3)隧道

使用 SSL 等加密手段,在客户端和服务器之间建立一条安全的通信线路。

3.3 HTTP/1.X 的报文结构

1)两类报文

image

2)HTTP 方法

请求报文第一行为请求行,包含了方法字段。

方法 意义
OPTION 查询指定的 URL 能够支持的方法
GET 请求读取由 URL 所标志的信息
HEAD 请求读取由 URL 所标志的信息的首部
POST 给服务器添加信息,传输实体主体
PUT 上传文件,完全替代原始资源,不带验证机制,存在安全性问题
PATCH 对资源进行部分修改
DELETE 删除文件,不带验证机制
TRACE 追踪路径,容易受到 XST 攻击
CONNECT 用于代理服务器,要求在与代理服务器通信时建立隧道
3)HTTP 状态码

响应报文第一行为状态行,包含了状态码以及原因短语,用来告知客户端请求的结果。

状态码 类别 含义
1XX 信息通知 接收的请求正在处理
2XX 成功 请求正常处理完毕
3XX 重定向 需要进行附加操作以完成请求
4XX 客户端错误 服务器无法处理请求
5XX 服务器错误 服务器处理请求出错
4)HTTP 首部

有 4 种类型的首部字段:通用首部字段、请求首部字段、响应首部字段和实体首部字段。

首部字段名 说明
Cache-Control 控制缓存的行为
Connection 控制不再转发给代理的首部字段、管理持久连接
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知
首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言(自然语言)
Authorization Web 认证信息
Expect 期待服务器的特定行为
From 用户的电子邮箱地址
Host 请求资源所在服务器
If-Match 比较实体标记(ETag)
If-Modified-Since 比较资源的更新时间
If-None-Match 比较实体标记(与 If-Match 相反)
If-Range 资源未更新时发送实体 Byte 的范围请求
If-Unmodified-Since 比较资源的更新时间(与 If-Modified-Since 相反)
Max-Forwards 最大传输逐跳数
Proxy-Authorization 代理服务器要求客户端的认证信息
Range 实体的字节范围请求
Referer 对请求中 URI 的原始获取方
TE 传输编码的优先级
User-Agent HTTP 客户端程序的信息
首部字段名 说明
Accept-Ranges 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向至指定 URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Retry-After 对再次发起请求的时机要求
Server HTTP 服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息
首部字段名 说明
Allow 资源可支持的 HTTP 方法
Content-Encoding 实体主体适用的编码方式
Content-Language 实体主体的自然语言
Content-Length 实体主体的大小
Content-Location 替代对应资源的 URI
Content-MD5 实体主体的报文摘要
Content-Range 实体主体的位置范围
Content-Type 实体主体的媒体类型
Expires 实体主体过期的日期时间
Last-Modified 资源的最后修改日期时间

3.4 在服务器上存放用户的信息

1)Cookie

HTTP/1.1 引入 Cookie 来保存状态信息。

Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,曾一度用于客户端数据的存储,但现在随着现代浏览器开始支持各种各样的存储方式(本地存储和会话存储或 IndexedDB),Cookie 渐渐被淘汰。

2)Session

除了可以将用户信息通过 Cookie 存储在用户浏览器中,也可以利用 Session 存储在服务器端,存储在服务器端的信息更加安全。

Session 可以存储在服务器上的文件、数据库或者内存中。也可以将 Session 存储在 Redis 这种内存型数据库中,效率会更高。

使用 Session 维护用户登录状态的过程如下:

应该注意 Session ID 的安全性问题,不能让它被恶意攻击者轻易获取,那么就不能产生一个容易被猜到的 Session ID 值。此外,还需要经常重新生成 Session ID。在对安全性要求极高的场景下,例如转账等操作,除了使用 Session 管理用户状态之外,还需要对用户进行重新验证,比如重新输入密码,或者使用短信验证码等方式。

此时无法使用 Cookie 来保存用户信息,只能使用 Session。除此之外,不能再将 Session ID 存放到 Cookie 中,而是使用 URL 重写技术,将 Session ID 作为 URL 的参数进行传递。

4)Cookie 与 Session 选择

3.5 缓存

1)优点
2)实现方法
3)Cache-Control

HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。

4)缓存验证
5)内容协商(带 Vary 头的响应)

在使用内容协商的情况下,只有当缓存服务器中的缓存满足内容协商条件时,才能使用该缓存,否则应该向源服务器请求该资源。

Vary 响应头决定了对于后续的请求头,如何判断是请求一个新的资源还是使用缓存的文件。

3.6 范围请求

如果网络出现中断,服务器只发送了一部分数据,范围请求可以使得客户端只请求服务器未发送的那部分数据,从而避免服务器重新发送所有数据。

3.7 分块传输编码

Chunked Transfer Encoding,可以把数据分割成多块,让浏览器逐步显示页面。

一份报文主体内可含有多种类型的实体同时发送,每个部分之间用 boundary 字段定义的分隔符进行分隔,每个部分都可以有首部字段。

例如,上传多个表单时可以使用如下方式:

Content-Type: multipart/form-data; boundary=AaB03x

--AaB03x
Content-Disposition: form-data; name="submit-name"

Larry
--AaB03x
Content-Disposition: form-data; name="files"; filename="file1.txt"
Content-Type: text/plain

... contents of file1.txt ...
--AaB03x--

3.8 Web 页面请求过程

image

  1. DNS 解析
  2. TCP 连接
  3. 发送 HTTP 请求
  4. 服务器处理请求并返回 HTTP 报文
  5. 浏览器解析渲染页面
  6. 连接结束

4 万维网的文档

4.1 静态文档

4.2 动态文档

4.3 活动文档

动态文档一旦建立,它所包含的信息内容也就固定下来而无法及时刷新屏幕,不能满足发展的需要。

有两种技术可用于浏览器屏幕显示的连续更新。

1)服务器推送

服务器推送(server push)是将所有的工作都交给服务器。

服务器不断地运行与动态文档相关联的应用程序,定期更新信息,并发送更新过的文档。

有很大的缺点:

2)活动文档

活动文档(active document)是把所有的工作都转移给浏览器端。

每当浏览器请求一个活动文档时,服务器就返回一段活动文档程序副本,使该程序副本在浏览器端运行。这时,活动文档程序可与用户直接交互,并可连续地改变屏幕的显示。只要用户运行活动文档程序,活动文档的内容就可以连续地改变。由于活动文档技术不需要服务器的连续更新传送,对网络带宽的要求也不会太高。

从传送的角度看,浏览器和服务器都把活动文档看成是静态文档。在服务器上的活动文档的内容是不变的,这点和动态文档是不同的。浏览器可在本地缓存一份活动文档的副本。活动文档还可处理成压缩形式,以便于存储和传送。另一点要注意的是,活动文档本身并不包括其运行所需的全部软件,大部分的支持软件是事先存放在浏览器中的。

Java 语言是一项用于创建和运行活动文档的技术。在 Java 技术中使用了一个新的名词“小应用程序"(applet)来描述活动文档程序。

当用户从万维网服务器下载一个嵌入了 Java 小应用程序的 HTML 文档后,用户可在浏览器的显示屏幕上点击某个图像,然后就可看到动画的效果:或是在某个下拉式菜单中点击某个项目,即可看到根据用户键入的数据所得到的计算结果。实际上,Java技术是活动文档技术的一部分。

5 万维网的信息检索系统