网络知识入门,探索一次网页请求的旅程(一)

一、网络的全貌

    从在浏览器中输入网址,到屏幕上显示出网页的内容,在这个只有几秒钟的过程中,很多硬件和软件都在各自的岗位上相互配合完成了一系列的工作。本文将带领大家探索这一系列工作中的每一个环节。每个单独的环节都并不复杂,只要仔细阅读就一定能够理解。不过,探索之旅中出现的硬件和软件数量庞大,如果仅从微观的视角关注每一个单独的点,可能就会因为看不到整体而迷失了方向。因此,在真正出发开始探索之前,我们先来对这次探索之旅作个简单的介绍。下面的介绍中还包含一张探索之旅的路线图,万一在旅途中迷失了方向,请大家务必回来看一看这张地图。 

 

 

 

1.访问网络对使用者是很简单的两步

 访问网络,获取想要看的页面这个过程,对于网民来讲是只有两个动作,但实际上这里面极为复杂。

 我们使用浏览器查看网页对于普通人来说只有两个动作:

(1)浏览器:“请给我×××网页的数据。”

(2)Web服务器:“好的,这就是你要的数据。”

     因此,从这个层面上,也就是浏览器和Web服务器等网络应用程序进行交互的层面上来看,其工作方式应该还是比较容易理解的。这个层面上的交互和人类之间的对话非常相似,从这一点来说也更加容易理解

 

2.传递请求和响应的机制

     要实现应用程序之间的交互,我们需要一个能够在浏览器和Web服务器之间传递请求和响应的机制。网络是由很多计算机等设备相互连接组成的,因此在通信的过程中需要确定正确的通信对象,并将请求和响应发送给它们。请求和响应在传递的过程中可能会丢失或损坏,因此这些情况也必须要考虑到。

   所以说,我们需要一种机制,无论遇到任何情况都能够将请求和响应准确无误地发送给对方。由于请求和响应都是由0和1组成的数字信息(二进制只有0和1,计算机仅能理解0和1),所以可以说,我们需要的是一种能够将数字信息搬运到指定目的地的机制。请求和响应的本质都是电信号和光信号,这些信号可能会因受到杂音等的干扰而损坏。这种机制是由操作系统中的网络控制软件,以及交换机、路由器等设备分工合作来实现的,它的基本思路是将数字信息分割成一个一个的小块,然后装入一些被称为“包”(Packet)的容器中来运送。

 

3.什么是包(Packet)

    “包”这个词大家可能在用手机的时候经常会碰到,但在这里类似于邮政和快递中的概念。大家可以这样理解:包相当于信件或者包裹,而交换机和路由器则相当于邮局或快递公司的分拣处理区。包的头部存有目的地等控制信息,通过许多交换机和路由器的接力,就可以根据控制信息对这些包进行分拣,然后将它们一步一步地搬运到目的地。无论是家庭和公司里的局域网,还是外面的互联网,它们只是在规模上有所不同,基本的机制都是相同的。

    前面介绍的这个负责搬运数字信息的机制,再加上浏览器和Web服成务器这些网络应用程序,这两部分就组了网络。也就是说,这两部分组合起来,就是网络的全貌。

 

4.Web浏览器

我们将首先探索浏览器的工作方式。大家可以认为我们的探索之旅是从在浏览器中输入网址(URL)开始的。例如,当我们输入下面这样的网址时,浏览器就会按照一定的规则去分析这个网址的含义,然后根据其含义生成请求消息。http://www.lab.glasscom.com/sample1.html

   在上面这个例子中,浏览器生成的请求消息表示“请给我sample1.html这一文件中储存的网页数据”,接着浏览器会将请求消息发送给Web服务器。当然,浏览器并不会亲自负责数据的传送。传送消息是搬运数字信息的机制负责的工作,因此浏览器会委托它将数据发送出去。具体来说,就是委托操作系统中的网络控制软件将消息发送给服务器。

 

 

二、浏览器如何生成消息

 

1.浏览器生成消息的步骤概述

(1)生成HTTP请求消息从用户在浏览器中输入网址(URL)开始

       浏览器的工作会从对用户输入的网址进行解析开始(通过DNS解析)。然后,浏览器会根据网址的含义来生成请求消息。浏览器通过请求消息将用户需要哪些数据告知服务器,至于请求消息长什么样,我们将在接下来讨论,只要理解了具体的消息长什么样,我们也就能够理解访问Web服务器时使用的HTTP协议的原理了。

(2)请求消息之前需要向DNS服务器查询Web服务器的IP地址

    网址中只有Web服务器的域名,因此浏览器需要向DNS服务器查询域名对应的IP地址

(3)DNS服务器如何解析DNS

     全世界共有上万台DNS服务器,它们相互配合才能完成IP地址的查询,DNS工作的方式将在本文讨论。

(4)浏览器发送请求消息

   委托协议栈发送消息查询到IP地址之后,浏览器就可以将消息委托给操作系统发送给Web服务器了。

   委托给操作系统”这句话看似简单,但关于委托给操作系统,其实有非常详细的规则,必须要遵守这些规则才能完成操作。由于只有编写程序的人才需要精通这些规则,所以面向一般读者的图书中几乎很少见到对这些规则的解释。不过,对这些规则有个大概的理解还是会有很多好处的,因为理解了向操作系统进行委托时的规则,我们就能够明白做出某个委托时操作系统会给我们怎样的反馈,这没有编程可以说是相当于具体地理解了网络的潜在能力。这一点对于没经验的人来说也很重要。

 

2.浏览器生成Http请求消息的具体情况

     在介绍浏览器的工作方式之前,先介绍一下网址。网址,准确来说应该叫URL(Uniform Resource Locator,统一资源定位符),如果我说它就是以http://开头的那一串东西,恐怕大家一下子就明白了,但实际上除了“http:”,网址还可以以其他一些文字开头,例如“ftp:”“file:”“mailto:”等。

    之所以有各种各样的URL,是因为尽管我们通常是使用浏览器来访问Web服务器的,但实际上浏览器并不只有这一个功能,它也可以用来在FTP服务器上下载和上传文件,同时也具备电子邮件客户端的功能。可以说,浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要一些东西来判断应该使用其中哪种功能来访问相应的数据,而各种不同的URL就是用来干这个的,比如访问Web服务器时用“http:”,而访问FTP服务器时用“ftp:”。

   下图列举了现在互联网中常见的几种URL,根据访问目标的不同,URL的写法也会不同。例如在访问Web服务器和FTP服务器时,URL中会包含服务器的域名和要访问的文件的路径名等,而发邮件的URL则包含收件人的邮件地址。

                     

 

    浏览器要做的第一步工作就是对URL进行解析,从而生成发送给Web服务器的请求消息。刚才我们已经讲过,URL的格式会随着协议的不同而不同,因此下面我们以访问Web服务器的情况为例来进行讲解。根据HTTP的规格,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这个文件

        

        

    解析完URL之后,我们就知道应该要访问的目标在哪里了。接下来,浏览器会使用HTTP协议来访问Web服务器,不过在介绍这一环节之前,我们先来讲一讲HTTP协议到底是怎么回事。

 

3.什么是HTTP协议

 

   

     

     HTTP协议定义了客户端和服务器之间交互的消息内容和步骤,其基本思路非常简单。首先,客户端会向服务器发送请求消息,如上图。请求消息中包含的内容是“对什么”和“进行怎样的操作”两个部分。其中相当于“对什么”的部分称为URI(Uniform Resource Identifier,统一资源标识符)。一般来说,URI的内容是一个存放网页数据的文件名或者是一个CGI程序的文件名,例如“/dir1/file1.html”“/dir1/program1.cgi”等。不过,URI不仅限于此,也可以直接使用“http:”开头的URL来作为URI。换句话说就是,这里可以写各种访问目标,而这些访问目标统称为URI。

    “进行怎样的操作”的部分称为方法。方法表示需要让Web服务器完成怎样的工作,其中典型的例子包括读取URI表示的数据、将客户端输入的数据发送给URI表示的程序等。下表列举了主要的方法。

 

1GET请求指定的页面信息,并返回实体主体。
2HEAD类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
3POST向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
4PUT从客户端向服务器传送的数据取代指定的文档的内容。
5DELETE请求服务器删除指定的页面。
6CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
7OPTIONS允许客户端查看服务器的性能。
8TRACE回显服务器收到的请求,主要用于测试或诊断。
9PATCH是对 PUT 方法的补充,用来对已知资源进行局部更新 。

 

1)get方法

         表中列出的方法中,最常用的一个就是GET方法了。一般当我们访问Web服务器获取网页数据时,使用的就是GET方法。所谓一般的访问过程大概就是这样的:   首先,在请求消息中写上GET方法,然后在URI中写上存放网页数据的文件名“/dir1/file1.html”,这就表示我们需要获取/dir1/file1.html文件中的数据。当Web服务器收到消息后,会打开/dir1/file1.html文件并读取出里面的数据,然后将读出的数据存放到响应消息中,并返回给客户端。最后,客户端浏览器会收到这些数据并显示在屏幕上。

2)POST方法

       还有一个经常使用的方法就是POST。我们在表单中填写数据并将其发送给Web服务器时就会使用这个方法。当我们在网上商城填写收货地址和姓名,或者是在网上填写问卷时,都会遇到带有输入框的网页,而这些可以输入信息的部分就是表单。使用POST方法时,URI会指向Web服务器中运行的一个应用程序的文件名,典型的例子包括“index.cgi”“index.php”等。然后,在请求消息中,除了方法和URI之外,还要加上传递给应用程序和脚本的数据。这里的数据也就是用户在输入框里填写的信息。当服务器收到消息后,Web服务器会将请求消息中的数据发送给URI指定的应用程序。最后,Web服务器从应用程序接收输出的结果,会将它存放到响应消息中并返回给客户端。

    前面两个方法属于HTTP的典型用法,除此之外的其他方法在互联网上几乎见不到使用的例子。因此,只要理解了这两个方法,就能够应付大部分情况了,但如果可以,还是推荐大家看一看表中所有方法的说明,思考一下它们的含义,以便理解HTTP协议具备的所有功能。如果只有GET和POST方法,我们就只能从Web服务器中获取网页数据,以及将网页输入框中的信息发送给Web服务器,而有了PUT和DELETE方法,就能够从客户端修改或者删除Web服务器上的文件。有了这些功能,我们甚至可以将Web服务器当成文件服务器来用。当然,出于安全上的原因,或者是支持GET和POST之外的方法的客户端没有广泛普及之类的原因,一般我们并不会碰到这样的用法,但大家应该能够看出,HTTP协议其实蕴藏着很多的可能性。

 

4.基于http协议的请求消息

  实际上,HTTP消息在格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息,如下图。

          

 

      浏览器和Web服务器根据此格式来生成消息。准确来说,消息体的格式会通过消息头中的Content-Type字段来定义。首先,请求消息的第一行称为请求行。这里的重点是最开头的方法,方法可以告诉Web服务器它应该进行怎样的操作。不过这里必须先解决一个问题,那就是方法有很多种,我们必须先判断应该选用其中的哪一种。解决这个问题的关键在于浏览器的工作状态。

    这次探索之旅是从在浏览器顶部的地址栏中输入网址开始的,但浏览器并非只有在这一种场景下才会向Web服务器发送请求消息。比如点击网页中的超级链接,或者在表单中填写信息后点击“提交”按钮,这些场景都会触发浏览器的工作,而选用哪种方法也是根据场景来确定的。在HTML文档中写上<a href="……">标签,其中"……"部分为URL,这就是一个超级链接。

    我们的场景是在地址栏中输入网址并显示网页,因此这里应该使用GET方法。点击超级链接的场景中也是使用GET方法。如果是表单,在HTML源代码中会在表单的属性中指定使用哪种方法来发送请求,可能是GET也可能是POST。GET方法能够发送的数据只有几百个字节,如果表单中的数据超过这一长度,则必须使用POST方法

                       

1)第一行

    写好方法之后,加一个空格,然后写URI。URI部分的格式如下,一般是文件和程序的路径名。/<目录名>/…/<文件名> 前面已经讲过,路径名一般来说已经包含在URL中了,因此只要从URL中提取出来原封不动地写上去就好了。第一行的末尾需要写上HTTP的版本号,这是为了表示该消息是基于哪个版本的HTTP规格编写的。

2)第一行之后空格之前

   到此为止,第一行就结束了。第二行开始为消息头。尽管通过第一行我们就可以大致理解请求的内容,但有些情况下还需要一些额外的详细信息,而消息头的功能就是用来存放这些信息。消息头的规格中定义了很多项目,如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。这些项目表示的都是非常细节的信息,因此要想准确理解这些信息的意思,就需要对HTTP协议有非常深入的了解。消息头中的内容随着浏览器类型、版本号、设置等的不同而不同,大多数情况下消息头的长度为几行到十几行不等。

3)空格行

     写完消息头之后,还需要添加一个完全没有内容的空行,然后写上需要发送的数据。这一部分称为消息体,也就是消息的主体。不过,在使用GET方法的情况下,仅凭方法和URI,Web服务器就能够判断需要进行怎样的操作,因此消息体中不需要填写任何数据。消息体结束之后,整个消息也就结束了。

 

                                                                        消息头可填写参数表

通用头(适用于请求和响应消息的头字段)含义
Date表示请求或响应的时间
Pragma表示数据是否允许缓存
Cache-Control控制缓存的相关消息
Connection设置发送响应后TCP连接是否继续保持通信
Transfer-Encoding设置消息主体中的编码格式
Via记录途中进过的代理和网关
请求头(使用与表示请求消息的附加信息头字段)含义

Authorization

 

身份认证数据
From请求者的邮件信息
Referer在当前页面点击超链接进入下一个页面后,记录当前页面的uri
User-Agent记录客户端软件的名称和版本号
Accept客户端可以支持的的数据类型(Content-Type)
Accept-Charset客户端可以支持的字符集
Accpet-Encoding客户端可以支持的编码个数(Content-Encoding)
Accpet-language客户端可以支持的语言,汉语为zh,英语为en
Host请求服务器的IP和端口号或域名
响应头(适用于响应消息的附加头字段)含义
location表示信息在本地的准确位置
Server服务端的名称和版本号

 

 5.基于http协议的响应信息

       当我们将上述请求消息发送出去之后,Web服务器会返回响应消息。响应消息的格式以及基本思路和请求消息是相同的,差别只在第一行上。在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。状态码和响应短语表示的内容一致,但它们的用途不同。状态码是一个数字,它主要用来向程序告知执行的结果相对地,响应短语则是一段文字,用来向人们告知执行的结果。

           

    状态码的第一位数字表示状态类型,第二、三位数字表示具体的情况。下表列举了第一位数字的含义

      

状态码含义
1xx告知请求的处理进度和情况
2xx成功
3xx表示需要进一步操作
4xx客户端错误

5xx

服务端错误

      返回响应消息之后,浏览器会将数据提取出来并显示在屏幕上,我们就能够看到网页的样子了。如果网页的内容只有文字,那么到这里就全部处理完毕了,但如果网页中还包括图片等资源,则还有下文。当网页中包含图片时,会在网页中的相应位置嵌入表示图片文件的标签的控制信息(html语言,<img src="">)。

      浏览器会在显示文字时搜索相应的标签,当遇到图片相关的标签时,会在屏幕上留出用来显示图片的空间,然后再次访问Web服务器,按照标签中指定的文件名向Web服务器请求获取相应的图片并显示在预留的空间中。这个步骤和获取网页文件时一样,只要在URI部分写上图片的文件名并生成和发送请求消息就可以了

   由于每条请求消息中只能写1个URI,所以每次只能获取1个文件,如果需要获取多个文件,必须对每个文件单独发送1条请求。比如1个网页中包含3张图片,那么获取网页加上获取图片,一共需要向Web服务器发送4条请求。判断所需的文件,然后获取这些文件并显示在屏幕上,这一系列工作的整体指挥也是浏览器的任务之一,而Web服务器却毫不知情。Web服务器完全不关心这4条请求获取的文件到底是1个网页上的还是不同网页上的,它的任务就是对每一条单独的请求返回1条响应而已。

    到这里,我们已经介绍了浏览器与Web服务器进行交互的整个过程。作为参考,图1.7展示了浏览器与Web服务器之间交互消息的一个实例。在这个例子中,我们需要获取一张名为sample1.htm的网页,网页中包含一张名为picture.jpg的图片,图中展示了这个过程中产生的消息。1条请求消息中只能写1个URI。如果需要获取多个文件,必须对每个文件单独发送1条请求。

 

                        

                             

                              

 

 

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值