网络是怎样连接的-生成HTTP请求消息(上)

1.1 生成HTTP请求消息

1.1.1 探索之旅从输入网址开始

网址

网址,准确来说应该叫URL(Uniform Resource Locator,统一资源定位符),就是以 http:// 开头的那一串东西。

各种类型的URL

URL 有各种不同的写法,但它们有一个共同点,那就是 URL 开头的文字。

即“http:”“ftp:”“file:”“mailto:”这部分文字都表示浏览器应当使用的访问方法。

比如当访问 Web 服务器时应该使用 HTTP协议,而访问 FTP 服务器时则应该使用 FTP 协议。

因此,我们可以把这部分理解为访问时使用的协议类型。

尽管后面部分的写法各不相同,但开头部分的内容决定了后面部分的写法,因此并不会造成混乱。

 

1.1.2 浏览器先要解析 URL

浏览器要做的第一步工作就是对 URL 进行解析,从而生成发送给 Web服务器的请求消息。

下面我们以访问 Web 服务器的情况为例来进行讲解。

根据 HTTP(Hypertext Transfer Protocol,超文本传送协议。)的规格,URL 包含图a中的这几种元素。

 

当对URL进行解析时,首先需要按照a图的格式将其中的各个元素拆分出来,例如b图中的URL会拆分成c图的样子。

通过拆分出来的这些元素,我们就能够明白 URL 代表的含义。

例如,我们来看拆分结果图c,其中包含 Web 服务器名称 www.lab.glasscom.com,以及文件的路径名 /dir1/file1.html。

因此我们就能够明白,图b中的URL表示要访问 www.lab.glasscom.com 这个 Web 服务器上路径名为 /dir/file1.html 的文件,也就是位于 /dir/ 目录下的 file1.html 这个文件,如下图所示

 

1.1.3 省略文件名的情况

省略文件名

图b是一个以“http:”开头的典型 URL,但有时候我们也会见到一些不太一样的 URL,例如下面这个 URL 是以“/”来结尾的。

(a)http://www.lab.glasscom.com/dir/

以“/”结尾代表 /dir/ 后面本来应该有的文件名被省略了。

根据 URL 的规则,文件名可以像前面这样省略。

我们会在服务器上事先设置好文件名省略时要访问的默认文件名。

这个设置根据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的文件名。

像前面这样省略文件名时,服务器就会访问 /dir/index.html或者 /dir/default.htm。

省略目录和文件名

还有一些 URL 是像下面这样只有 Web 服务器的域名的,这也是一种省略了文件名的形式。

(b)http://www.lab.glasscom.com/

由于省略了文件名,所以结果就是访问 /index.html 或者/default.htm 这样的文件了。

省略域名后'/' 

(c)http://www.lab.glasscom.com

这次连结尾的“/”都省略了,这种写法也是允许的。当没有路径名时,就代表访问根目录下事先设置的默认文件。

也就是 /index.html 或者 /default.htm 这些文件,这样就不会发生混乱了。

省略目录后'/'

(d)http://www.lab.glasscom.com/whatisthis

由于末尾没有“/”,所以 whatisthis 应该理解为文件名才对。

但实际上,很多人并没有正确理解省略文件名的规则,经常会把目录末尾的“/”也给省略了。

一般来说,这种情况会按照下面的惯例进行处理:

  • 如果Web 服务器上存在名为 whatisthis 的文件,则将 whatisthis 作为文件名来处理
  • 如果存在名为 whatisthis 的目录,则将 whatisthis 作为目录名来处理。

浏览器的第一步工作就是对 URL 进行解析。

1.1.4 HTTP 的基本思路

解析完 URL 之后,我们就知道应该要访问的目标在哪里了。接下来,浏览器会使用 HTTP 协议来访问 Web 服务器,

HTTP 协议定义了客户端和服务器之间交互的消息内容和步骤,其基本思路非常简单。

首先,客户端会向服务器发送请求消息,如上图所示。

请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。

其中相当于“对什么”的部分称为URI。

URI是什么

Uniform Resource Identifier,统一资源标识符。

一般来说,URI 的内容是一个存放网页数据的文件名者是一个 CGI 程序的文件名。

例如“/dir1/file1.html”“/dir1/program1.cgi”等。

不过,URI不仅限于此,也可以直接使用“http:”开头的URL来作为URI。

换句话说就是,这里可以写各种访问目标,而这些访问目标统称为 URI。

相当于接下来“进行怎样的操作”的部分称为方法。

方法表示需要让Web 服务器完成怎样的工作,其中典型的例子包括读取 URI 表示的数据、将客户端输入的数据发送给 URI 表示的程序等。

下表列举了主要的方法。

 

附加信息的头字段

HTTP 消息中还有一些用来表示附加信息的头字段。

客户端向 Web 服务器发送数据时,会先发送头字段,然后再发送数据。

不过,头字段属于可有可无的附加信息。

Web服务器收到请求消息后的操作

收到请求消息之后,Web 服务器会对其中的内容进行解析,通过 URI和方法来判断“对什么”“进行怎样的操作”。

并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。

响应消息中的状态码

在响应消息的开头有一个状态码,它用来表示操作的执行结果是成功还是发生了错误。

当我们访问 Web 服务器时,遇到找不到的文件就会显示出 404 Not Found 的错误信息,其实这就是状态码。

客户端处理响应消息

状态码后面就是头字段和网页数据。

响应消息会被发送回客户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕上。到这里,HTTP 的整个工作就完成了。

 

方法的详细操作

列出的方法中,最常用的一个就是 GET 方法了。一般当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。

所谓一般的访问过程大概就是这样的:

  1. 首先,在请求消息中写上 GET 方法。
  2. 然后在 URI 中写上存放网页数据的文件名“/dir1/file1.html”,这就表示我们需要获取 /dir1/file1.html 文件中的数据。
  3. 当 Web 服务器收到消息后,会打开 /dir1/file1.html 文件并读取出里面的数据,然后将读出的数据存放到响应消息中,并返回给客户端。
  4. 最后,客户端浏览器会收到这些数据并显示在屏幕上。

还有一个经常使用的方法就是 POST。

我们在表单中填写数据并将其发送给 Web 服务器时就会使用这个方法,这些可以输入信息的部分就是表单。

其过程一般是这样的:

  1. 使用 POST 方法时,URI 会指向 Web 服务器中运行的一个应用程序的文件名,典型的例子包括“index.cgi”“index.php”等。
  2. 然后,在请求消息中,除了方法和 URI 之外,还要加上传递给应用程序和脚本的数据。这里的数据也就是用户在输入框里填写的信息。
  3. 当服务器收到消息后,Web 服务器会将请求消息中的数据发送给 URI 指定的应用程序。
  4. 最后,Web 服务器从应用程序接收输出的结果,会将它存放到响应消息中并返回给客户端。

其他方法

前面两个方法属于 HTTP 的典型用法,除此之外的其他方法在互联网上几乎见不到使用的例子。

因此,只要理解了这两个方法,就能够应付大部分情况了。

但如果可以,还是推荐大家看一看表中所有方法的说明思考一下它们的含义,以便理解 HTTP 协议具备的所有功能。

如果只有GET 和 POST 方法,我们就只能从 Web 服务器中获取网页数据,以及将网页输入框中的信息发送给 Web 服务器。

而有了 PUT 和 DELETE 方法,就能够从客户端修改或者删除 Web 服务器上的文件。

 

posted @ 2018-11-13 22:11  田错  阅读(578)  评论(0编辑  收藏  举报