1 前置知识
1.1 网络应用模型
网络应用模型是指在网络环境下,进行应用程序开发和交互的一种架构或模式。常见的网络应用模型包括客户端-服务器模型、浏览器-服务器模型和分布式模型。
1.1.1 C/S架构(客户端-服务器模型)
在客户端-服务器模型中,应用程序被分为两个主要组件:客户端和服务器。
- 客户端是指用户使用的设备(例如个人计算机、手机应用程序或网页浏览器等),客户端通常提供用户界面,允许用户与服务器进行交互,并将用户的请求打包成数据包发送给服务器。
- 服务器是存储和处理数据的远程计算机(在网络中具有固定的 IP 地址和提供特定服务的软件,如网站服务器、文件服务器、邮件服务器等),它接收来自客户端的请求,并根据请求执行相应的操作,然后将结果返回给客户端。
- 这种模型常用于 Web 应用开发、移动应用开发等。
- 客户端和服务器之间通过网络进行通信,通常使用标准的网络协议,如HTTP(超文本传输协议)或TCP/IP(传输控制协议/互联网协议)。客户端通过指定服务器的地址和端口号来建立连接,并发送请求消息。服务器接收到请求后,处理请求并将结果封装成响应消息返回给客户端。
这种模型具有以下几个特点:
- 分工明确:客户端负责发送请求和展示结果,服务器负责处理请求和提供服务。
- 可扩展性:通过增加服务器的数量可以提高系统的性能和容量。
- 可靠性:专门的服务器设备可以提供稳定的服务,并进行备份和故障恢复。
- 统一标准:使用标准的网络协议,使得各种不同类型的客户端能够与服务器进行通信。
1.1.2 B/S架构(浏览器-服务器模型)
浏览器-服务器模型是客户端-服务器模型的一种特殊形式,其中客户端使用的是浏览器作为用户界面。描述了在Web应用程序中,浏览器和服务器之间的交互方式。
- 在这个模型中,用户通过浏览器向服务器发出请求,浏览器充当客户端的角色,并从服务器获取 Web 页面的内容。
- 具体来说,当用户在浏览器中输入URL或点击链接时,浏览器会发送HTTP请求到特定的服务器。该请求包含了用户要访问的资源的信息,比如HTML文件、图片、CSS样式表或JavaScript代码等。
- 服务器根据请求的路径和参数进行处理,将所需的资源打包成HTTP响应返回给浏览器。
- 根据请求生成动态的 HTML 页面或提供静态的资源,并将其发送回浏览器进行显示。
- 在这个交互过程中,浏览器和服务器之间通过HTTP协议进行通信。HTTP定义了一套规范,规定了请求和响应的格式,以及一些状态码和标头字段的含义。
浏览器-服务器模型的优点包括:
- 客户端无需事先安装特定程序,只要有浏览器即可访问Web资源。
- 服务器端可以集中管理和提供资源,对用户来说更加方便。
- Web应用程序的开发可以分为前端和后端,在不同层面上进行开发,使任务分工更清晰。
1.2 域名系统(DNS)
域名系统(Domain Name System,DNS)是互联网中用于将域名转换为IP地址的分布式命名系统。它充当了互联网中的"电话簿",将易于记忆的域名映射到对应的IP地址。DNS系统采用人们更喜欢使用具有特定含义的字符串来标识因特网上的计算机。客户/服务器模型,其协议运行在UDP之上,使用53号端口。
在Web上,我们通常使用域名来访问网站,例如www.example.com。然而,计算机和网络通信使用的是IP地址,如192.0.2.1。DNS的主要作用是将这两者进行关联。
1.2.1 层次域名空间
层次域名空间是指域名系统(DNS)中的层次和结构化组织。它通过将域名划分为不同级别的域名,并按照层次结构进行管理和解析。
因特网采用层次树状结构的命名方法。采用这种命名方法,任何一个连接到因特网的主机或路由器,都有一个唯一的层次结构名称,即域名(Domain Name)。
域(Domain)是名字空间中一个可被管理的划分。域还可以划分为子域,而子域还可以继续划分为子域的子域,这样就形成了顶级域、二级域、三级域等。每个域名都由标号序列组成,而各标号之间用点(“.”)隔开。
注意:
- 标号中的英文不区分大小写。
- 标号中除连字符外不能使用其他的标点符号。
- 每个标号不超过63个字符,多标号组成的完整域名最长不超过255个字符。
- 级别最低的域名写在最左边,级别最高的顶级域名写在最右边。
1.2.2 域名服务器
域名服务器是一个网络服务,用于将域名转换为相应的IP地址。它充当域名解析的中心枢纽,在互联网上提供域名与IP地址之间的映射关系。
当用户在浏览器或其他网络应用程序中输入一个域名时,操作系统会向本地域名服务器发起查询请求。如果本地域名服务器拥有该域名的缓存信息,则直接返回对应的IP地址。否则,本地域名服务器会通过递归查询的方式向更高级的域名服务器进行查询。
- 域名服务器按照层次结构组织,其中最顶层的是根域名服务器。
- 根域名服务器负责管理顶级域名(TLD)的信息,如.com、.org等。
- 当本地域名服务器无法直接解析域名时,它会向根域名服务器发送查询请求,以获取下一级域名服务器的信息。
2 HTTP概述
万维网(World Wide Web,WWW)是一个分布式、联机式的信息存储空间,在这个空间中:一样有用的事物称为一样“资源”,并由一个全域“统一资源定位符”(URL)标识。这些资源通过超文本传输协议(HTTP)传送给使用者,而后者通过单击链接来获取资源。
2.1 什么是HTTP
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP定义了浏览器(万维网客户进程)怎样向万维网服务器请求万维网文档,以及服务器怎样把文档传送给浏览器。
从层次的角度看,HTTP是面向事务的(Transaction-oriented)应用层协议,它规定了在浏览器和服务器之间的请求和响应的格式与规则,是万维网上能够可靠地交换文件(包括文本、声音、图像等各种多媒体文件)的重要基础。
在计算机网络中,Web是一种应用,在7层模型中运行在最上层的应用层,HTTP是支持Web这种应用的协议。
2.2 HTTP的工作原理
从协议执行过程来说,浏览器要访问WWW服务器时,首先要完成对WWW服务器的域名解析。一旦获得了服务器的IP地址,浏览器就通过TCP向服务器发送连接建立请求。
HTTP是基于B/S架构通信的,也就是浏览器/服务器架构。在这个模型中,客户端也就是浏览器,用于请求、接收和显示Web对象;服务器用于对请求进行相应,发送客户端需要的对象。
HTTP的工作流程如下图所示
- 每一个万维网站点也就是服务器,都有一个服务器进程,它永远守候在80号端口进行监听。
- 当监听到客户的请求时,便与其建立TCP连接,并分配一个新的socket指向与这个用户的会话关系,用于与其进行通信。
- 与此同时,服务器仍然监听80号端口,查看是否有新的客户端请求建立连接,若有则重复上述步骤。
- 在这里,80号端口称为守候进程(Waiting Socket),新的socket称为连接进程(Connection Socket)。
用浏览器访问一个URL所经历的过程:
- 浏览器分析链接指向页面的 URL。
- 浏览器向 DNS 请求解析上面URL的IP地址。
- 域名系统DNS解析出清华大学服务器的IP地址。
- 浏览器与该服务器建立TCP连接(默认端口号为80)。
- 浏览器发出 HTTP请求:GET/index.htm
- 服务器通过HTTP响应把文件index.htm发送给浏览器。
- 释放TCP连接。
- 浏览器解释文件index.htm,并将 Web 页显示给用户。
3 HTTP的发展阶段
HTTP协议的发展经历了几个阶段,最主要的发展就是非持续连接和持续连接的区别。每个请求/相应是经过一个单独的TCP连接发送的称为非持续连接,如果所有的请求及其相应都是经过相同的TCP连接发送的,则称为持续连接。
3.1 采用非持续连接的HTTP
- 客户端发起一个与服务器的TCP连接(建立套接字),端口号为80
- 服务器接受客户端的TCP连接
- 在浏览器与Web服务器交换HTTP报文
- TCP连接关闭
其中,每一个TCP连接在服务器发送一个对象后关闭,而且每个TCP连接只传输一个请求报文和一个响应报文。
这种协议是无状态的也称为非持久HTTP,即服务器不保留与客户交易时的任何状态。这就大大减轻了服务器记忆负担,从而保持较快的响应速度。
3.2 采用持续连接的HTTP
在HTTP 1.1中,引入了保持活动机制,其中连接可以重用于多个请求。这样的持久性连接可以明显减少请求延迟,因为在发送第一个请求之后,客户端不需要重新进行TCP 三次握手连接。另一个积极的副作用是,通常,由于TCP的缓慢启动机制,连接随着时间的推移而变得更快。
持续连接有分为非流水线和流水线两种方式:
- 对于非流水线方式,客户在收到前一个响应后才能发出下一个请求,服务器发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
- HTTP 1.1 的默认方式是使用流水线的持久连接,这种情况下,客户每遇到一个对象引用就立即发出一个请求,因而客户可以逐个地连续发出对各个引用对象的请求。就像是滑动窗口的发送方式。
- 如果所有的请求和响应都是连续发送的,那么所有的引用对象共经历1个RTT延迟,而不像非水线方式那样,每个引用都必须有1个RTT延迟。
这种方式减少了TCP 连接中的空闲时间,提高了效率。
4 HTTP报文结构
在浏览器和服务器之间的请求与响应的交互,必须遵循规定的格式和规则,这些格式和规则就是HTTP。因此 HTTP有两类报文:请求报文和响应报文。我们做爬虫,正是通过获取并分析这些报文来分辨是否是我们要获得的信息。
HTTP有两种报文,请求报文和响应报文,结构如上图所示。
HTTP请求报文和响应报文都由三个部分组成。从图中可以看出,这两种报文格式的区别就是开始行不同。本节主要介绍每个字段的意义以及存储的内容,下一篇文章通过实战,带你了解在浏览器中看一下这些报文到底在哪。
- 开始行:
用于区分是请求报文还是响应报文。在请求报文中的开始行称为请求行,而在响应报文中的开始行称为状态行。开始行的三个字段之间都以空格分隔,最后的“CR”和“LF”分别代表“回车”和“换行”。
请求报文的“请求行”有三个内容:方法、请求资源的URL及HTTP的版本。其中,“方法”是对所请求对象进行的操作,这些方法实际上也就是一些命令。下表给出了HTTP请求报文中常用的几个方法。
方法(操作) | 意义 |
GET | 请求读取由URL标识的信息 |
HEAD | 请求读取由URL标识的信息的首部 |
POST | 给服务器添加信息(如注释) |
CONNECT | 用于代理服务器 |
- 首部行:
用来说明浏览器、服务器或报文主体的一些信息。首部可以有几行,但也可以不使用。
在每个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
- 状态码:
响应报文中的状态行中有一个状态码字段,它描述了请求的结果。下表说明了主要的状态码和对应的意义
状态码 | 意义 |
200 OK | 请求成功,信息在返回的响应报文中 |
201 Created | 请求成功,并在服务器上创建了新资源 |
204 No Content | 请求成功,但响应中没有返回任何内容 |
301 Moved Permanently | 请求的对象已经被永远的转移了,新的URL定义在响应报文的Location,首部行中,客户软件将自动获取新的URL |
400 Bad Request | 一个通用的差错代码,指示该请求不能被服务器理解 |
401 Unauthorized | 请求未被授权,需要提供有效的身份验证信息 |
403 Forbidden | 请求被服务器拒绝,通常是因为权限不足 |
404 Not Found | 被请求的文档不在服务器上 |
500 Internal Server Error | 服务器内部发生错误,无法完成请求 |
505 HTTP Version Not Supported | 服务器不支持请求报文使用的HTTP协议版本 |
5 用户与服务器的交互:Cookie
我们前面提到了HTTP服务器是无状态的。这简化了服务器的设计,并且允许工程师们去开发可以同时处理数以千计的TCP连接的高性能Web服务器。
然而有的站点希望根据不同的用户推送不同的内容,并且在下一次访问时可以找到之前的访问记录,根据以前的访问进行本次访问。为此,HTTP使用了cookie,它允许站点对用户进行跟踪。
目前大多数商务Web 站点都使用了cookie。
如下图所示,cookie技术有4个组件:
- 在 HTTP响应报文中的一个cookie首部行;
- 在 HTTP请求报文中的一个cookie首部行;
- 在用户端系统中保留有一个cookie文件,并由用户的浏览器进行管理;
- 位于Web站点的一个后端数据库。
并且下图用一个例子说明了cookie的工作过程:
从上述过程中我们看到,cookie可以用于标识一个用户。
- 用户首次访问一个站点时,可能需要提供一个用户标识(可能是名字)。
- 在后继会话中,浏览器向服务器传递一个cookie首部,从而向该服务器标识了用户。
- 因此cookie可以在无状态的HTTP之上建立一个用户会话层。
在后续的爬虫编程中,我们也会用到cookie。
6 Web缓存
在本文的以上内容中,我们介绍的都是客户端直接访问服务器。但是这样的操作往往会使得服务器的负担较重,这时,如果有一个代理,能够将一部分内容拿出来,帮助Web服务器完成用户的访问,那么无论是对于用户还是服务器来说都是有利的。
Web缓存(Web cache)也称代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。
使用Web缓存处理客户端请求的过程:
- 浏览器创建一个到Web 缓存器的 TCP连接,并向Web缓存器中的对象发送一个HTTP请求。
- Web缓存器进行检查,看看本地是否存储了该对象副本。如果有,Web缓存器就向客户浏览器用HTTP响应报文返回该对象。
- 如果 Web缓存器中没有该对象,它就打开一个与该对象的初始服务器的TCP连接。Web缓存器则在这个缓存器到服务器的TCP连接上发送一个对该对象的HTTP请求。在收到该请求后,初始服务器向该Web缓存器发送具有该对象的HTTP响应。
- 当Web缓存器接收到该对象时,它在本地存储空间存储一份副本,并向客户的浏览器用HTTP 响应报文发送该副本(通过现有的客户浏览器和Web缓存器之间的TCP 连接)。
建立Web缓存的好处:
- 可以大大减少对客户请求的响应时间。
- 能够大大减少一个机构的接入链路到因特网的通信量,从而不必增加带宽,降低了费用。
7 条件GET方法
虽然Web缓存可以帮助我们减少请求时间以及服务器的负担,但是存在一个缺点:当上次请求的内容在服务器中已经修改,则此时的内容与Web缓存中的内容不一致,为此,我们必须知道该内容在服务器中是否进行的修改,这种机制就是条件GET方法(conditional GET)。
如果请求报文使用GET方法;并且,请求报文中包含一个“If-Modified-Since:”首部行。那么,这个HTTP请求报文就是一个条件GET请求报文。
操作流程:
- 首先,代理服务器代表一个请求浏览器,向某个Web服务器发送一个请求报文
- 其次,该Web服务器向缓存发送具有被请求的对象的响应报文
- 该缓存器在将对象转发到请求的浏览器的同时,也在本地缓存了该对象。
- 重要的是,缓存器在存储该对象时也存储了最后修改日期。
- 最后,一个星期后,另一个用户经过该缓存器请求同一个对象,该对象仍在这个缓存器中。
- 由于在过去的一个星期中位于Web服务器上的该对象可能已经被修改了,该缓存器通过发送一个条件GET 执行最新检查。下面是该缓存器发送的报文:
- 在If-Modified-Sincce字段中,首部行的值正好等于一星期钱服务器发送的响应报文中的Last-Modified
- 则Web服务器向该缓存中发送一个响应报文:
- 作为该条件GET方法的响应,服务器仍发送一个响应报文,但是并没有在该响应报文中包含所请求的对象。