浏览器侧的处理流程包含输入URL,到生成请求消息,再到域名解析,最后委托操作系统发出消息。本文仅总结生成请求消息的过程。
从用户在浏览器中输入网址(URL)开始,浏览器会根据网址的含义来生成请求消息,将用户的请求数据告知服务器。
1.1 什么是URL?
URL(Uniform Resource Locator)统一资源定位符。
常见的URL以http://或以https://开头,当然也支持“ftp:”“file:”“mailto:”等。
浏览器是一个具备多种客户端功能的综合性客户端软件,因此它需要一些东西来判断应该使用其中哪种功能来访问相应的数据,而各种不同的URL就是用来干这个的,比如访问Web服务器时用“http:”,而访问FTP服务器时用“ftp:”。
URL中还包含用户名、密码、服务器端口号等信息。
1.2 浏览器解析URL
浏览器的第一步工作是对URL进行解析,从而生成发送给Web服务器的请求消息。
URL的格式会随着协议的不同而不同,以访问Web服务器为例来说明。
当对URL进行解析时,首先需要按照下图将各个元素拆分出来。找到通信协议,服务器域名或地址,端口号,数据源路径名。
举个特殊的例子,http://www.lab.glasscom.com/whatisthis
一般来说,这种情况会按照惯例进行处理:如果Web服务器上存在名为whatisthis的文件,则将whatisthis作为文件名来处理;如果存在名为whatisthis的目录,则将whatisthis作为目录名来处理。
为什么可以这样?因为Linux下无法创建两个名字相同的文件和目录,因此不可能既有一个名为whatisthis的文件,同时又有一个名为whatisthis的目录。
1.3 HTTP协议的基本思路
HTTP协议定义了客户端和服务器之间交互的消息内容和步骤。
首先,客户端会向服务器发送请求消息。
请求消息中包含的内容是“对什么”(URI:Uniform Resource Identifier,统一资源标识符)和“进行怎样的操作”(方法)两个部分。一般来说,URI的内容是一个存放网页数据的文件名或者是一个CGI程序的文件名。方法表示需要让Web服务器完成怎样的工作,针对不同的HTTP版本,不同的POST、GET、DELETE等方法的含义。
CGI程序:对Web服务器程序调用其他程序的规则所做的定义是CGI,而按照CGI规范来工作的程序称为CGI程序。
圆圈:在该版本的规格中定义。
三角:并非正式规格,而是在规格书附录(Appendix)中定义的附加功能。
上述1.0版本和1.1版本的描述分别基于RFC1945和RFC2616。
此外客户端向Web服务器发送数据时,会先发送头字段,然后再发送数据。
收到请求消息之后,Web服务器会对其中的内容进行解析,通过URI和方法来判断“对什么”“进行怎样的操作”,并根据这些要求来完成自己的工作,然后将结果存放在响应消息中。响应消息的开头有一个状态码,表示操作的执行结果是成功还是发生了错误。响应消息被发送回客户端,客户端收到之后,浏览器会从消息中读出所需的数据并显示在屏幕上。至此,HTTP的整个工作就完成了。
1.4 生成HTTP请求消息
浏览器会按照规定的格式来生成请求消息。
a) 首先,请求消息的第一行称为请求行。重点是最开头的方法,方法可以告诉Web服务器它应该进行怎样的操作。消息体的格式通过消息头中的Content-Type字段来定义(MIME类型),后续再介绍。
问题来了,浏览器怎么知道带什么方法呢?
解决这个问题的关键在于浏览器的工作状态。这次探索之旅是从在浏览器顶部的地址栏中输入网址开始的,但浏览器并非只有在这一种场景下才会向Web服务器发送请求消息。比如点击网页中的超级链接,或者在表单中填写信息后点击“提交”按钮,这些场景都会触发浏览器的工作,而选用哪种方法也根据场景来确定的。
在地址栏中输入网址并显示网页,使用GET方法。点击超级链接的场景中也是使用GET方法。如果是表单,在HTML源代码中会在表单的属性中指定使用哪种方法来发送请求,可能是GET也可能是POST。
写好方法之后,加一个空格,然后写URI。URI部分的格式如下,一般是文件和程序的路径名 /<目录名>/…/<文件名>
第一行的末尾需要写上HTTP的版本号,这是为了表示该消息是基于哪个版本的HTTP规格编写的。
b) 第二行开始为消息头。消息头的功能就是用来存放这些信息。消息头的规格中定义了很多项目,如日期、客户端支持的数据类型、语言、压缩格式、客户端和服务器的软件名称和版本、数据有效期和最后更新时间等。
写完消息头之后,还需要添加一个完全没有内容的空行,然后写上需要发送的数据。这一部分称为消息体,也就是消息的主体。在使用GET方法时,仅凭方法和URI,Web服务器就能够判断需要进行怎样的操作。
1.5 发送请求后会收到响应
当请求消息发出后,Web服务器返回响应消息。响应消息的格式和请求消息是相同的,差别只在第一行上。在响应消息中,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错。
本文摘取自周自恒翻译的户根勤编写的《网络是怎样连接的》。
网友评论