HTTP,全称是Hypertext Transfer Protocol,译作超文本传输协议,诞生于1991年(版本为HTTP 0.9)。1996年发布了HTTP 1.0,1997年发布了HTTP 1.1,2015年发布了HTTP 1.1的下一个版本HTTP 2。然而时至今日,HTTP 1.1并未过时。
HTTP概述
浏览器与Web服务器之间的交互如图1-2所示。从图1-2中可以看出,HTTP是浏览器与Web服务器交互的核心。浏览器与Web服务器的交互过程大致如下。
(1)当浏览器用户打开浏览器,输入URL或者单击超链接后,实际上是浏览器请求访问Web服务器的某个资源文件。这个过程称为浏览器向Web服务器发出HTTP请求数据。
(2)Web服务器接收浏览器发出的HTTP请求数据,根据HTTP请求数据中信息(例如资源URL),通过分析得出该资源文件所在的物理位置,定位该资源文件。
(3)Web服务器“运行”该资源文件,将运行结果封装成HTTP响应数据,返回给浏览器。这个过程称为Web服务器向浏览器返回HTTP响应数据。
(4)浏览器接收Web服务器返回的HTTP响应数据,将其渲染到浏览器窗口。
图1-2 浏览器与Web服务器之间的交互
总之,浏览器是一种能够发出HTTP请求数据、接收HTTP响应数据的软件;而Web服务器是一种负责接收HTTP请求数据、返回HTTP响应数据的软件。这两种软件就像动物世界中的两种动物,一种喜欢主动,另一种喜欢被动;一种在努力地寻找猎物,另一种在静静地等待着猎物。它们之间通过网络相连。
作为浏览器,必须清楚地知道Web服务器上资源文件的具体位置。浏览器必须主动出击,Web服务器必须被动,只有当浏览器请求访问Web服务器上的资源文件时,Web服务器才会为之提供服务。
HTTP定义了浏览器与Web服务器之间交换超文本数据的协议。协议指的是一套规则。通过HTTP,浏览器可以向服务器发送任意类型的请求数据(例如浏览器向服务器上传图片),服务器可以向浏览器发送任意类型的响应数据(例如浏览器从服务器下载视频),数据发送方在请求头或响应头中指定Content-Type,数据接收方即可根据该Content-Type正确地解析接收到的数据。需要注意,HTTP要求请求数据中的请求头以及响应数据中的响应头必须是ASCII文本数据。也就是说,汉字必须被编码成ASCII编码,才能存在于请求头或响应头中。例如,请求头中的汉字需要被URL编码成ASCII编码。URL编码的相关知识读者可参考2.4.2节的内容。
ASCII是一种标准的单字节字符编码方案,到目前为止一共定义了128个字符。汉字非常多,单字节字符编码方案不足以表示所有汉字,因此汉字有必要采用多字节字符编码方案。读者将在本章实践任务环节了解常用的两种中文字符编码方案GBK和UTF-8,为将来解决中文字符乱码问题打下坚实基础。
本书在第2章和第3章详细讲解HTTP请求数据的构成;在第4章详细讲解HTTP响应数据的构成。通过这些知识的讲解,读者可以了解HTTP的本质、Web开发的本质。
通过HTTP,浏览器也可以向Web服务器发送二进制数据(例如文件上传),服务器也可以向浏览器返回二进制数据(例如文件下载)。文件上传和文件下载分别在本书第3章和第4章进行详细讲解。
具体地讲,浏览器A访问Web服务器B的某个资源文件C时,需要首先在浏览器地址栏中输入http://,表示浏览器A准备使用HTTP访问Web服务器B上的资源文件C。当然,如今的浏览器已经不再需要在网址前面加上http://了,因为HTTP已经成为浏览器默认的通信协议。
浏览器A访问Web服务器B的某个资源文件C,浏览器A需要知道Web服务器B的IP地址。由于IP地址很难记住,因此出现了域名系统,域名系统将域名映射到IP地址。读者可将IP地址理解为Web服务器B的“电话号码”,域名相当于通讯录里Web服务器B电话号码对应的姓名。域名由DNS维护,DNS相当于全球的“电话号码簿”,确保姓名与电话号码真实有效、一一对应。以百度为例,61.135.169.125是百度某个服务器的IP地址,www.baidu.com是百度的域名,百度的IP地址与域名之间的对应关系由DNS负责维护。
除此之外,浏览器A还需知道Web服务器B上资源文件C的文件名。可是Web服务器B上的资源文件那么多,浏览器A如何知道Web服务器B上的资源文件名呢?答案是通过入口地址(也叫首页)得知。几乎每个Web项目都会提供一个入口地址,可能是index.jsp、index.html或者index.htm。
以百度为例,百度服务器上存在index.html资源文件,浏览器用户在浏览器地址栏输入网址http://www.baidu.com,实际上访问的是百度服务器上的index.html资源文件,继而看到了百度的首页。也可以输入完整的网址:http://www.baidu.com/index.html,打开百度的首页。
index.html可以省略,这是因为index.html、index.jsp等资源文件是Web服务器的默认资源文件。
事实上,更为完整的网址应该是http://www.baidu.com:80/index.html,域名后的“:80”代表百度服务器的Web服务器软件运行在80端口上(稍后讲解端口号的概念)。
“:80”可以省略,这是因为默认情况下浏览器向Web服务器的80端口发送HTTP请求数据。