输入网址的解析
浏览器访问Web服务器时,依赖的是网址,即URL(统一资源定位符)。http://user:password@www.glasscom.com:80/dir/file1.htm是较为详尽的URL。
http表示浏览器使用的访问方法(还有ftp、file、mailto等方法),user是用户名,password是密码,www.glasscom.com是Web服务器域名,80是端口号,/dir/file1.htm是文件的路径名。在其中,除了访问方法和域名,其它均可省略。
浏览器要做的第一步工作就是对 URL 进行解析,拆分出各个元素。
http: + // + Web服务器名 + / + 目录名 + / + … + 文件名
URL开头表示访问数据源的机制,也就是协议;“//”后面的字符串表示服务器的名称;从“/”开始到结束表示数据源(文件)的路径名(可省略)。
省略文件名的情况:
1、http://www.lab.glasscom.com/dir/
以“/”结尾代表 /dir/ 后面本来应该有的文件名被省略了。我们会在服务器上事先设置好文件名省略时要访问的默认文件名。这个设置根据服务器不同而不同,大多数情况下是 index.html 或者 default.htm 之类的
文件名。
2、http://www.lab.glasscom.com/
这个URL表示访问一个名叫“/”的目录(根目录),由于省略了文件名,所以结果就是访问 /index.html 或者/default.htm 这样的文件了。
3、http://www.lab.glasscom.com
当没有路径名时,就代表访问根目录下事先设置的默认文件,效果和2是一样的。
4、http://www.lab.glasscom.com/whatisthis
由于末尾没有“/”,所以 whatisthis 应该理解为文件名才对。但实际上,会按照下面的惯例进行处理:如果Web 服务器上存在名为 whatisthis 的文件,则将 whatisthis 作为文件名来处理;如果存在名为 whatisthis 的目录,则将 whatisthis 作为目录名来处理。
请求消息的生成
解析完URL,知道了访问的目标文件在哪,接下来浏览器会使用HTTP协议来访问Web服务器。HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
HTTP 消息在格式上是有严格规定的,因此浏览器会按照规定的格式来生成请求消息。
<方法><空格>< URL ><空格><HTTP版本>
<字段名>:<字段值>
…
…
<空行>
<消息体>
第一行称为请求行,通过这一行可以大致了解请求的内容。最常用的一个就是 GET 方法了,一般当我们访问 Web 服务器获取网页数据时,使用的就是 GET 方法。在请求消息中写上 GET 方法,当 Web 服务器收到消息后,会打开访问文件并读取出里面的数据,然后将读出的数据存放到响应消息中,并返回给客户端。最后,客户端浏览器会收到这些数据并显示在屏幕上。还有一个经常使用的方法就是 POST,我们在表单中填写数据并将其发送给 Web 服务器时就会使用这个方法。我们在网上遇到带有输入框的网页,这些可以输入信息的部分就是表单。在请求消息中,除了方法和 URI 之外,还要加上传递给应用程序和脚本的数据。这里的数据也就是用户在输入框里填写的信息。
请求行后面一直延伸到空行为止这一部分称为消息头,每行包含一个头字段,用于表示请求的附加信息。消息头的行数根据具体情况可变。
消息体包含客户端向服务器发送的数据,例如用POST方法向Web服务器发送的网页表单数据。
收到的响应消息
响应消息的格式以及基本思路和请求消息是相同的,差别只在第一行上。
<HTTP版本><空格><状态码><空格><响应短语>
<字段名>:<字段值>
…
…
<空行>
<消息体>
第一行称为状态行,状态码和响应短语用来表示请求的执行结果是成功还是出错,状态码是一个数字,它主要用来向程序告知执行的结果;响应短语则是一段文字,用来向人们告知执行的结果。
返回响应消息之后,浏览器会将数据提取出来并显示在屏幕上,我们就能够看到网页的样子了。如果网页的内容只有文字,那么到这里就全部处理完毕了,但如果网页中还包括图片等资源,则还有下文。
当网页中包含图片时,会在网页中的相应位置嵌入表示图片文件的标签的控制信息。浏览器会在显示文字时搜索相应的标签,当遇到图片相关的标签时,会在屏幕上留出用来显示图片的空间,然后再次访问 Web 服务器,按照标签中指定的文件名向 Web 服务器请求获取相应的图片并显示在预留的空间中。这个步骤和获取网页文件时一样,只要在 URI 部分写上图片的文件名并生成和发送请求消息就可以了。
由于每条请求消息中只能写 1 个 URI,所以每多一张图片,需要多向Web服务器发送一条请求。