HTTP协议的原理

240 阅读15分钟

我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第17篇文章,点击查看活动详情


引言

就如同在上一节中举的例子。公司和酒店签订了订餐协议,订餐协议中又包括配菜协议和配送协议。当然生活中的协议有很多种,比如工作协议、出境协议等。而订餐协议就属于工作协议中的一种。在网络中,计算机之间要进行通信交互行为。就如同我们通过说话进行信息交互通信,不同国家的人还使用不同的语言,计算机与计算机间的通信语言就叫作网络协议,不同的计算机间只有使用相同的协议才能通信。所以网络协议就是为计算机网络中进行数据交换而建立的规则、标准或约定的集合。

百科中有个例子举得很好,网络中一个微机用户和一个大型主机的操作员进行通信,这两个数据终端所用字符集不同,因此操作员所输入的命令彼此不认识。为了能进行通信,规定每个终端都要将各自字符集中的字符先变换为标准字符集的字符后,才进入网络传送,到达目的终端之后,再变换为该终端字符集的字符。这个规定就是网络协议,在双方都达成同一协议的基础上,客户端之间才能正常通信。

说到网络协议,就需要大家回忆一下大学课本中所学习的网络基础了。为了使不同计算机厂家生产的计算机能够相互通信,以便在更大的范围内建立计算机网络,国际标准化组织(ISO)在1978年提出了“开放系统互联参考模型”,即著名的OSI/RM模型(Open System Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。

每一层都有其不同的含义及网络协议。

(1)物理层:以太网、调制解调器、电力线通信(PLC)、SONET/SDH、光导纤维、同轴电缆、双绞线等。

(2)数据链路层:Wi-Fi(IEEE 802.11)、WiMAX(IEEE 802.16)、ATM、令牌环、PPP、L2TP、 PPTP等。

(3)网络层协议:IP(IPv4、IPv6)、ICMP、ICMPv6、IGMP、IS-IS、IPsec、ARP、RARP等。 (4)传输层协议:TCP、UDP、TLS、DCCP、SCTP、RSVP、OSPF等。

(5)应用层协议:DNS、FTP、Gopher、HTTP、IMAP4、POP3、SIP、SSH、TELNET、RPC、 SDP、SOAP、GTP等。

本节我们要讲的就是应用层中被应用最多的协议:HTTP协议。

HTTP协议的介绍

RFC2616给出的官方定义为以下内容。

超文本传输协议(HTTP)是一种为分布式、协作式的,面向应用层的超媒体信息系统。它是一种通用的、无状态(stateless)的协议,除了应用于超文本传输外,它也可以应用于如名称服务器和分布对象管理系统之类的系统,这可以通过扩展它的请求方法、错误代码和消息头来实现。HTTP是建立在统一资源标识符(URI)的约束上的,作为一个地址(URL)或名称(URN),以指定被一个方法使用的资源。消息是以一种类似于互联网邮件消息格式来传输的,互联网消息格式定义于多目的互联网邮件扩展(MIME)里。它也是用于用户代理(user agents)和其他互联网系统的代理/网关之间通信的通信协议,HTTP允许不同的应用程序对资源进行基本的超媒体访问。

HTTP/1.0没有充分考虑到分层代理、缓存以及持久连接和虚拟主机的需求的影响。并且随着不完善的HTTP/1.0 应用程序的激增,迫切需要一个新的版本,以便使两个通信程序能够确定彼此的真实能力。此规范定义的协议叫作“HTTP/1.1”,这个协议与HTTP/1.0相比,更为严格,以确保各个协议的特征得到可靠实现。

以上官网定义会显得非常难以理解。要明白HTTP协议,测试人员必须要先理解一些术语的含义。它们是HTTP通信中各参与者和对象扮演不同角色的说明。

  • ·连接(connection)

为通信而在两个程序间建立的传输层虚拟电路。

  • ·消息(message)

HTTP通信中的基本单元。它由一个结构化的八比特字节序列组成,与第4章定义的句法相匹配,并通过连接得到传送。

  • ·请求(request)

一种HTTP请求消息,从客户端到服务器的消息叫请求消息。

  • ·响应(response)

一种HTTP响应消息,从服务器返回到客户端的消息叫响应消息。

  • ·资源(resource)

一种网络数据对象或服务。资源可以有多种表现方式(如多种语言、数据格式、大小和分辨

\

率)或者是根据其他方面而不同的表现形式。

  • ·实体(entity)

实体是请求或响应的有效承载信息。一个实体包含元信息和内容,元信息以实体头域(entityheaderfield)形式表示,内容以消息主体(entity-body)形式表示。

  • ·表现形式(representation)

一个响应包含的实体是由内容协商(content negotiation)决定的。有可能存在一个特定的响应状态码对应多个表现形式。

  • ·内容协商(content negotiation)

当服务一个请求时选择资源的一种适当的表示形式的机制(mechanism)。任何响应里实体的表现形式都是可协商的(包括错误响应)。

  • ·变量(variant)

在某个时刻,一个资源对应的表现形式(representation)可以有一个或多个(译注:一个URI请求一个资源,但返回的是此资源对应的表现形式,这根据内容协商决定)。每个表现形式(representation)被称作一个变量。“变量”这个术语的使用并不意味着资源(resource)是由内容协商决定的。

-·客户端(client)

为发送请求建立连接的程序。

  • ·用户代理(user agent)

初始化请求的客户端程序。常见的如浏览器、编辑器、蜘蛛(可网络穿越的机器人),或其他的终端用户工具。

  • ·服务器(Server)

服务器是这样一个应用程序,它同意请求端的连接,并发送响应(response)。任何给定的程序都有可能既做客户端,又做服务器。我们使用这些术语是为了说明特定连接中应用程序所担当的角色,而不是指通常意义上应用程序的能力。同样,任何服务器都可以基于每个请求的性质扮演源服务器、代理、网关,或者隧道等角色之一。

  • ·源服务器(Origin server)

存在资源或者资源在其上被创建的服务器(Server)被称为源服务器(Origin server)。

  • ·代理(Proxy)

代理是一个中间程序,它既可以担当客户端的角色,也可以担当服务器的角色。代理代表客户端向服务器发送请求。客户端的请求经过代理,会在代理内部得到服务或者经过一定的转换转至其他服务器。一个代理必须能同时实现本规范中对客户端和服务器所做的要求。透明代理(transparent proxy)需要代理认证和代理识别,而不修改请求或响应。非透明代理(nontransparent proxy)需修改请求或响应,以便为用户代理(user agent)提供附加服务,附加服务包括组注释服务、媒体类型转换、协议简化或者匿名过滤等。除非透明行为或非透明行为被显式地声明,否则,HTTP 代理既是透明代理,也是非透明代理。

  • ·网关(gateway)

网关其实是一个服务器,扮演着代表其他服务器为客户端提供服务的中间者。与代理(proxy)不同,网关接收请求,仿佛它就是请求资源的源服务器。请求的客户端可能觉察不到它正在同网关通信。

  • ·隧道(tunnel)

隧道也是一个中间程序,它是一个在两个连接之间充当盲目中继(blind relay)的中间程序。一旦隧道处于活动状态,它不能被认为是这次HTTP通信的参与者,虽然HTTP请求可能已经把它初始化了。当两端的中继连接都关闭的时候,隧道不再存在。

  • ·缓存(cache)

缓存是程序响应消息的本地存储。缓存是一个子系统,控制消息的存储、获取和删除。缓存里存放可缓存的响应(cacheable response),为的是减少对将来同样请求的响应时间和网络带宽消耗。任一客户端或服务器都可能含有缓存,但缓存不能存在于一个充当隧道(tunnel)的服务器里。

  • ·可缓存的(cacheable)

响应(response)是可缓存的是指可以将这个响应缓存(cache)保存为副本,之后能用此副本继续响应后续的请求。但即使一个资源(resource)是可缓存的,也可能会出现由于请求本身的约束造成缓存副本不能被使用的情况。

  • ·第一手的(first-hand)

如果一个响应直接从源服务器或经过若干代理(proxy),并且没有不必要的延时,最后到达客户端,那么这个响应就是第一手的(first—hand)。如果响应通过源服务器(origin Server)验证是有效性(validity)的,那么这个响应也同样是第一手的。

  • ·显式过期时间(explicit expiration time)

显式过期时间是源服务器认为实体(entity)在没有被进一步验证(validation)的情况下,缓存(cache)不应该利用其去响应后续请求的时间(译注:也就是说,当响应的显式过期时间达到后,缓存必须要对其缓存的副本进行重验证,否则就不能利用此副本去响应后续请求)。

  • ·启发式过期时间(heuristic expiration time)

当没有显式过期时间(explicit expiration time)可利用时,由缓存指定过期时间。

  • ·年龄(age)

一个响应的年龄是从被源服务器发送或被源服务器成功验证到现在的时间。

  • ·保鲜寿命(freshness lifetime)

一个响应产生到过期之间的时间。

  • ·保鲜(Fresh)

如果一个响应的年龄还没有超过保鲜寿命(freshness lifetime),那么它就是保鲜的。

  • ·陈旧(Stale)

一个响应的年龄已经超过了它的保鲜寿命(freshness lifetime),那么它就是陈旧的。

  • ·语义透明(semantically transparent)

缓存(cache)可能会以一种语意透明(semantically transparent)的方式工作。这时,对于一 个特定的响应,使用缓存既不会对请求客户端产生影响,也不会对源服务器产生影响,缓存的使用只是为了提高性能。当缓存(cache)具有语意透明时,客户端从缓存接收的响应跟直接从源服务器接收的响应完全一致(除了使用hop—by—hop头域)。

  • ·验证器(Validator)

验证器其实是协议元素如实体标签(entity tag)或最后修改时间(last-modified time)等,这 些协议元素被用于识别缓存里保存的副本(缓存项)是否等价于源服务器的实体的副本。

  • ·上游/下游(upstream/downstream)

上游和下游描述了消息的流动:所有消息都是从上游流到下游的。

  • ·内向/外向(inbound/outbound)

内向和外向指的是消息的请求和响应路径:“内向”即“移向源服务器”,“外向”即“移向用户代理(user agent)”。

把HTTP协议的官方定义进行归纳,得出HTTP协议的4个关键点。

(1)HTTP是建立在TCP/IP协议之上,面向应用层的超文本传输协议。

(2)它由请求和响应组成,完全符合标准的客户端服务器的请求响应模型。

(3)协议很轻便简单,并且请求与请求间没有关联,是无状态性的协议。

(4)为了弥补这种无状态性就需要使用HTTP协议的扩展Cookie等方式建立关联。

HTTP协议的原理

如同订餐协议的工作建立在公司端—酒店端的架构上,HTTP 协议工作于客户端—服务端的架构上。客户端通过URL向服务器发送所有请求。服务器根据接收到的请求,向客户端发送响应信息。HTTP 协议定义客户端如何向服务器发送请求,以及服务器如何将响应请求传送给客户端,所以HTTP协议采用了请求/响应模型,如图所示。

图中有以下几点需要我们理解。

image.png

1.客户端

客户端主要有两个职能。

(1)一个向服务器发送请求。

(2)接收服务器返回的报文并解释成友善的信息供我们阅读。

客户端大概有以下几类:浏览器、应用程序(桌面应用和app应用)等。

我们在日常生活中使用最多的就是浏览器。下面我们以Chrome浏览器为例,如图所示

image.png 我们在地址栏输入网址并回车,浏览器会为我们做如下的处理。

(1)解析出协议(HTTP)、域名(www.qq.com)。

(2)使用HTTP协议并创建请求报文向服务器端发送请求。

(3)接收到服务器返回的内容并经过渲染后展示给用户。

在日常生活中,大部分客户端的工作都由客户端软件进行了包装和处理。测试人员日常使用的截包工具大多数都有模拟请求发送的功能。例如,postman、fiddler等。我们就以使用 fiddler工具为例,模拟客户端发送请求给服务器,以加深对客户端职能的理解。

首先我们要安装 fiddler。

安装完成后,切换到Composer 选项卡下,如图所示。

image.png

以get请求为例,发送请求步骤如图所示。

image.png

(4)如果是post请求,则会有请求主体,此部分填写请求主体的内容。

(5)点击Execute按钮,发送请求。

(6)服务器返回的响应头:状态码为200,请求成功。 点击响应的内容,查看响应详细信息,如图所示。

image.png

(1)点击host地址。

(2)此处显示请求头内容。

(3)此处显示响应主体,我们可以看到QQ首页的代码。这样一个模拟客户端发送请求给服务器的例子就完成了。

2.服务器

服务器端在接收到客户端发送的请求后会开始处理请求。服务端的处理过程如下。

服务器软件一直在监听端口是否有新的请求到达,如iis或tomcat在建立Web站点后,默认会一直监听80端口等待HTTP请求到达服务器。

(1)建立连接:如果客户端已经打开一条到服务器的持久连接,则可以直接使用,否则,客户端需要在服务器打开一条新的连接。

(2)接收请求报文:连接上有数据到时,Web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来。

请求报文如下。

image.png

(3)接收后会被如下表示。

image.png

(4)处理请求:当请求被接收和表示后,服务器便可以根据请求报文进行处理了。例如,post方法中提出报文主体的数据并插入到数据库中。

(5)访问资源:请求处理完成后,比如Web会根据数据生成一系列的HTML页面或图片等信息,此步骤将访问这些存储在服务器上的物理文件。

(6)构建响应:Web服务器在识别资源后,构造响应报文。响应报文中包含状态码、响应头、主体等内容。

(7)发送响应:服务器将响应的数据发送给客户端机器。

(8)记录日志:请求结束,Web服务器会在日志文件中添加一条请求记录。3.报文

客户端与服务器端之间的信息传递使用的载体叫作报文。报文分为请求与响应两部分。

(1)客户端向服务器发送一个请求报文。请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。

(2)服务器反馈给客户端一个响应报文。

响应的内容包括协议的版本、成功或者错误响应码、服务器信息、响应头部和响应数据。报文的详细内容会在请求与响应报文章节中介绍。