探索服务器内部——服务器程序解释请求消息并做出响应

1、将请求的URI转换为实际的文件名:

服务器程序会根据收到的请求消息中的内容进行相应的处理,并生成响应消息,再通过write返回给客户端。请求消息包括一个称为“方法”的命令,以及表示数据源的URI(文件路径名),服务器程序会根据这些内容向客户端返回数据,但对于不同的方法和URI,服务器内部的工作过程会有所不同。

例如:

GET /sample1.htm HTTP/1.1

Accept: */*

Accept-Language: zh

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible;)

Host: www.lab.glasscom.com

Connection: Keep-Alive

请求方法为GET,URI为一个HTML文件名。这种情况只要从文件中读出HTML文档,然后将其作为响应消息返回就可以了。不过,如果完全按照URI中的路径和文件名读取,那就意味着磁盘上的所有文件都可以被访问,这是很危险的。因此,Web服务器上公开的目录其实并不是磁盘上的实际目录,而是某个虚拟目录,URI需要在转换成实际的目录之后,才能读取文件并返回数据。

文件名转换也是有特例的,比如URI中的路径省略了文件名的情况,这时服务器会读取事先设置好的默认文件名。

2、运行CGI程序:

有些URI指定的可能是一个程序,在这个情况下,服务器不会直接返回文件内容,而是会运行这个程序,然后将程序输出的数据返回给客户端。

一般来说,浏览器会将需要程序处理的数据放在HTTP请求消息中发送给服务器。收到请求消息之后,Web服务器首先会检查URI指定的文件名,看一看这个文件是不是一个程序。这里的判断是在Web服务器中事先设置好的,一般是通过文件的扩展名来进行判断,例如将.cgi、.php等扩展名的文件设置为程序,当遇到这些文件时,Web服务器就会将它们作为程序来对待。此外,还可以根据文件的属性来进行判断。

如果判断要访问的文件为程序文件,Web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据并交给运行的程序。接下来,运行的程序收到数据后会进行一系列处理,并将输出的数据返回给Web服务器。

3、Web服务器的访问控制:

Web服务器还可以检查事先设置的一些规则,并根据规则允许或禁止访问,这种功能称为访问控制。Web服务器的访问控制规则只要分三种:

(1)客户端IP地址

(2)客户端域名

(3)用户名和密码

这里的重点在于客户端域名。当根据客户端域名设置规则时,需要先根据客户端IP地址查询客户端域名,这就需要使用DNS服务器。一般我们使用DNS服务器都是根据域名查询IP地址,其实根据IP地址反查域名也可以使用DNS服务器。当Web服务器通过DNS服务器得到客户端域名之后,为了保险起见,还需要用这个域名查询一下IP地址,看看结果与发送方IP地址是否一致。这是因为有一种在DNS服务器上注册假域名的攻击方式,因此需要双重检查。

4、返回响应消息:

首先,Web服务器调用Socket库的write,将响应消息交给协议栈。这时,需要告诉协议栈这个响应消息应该发给谁,这里只需要给出表示通信使用的套接字的描述符就可以了。套接字中保存了所有的通信状态,其中也包括通信对象的信息,因此只要有描述符就万事大吉了。

接下来,协议栈会将数据拆分成多个网络包,然后加上头部发送出去。这些包中包含接收方客户端的地址,它们将经过交换机和路由器的转发,通过互联网最终到达客户端。

5、浏览器接收响应消息并显示内容:

要显示内容,首先需要判断响应消息中的数据属于哪种类型。Web可以处理的数据包括文字、图像、声音、视频等多种类型,每种数据的显示方法都不同,因此必须先知道返回了什么类型的数据,否则无法正确显示。

原则上可以根据响应消息开头的Content-Type头部字段的值来进行判断。这个值一般是下面这样的字符串:

Content-Type: text/html

其中“/”左边的部分称为“主类型”,表示数据的大分类;右边的“子类型”表示具体的数据类型。主要的一些类型如下表:

主类型 含义 子类型
text 表示文本数据 text/html HTML文档
text/plain 纯文档
image 表示图像数据 image/jpeg JPEG格式的图片
image/gif GIF格式的图片
audio 表示音频数据 audio/mpeg MP2、MP3格式的音频
video 表示视频数据 video/mpeg MPEG格式的视频
video/quicktime Quicktime格式的视频
model 表示对物体等的形状和动作进行建模的数据 model/vrml VRML格式的建模数据
application 除上述以外的数据,Excel、Word等应用程序的数据都属于这一类型 application/pdf PDF格式的文档数据
application/msword MS-WORD格式的文档数据
message 直接存放邮件等消息时使用的类型,表示直接存放某种格式的消息 message/rfc822 一般的邮件数据,包含From:、Date: 等头部数据
multipart 消息体中包含多个部分的数据 multipart/mixed 消息体中包含各种不同格式的数据,其中每个部分的数据都有单独定义的媒体类型

此外,当数据类型为文本时,还需要判断编码方式,这时就需要用charset附加表示文本编码方式的信息,如下:

Content-Type: text/html; charset=utf-8

这里的utf-8表示编码方式为Unicode,如果是euc-jp就表示EUC编码,iso-2022-jp表示JIS编码,shift_jis表示JIS编码。

除此之外,还需要检查Content-Encoding头部字段。如果消息中存放的内容是通过压缩或编码技术对原始数据进行转换得到的,那么Content-Encoding的值就表示具体的转换方式,通过这个字段的值,可以知道如何将消息中经过转换的数据还原成原始数据。

6、浏览器显示网页内容!访问成功:

对于HTML文档、纯文本、图片这些基本数据类型,浏览器自身具有显示这些内容的功能,因此由浏览器自身负责显示。不同类型的数据显示操作的过程也不一样,例如HTML文档通过标签表示文档的布局和字体等样式信息,浏览器需要解释这些标签的含义,按照指定的样式显示文档内容。实际的显示操作是由操作系统来完成的,浏览器负责对操作系统发出指令,例如在屏幕上的什么位置显示什么文字、使用什么样的字体等。还有例如JPEG和GIF格式的图片是经过压缩的,浏览器需要将其解压后委托操作系统进行显示。

如果Web服务器返回一些其他类型的数据,如文字处理、幻灯片等应用程序的数据。这些数据无法由浏览器自行显示,这时浏览器会调用相应的程序。这些程序可以是浏览器的插件,也可以是独立的程序,被调用的程序会负责显示相应的内容。

猜你喜欢

转载自blog.csdn.net/qq_38386085/article/details/104523318