
任务一 HTTP请求响应模型
任务描述
了解访问网站的数据流转过程,了解HTTP协议,理解HTTP请求响应模型。
必备知识
1.访问网站的完整流程
假设在浏览器的地址栏中输入百度网址,得到百度网站首页,可以将整个过程分为7步,整个过程的图解如图1-1所示。
①浏览器向DNS请求解析www.baidu.com的IP地址;
②DNS系统解析出百度的地址是14.215.177.37:443;
③浏览器与服务器建立TCP连接;
④浏览器发出取文件GET命令;
⑤服务器www.baidu.com给出响应,把百度首页所有内容返回给浏览器;
⑥释放TCP连接;
⑦浏览器解析并显示百度网站首页中的内容。
2.HTTP协议
超文本传输协议(HyperText Transfer Protocol,HTTP)是互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的目的是提供一种发布和接收HTML页面的方法,它可以使浏览器更加高效,使网络传输减少,不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等。浏览器通过超文本传输协议(HTTP)将Web服务器上站点的网页代码提取出来,并翻译成网页。
HTTP协议在发展过程中,经历了HTTP 1.0和HTTP 1.1两个阶段。
HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求。但是,这也造成了一些性能上的缺陷,例如,一个包含有许多图像的网页文件中并没有包含真正的图像数据内容,而只是指明了这些图像的URL地址,当Web浏览器访问这个网页文件时,浏览器首先要发出针对该网页文件的请求,当浏览器解析Web服务器返回的该网页文档中的HTML内容时,发现其中的<img>图像标签后,浏览器将根据<img>标签中的src属性所指定的URL地址再次向服务器发出下载图像数据的请求,如图1-2所示。

图1-1 网站请求响应示意图

图1-2 HTTP 1.0访问图解
显然,访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,上一次和下一次请求完全分离。即使图像文件都很小,但是客户端和服务器端每次建立和关闭连接却是一个相对比较费时的过程,并且会严重影响客户机和服务器的性能。当一个网页文件中同时包含JavaScript文件、CSS文件等内容时,也会出现类似上述情况。
为了克服HTTP 1.0的这个缺陷,HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。基于HTTP 1.1协议的客户机与服务器的信息交换过程如图1-3所示。

图1-3 HTTP 1.1访问图解
可见,HTTP 1.1在继承了HTTP 1.0优点的基础上,也克服了HTTP 1.0的性能问题。不仅如此,HTTP 1.1还通过增加更多的请求头和响应头来改进和扩充HTTP 1.0的功能。例如,由于HTTP 1.0不支持Host请求头字段,Web浏览器无法使用主机头名来明确表示要访问服务器上的哪个Web站点,这样就无法使用Web服务器在同一个IP地址和端口号上配置多个虚拟Web站点。在HTTP 1.1中增加Host请求头字段后,Web浏览器可以使用主机头名来明确表示要访问服务器上的哪个Web站点,这就实现了在一台Web服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟Web站点。HTTP 1.1的持续连接,也需要增加新的请求头来帮助实现,例如,Connection请求头的值为Keep-Alive时,客户端通知服务器返回本次请求结果后保持连接;Connection请求头的值为Close时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1还提供了与身份认证、状态管理和Cache缓存等机制相关的请求头和响应头。
3.URL统一资源定位符
在浏览器的地址栏中输入的网站地址称为URL(Uniform Resource Locator,统一资源定位符),就像每家每户都有一个门牌地址一样,每个网页也都有一个Internet地址。当在浏览器的地址栏中输入一个URL或是单击一个超链接时,URL就确定了要浏览的地址。
客户端是终端用户,服务器端是网站。通过使用Web浏览器、网络爬虫或者其他工具,客户端发起一个到某URL地址的HTTP请求,请求访问资源,比如访问HTML文件和图像等。应答的服务器收到请求后,将对应的资源返回给客户端。
4.HTTP报文结构
HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。请求消息由请求头、报文主体组成。其中,请求头包含请求的方法、URL、协议版本,以及请求修饰符、客户信息和MIME类型等,报文格式如下:
请求行-通用信息头-请求头-实体头-报文主体
典型的请求头消息内容如下:


服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误的编码加上包含服务器信息、实体元信息以及可能的实体内容。响应报文格式如下:
状态行-通用信息头-响应头-实体头-报文主体
典型的响应头消息内容如下:

5.请求方法
HTTP协议中共定义了8种方法(又称“动作”)来表明对Request-URI指定的资源的不同操作方式,它们表示的含义如表1-1所示。
表1-1 HTTP的8种请求方式

在Web开发中,最常用的方法为GET方法与POST方法。
(1)GET方法
GET方法是默认的HTTP请求方法,经常使用GET方法提交表单数据。但用GET方法提交的表单数据只经过简单的编码,同时作为URL的一部分向Web服务器发送,因此,如果使用GET方法提交表单数据就存在安全隐患。例如:

从上面的URL请求中很容易辩认出表单提交的内容(即?之后的内容)。另外,因为GET方法提交的数据将作为URL请求的一部分,所以提交的数据量不能太大。
(2)POST方法
POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为请求数据正文传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时建议采用POST方法。
6.响应状态码
服务器一旦收到请求,会向客户端发回一个状态行,比如“HTTP/1.1 200 OK”和(响应的)消息,其中200就是响应状态码。状态码元由3位数字组成,表示请求是否被理解或被满足,具体编码的代表意义如表1-2所示。
表1-2 HTTP消息状态码详解

续表

续表

课堂提问
1.简述HTTP协议的作用。
2.访问网站的完整流程是什么?
3.GET方法和POST方法有何区别?分别何时用到GET和POST方法?