应用层:HTTP 协议
禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
万维网
万维网 WWW (World Wide Web) 并非某种特殊的计算机网络,是一个大规模的、联机式的信息储藏所。万维网用链接的方法能非常方便地从互联网上的一个站点访问另一个站点,从而主动地按需获取丰富的信息,这种访问方式称为“链接”。
超媒体与超文本
万维网是分布式超媒体 (hypermedia) 系统,它是超文本 (hypertext) 系统的扩充。一个超文本由多个信息源链接成。利用一个链接可使用户找到另一个文档。这些文档可以位于世界上任何一个接在互联网上的超文本系统中,超文本是万维网的基础。
超媒体与超文本的区别是文档内容不同。超文本文档仅包含文本信息,而超媒体文档还包含其他表示方式的信息,如图形、图像、声音、动画,甚至活动视频图像。
万维网的工作方式
万维网以客户-服务器方式工作,浏览器就是在用户计算机上的万维网客户程序。万维网文档所驻留的计算机则运行服务器程序,因此这个计算机也称为万维网服务器。客户程序向服务器程序发出请求,服务器程序向客户程序送回客户所要的万维网文档。在一个客户程序主窗口上显示出的万维网文档称为页面 (page)。
万维网必须解决的问题
- 怎样标志分布在整个互联网上的万维网文档?使用统一资源定位符 URL (Uniform Resource Locator) 来标志万维网上的各种文档。使每一个文档在整个互联网的范围内具有唯一的标识符 URL。
- 用何协议实现万维网上各种超链的链接?在万维网客户程序与万维网服务器程序之间进行交互所使用的协议,是超文本传送协议 HTTP(HyperText Transfer Protocol)。HTTP 是一个应用层协议,它使用 TCP 连接进行可靠的传送。
- 怎样使各种万维网文档都能在互联网上的各种计算机上显示出来,同时使用户清楚地知道在什么地方存在着超链?超文本标记语言 HTML (HyperText Markup Language) 使得万维网页面的设计者可以很方便地用一个超链从本页面的某处链接到互联网上的任何一个万维网页面,并且能够在自己的计算机屏幕上将这些页面显示出来。
- 怎样使用户能够很方便地找到所需的信息?为了在万维网上方便地查找信息,用户可使用搜索工具(即搜索引擎)。
URL
资源定位符 URL 是对可以从互联网上得到的资源的位置和访问方法的一种简洁表示。URL 给资源的位置提供一种抽象的识别方法,并用这种方法给资源定位。只要能够对资源定位,系统就可以对资源进行各种操作,如存取、更新、替换和查找其属性。URL 相当于一个文件名在网络范围的扩展。因此 URL 是与互联网相连的机器上的任何可访问对象的一个指针。
URL 的格式为由以冒号隔开的两大部分组成,并且在 URL 中的字符对大写或小写没有要求:
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
参数 | 说明 |
---|---|
protocol(协议) | 指定使用的传输协议 |
hostname(主机名) | 存放资源的服务器的域名系统(DNS) 主机名或 IP 地址 |
port(端口号) | 可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号 |
path(路径) | 由零或多个“/”符号隔开的字符串,用来表示主机上的一个目录或文件地址。 |
parameters(参数) | 用于指定特殊参数的可选项 |
query(查询) | 可选,用于给动态网页传递参数 |
fragment(信息片断) | 用于指定网络资源中的片断 |
HTTP 协议
为了使超文本的链接能够高效率地完成,需要用 HTTP 协议来传送一切必须的信息。Web 的应用层协议是超文本传输协议,这是一个简单的请求-响应协议,是 Web 的核心。HTTP 是由 2 个程序实现——客户端程序和服务器程序,它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应,通过 HTTP 报文进行回话。对于 Web 来说,Web 浏览器是 HTTP 的客户端,Web 服务器是 HTTP 服务端,Web 页面是由对象组成的,多数这样的页面需要内含 HTML 基本文件和几个引用对象。
从层次的角度看,HTTP 是面向事务的(transaction-oriented)应用层协议,它是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
无状态协议
HTTP 是个无状态协议,也就是说 HTTP 服务器不保存关于客户的任何信息,因此要是客户在很短的时间内重复请求某个对象,服务器仍然会做出响应,重新发送响应报文。在服务器没有更新网页的情况下,同一个用户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问是相同。
为什么 HTTP 被设计为无状态?这是因为有状态协议更为复杂,主要体现在 2 大方面:
- 有状态协议要维护历史状态;
- 若用户或服务器失效,将导致状态出现不一致。
工作流程
每个万维网网点都有一个服务器进程,它不断地监听 TCP 的端口 80,以便发现是否有浏览器(即万维网客户,请注意浏览器和万维网客户是同义词向它发出连接建立请求。)一旦监听到连接建立请求并建立了 TCP 连接之后,浏览器就向万维网服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应,最后释放 TCP 连接就被释放了。
HTTP 报文结构
HTTP 有两类报文,分别是请求报文和响应报文。所谓请求报文是从客户向服务器发送请求报文,而响应报文是从服务器到客户的回答。由于 HTTP 是面向正文的 (text-oriented),因此在报文中的每一个字段都是一些 ASCII 码串,因而每个字段的长度都是不确定的。
报文由三个部分组成,即开始行、首部行和实体主体。开始行用于区分报文类型,即是请求报文还是响应报文,而首部行用于说明浏览器、服务器或报文主体的一些信息。
请求报文
在请求报文中,开始行就是请求行,有方法、URL 和 HTTP 版本 3 个内容。“URL”是所请求的资源的 URL,“版本”是 HTTP 的版本。这里解释下什么是方法,所谓“方法”是面向对象技术中使用的专门名词。所谓“方法”就是对所请求的对象进行的操作,因此这些方法实际上也就是一些命令。因此,请求报文的类型是由它所采用的方法决定的。HTTP 协议对资源有如下方法:
方法 | 说明 |
---|---|
GET | 请求获取 URL 位置的资源 |
HEAD | 请求获取 URL 位置资源的响应消息报告,即获得该资源的头部信息 |
POST | 请求向 URL 位置的资源后附加新的数据 |
PUT | 请求向 URL 位置存储的一个资源,覆盖原 URL 位置的资源 |
PATCH | 请求局部更新 URL 位置的资源,即改变该处资源的部分内容 |
DELETE | 请求删除 URL 位置存储的资源 |
响应报文
响应报文的开始行是状态行,状态行包括三项内容,即 HTTP 的版本,状态码,以及解释状态码的简单短语。HTTP 状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP 状态码共分为5种类型:
分类 | 说明 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
Web 缓存
代理服务器(proxy server)又称为万维网高速缓存(Web cache),Web 缓存可以在不访问服务器的前提下满足客户的需求。Web 缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象副本。当与暂时存放的请求相同的新请求到达时,万维网高速缓存就把暂存的响应发送出去,而不需要按 URL 的地址再去互联网访问该资源。Web 缓存器通常有 ISP 购买并安装,它既是服务器又是客户。
没有使用高速缓存的情况下,所有万维网通信量会频繁出现在链路中,带来较大的时延。
使用高速缓存的情况下,访问互联网的流程为:
- 浏览器访问互联网的服务器时,要先与高速缓存建立 TCP 连接,并向高速缓存发出 HTTP 请求报文。
- 若高速缓存已经存放了所请求的对象,则将此对象放入 HTTP 响应报文中返回给浏览器。
- 否则,高速缓存就代表发出请求的用户浏览器,与互联网上的源点服务器建立 TCP 连接,并发送 HTTP 请求报文。
- 源点服务器将所请求的对象放在 HTTP 响应报文中返回给校园网的高速缓存。
- 高速缓存收到此对象后,先复制在其本地存储器中(为今后使用),然后再将该对象放在 HTTP 响应报文中,通过已建立的 TCP 连接,返回给请求该对象的浏览器。
Web 缓存器具有以下优点:
- Web 缓存器可以大大减少对客户请求的响应时间;
- Web 缓存器能够大大减少一个机构的接入链路到因特网的通信量;
- Web 缓存器能从整体上大大降低因特网上的 Web 流量,从而改善所有应用的性能。
持续还是非持续连接?
TCP 协议是 HTTP 的支撑运输协议,这就说明 HTTP 客户端需要向服务器发起 TCP 连接,每个 TCP 连接只传输一个请求报文和一个响应报文。无论是客户向服务器发送 HTTP 请求还是服务器响应客户的 HTTP 响应,都可以完整的到达目的地。
非持续连接
在非连续的 HTTP 协议中,每个 TCP 连接在服务器发送一个对象后就关闭,即该链接不为其他的对象而持续下来。由于每个 TCP 连接都需要一次“三次握手”,前两次握手需要一个 RTT。客户在第三次握手是发送 HTTP 请求报文,当报文到达服务器后就发送一个 HTML 文件,HTTP 请求/响应用去一个 RTT。总而言之,总响应时间是 2 个 RTT 加上服务器传输 HTML 文件的时间。
非持续连接有以下缺点:
- 必须为每一个请求对象建立和维护一个全新的连接,操作系统要为每个 TCP 连接开销资源。也就是说如果一次性需要请求 10 个对象,就要建立 10 次 TCP 连接。
- 每一个对象经受 2 倍的 RTT。
持续连接
HTTP/1.1 协议提出使用持续连接 (persistent connection),目前一些流行的浏览器的默认设置就是使用 HTTP/1.1。服务器在发送响应后仍然在一段时间内保持该 TCP 连接打开,使同一个客户后续的 HTTP 请求报文和响应报文都能通过相同的连接进行传送。这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行。对对象的这些请求可以一个接一个发送,而不必等待请求的应答,理想情况下收到所有对象只消耗一个 RTT。
Cookie
HTTP 服务器是无状态的,但是有很多的应用需要掌握客户端的状态,例如网购平台。万维网站点使用 Cookie 来跟踪用户,Cookie 表示在 HTTP 服务器和客户之间传递的状态信息。使用 Cookie 的网站服务器为用户产生一个唯一的识别码,利用此识别码网站就能够跟踪该用户在该网站的活动。
Cookie 可以用于标识一个用户,用户首次访问一个站点时,可能需要提供一个用户标识可能是名字。在后继会话中,浏览器向服务器传递一个 Cookie 首部,从而向该服务器标识了用户,因此 cookie 可以在无状态的 HTTP 之上建立一个用户会话层Cookie 有 4 个组件:
- 在 HTTP 响应报文中的一个 Cookie 首部行;
- 在 HTTP 请求报文中的一个 Cookie 首部行;
- 在用户端系统中保留一个 Cookie 文件,并由用户的浏览器进行管理;
- 位于 Web 站点的一个后端数据库。
虽然 Cookie 常常能简化用户的活动,但是它具有很大的争议,因为这是对用户隐私的一种侵害。结合 Cookie 和用户提供的账户信息,Web 站点可以知道许多用户的信息,而且有可能泄露给第三方。
参考资料
《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社