【网络是怎样连接的】第6章 - 请求到达web服务器,响应返回浏览器(3)

6.3 Web服务器程序解释请求消息并作出响应

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

图6.8 Web 的基本工作方式.png
图6.9 客户端看到的目录结构和实际目录结构是不同的.png

Web服务器中,图6.7的read获取的数据内容就是HTTP请求消息。服务器程序会根据收到的请求消息中的内容进行相应的处理,并生成响应消息,再通过write返回给客户端。请求消息包括一个称为“方法”的命令,以及表示数据源的URI(文件路径名),服务器程序会根据这些内容向客户端返回数据,但对于不同的方法和URI,服务器内部的工作过程会有所不同。下面我们从简单的开始依次进行介绍。

最简单的一种情况如图6.8中的例子所示,请求方法为GET, URI为一个HTML文件名。这种情况只要从文件中读出HTML文档,然后将其作为响应消息返回就可以了。不过,按照URI从磁盘上读取文件并没有这么简单。如果完全按照URI中的路径和文件名读取,那就意味着磁盘上所有的文件都可以访问,Web服务器的磁盘内容就全部暴露了,这很危险。因此,这里需要一些特殊的机制。

Web服务器公开的目录其实并不是磁盘上的实际目录,而是如图6.9这样的虚拟目录,而URI中写的就是在这个虚拟目录结构下的路径名。因此,当读取文件时,需要先查询虚拟目录与实际目录的对应关系,并将URI转换成实际的文件名后,才能读取文件并返回数据。

运行CGI程序

图6.11 数据如何传递给 Web 服务器上运行的程序.png

Web服务器会检查URI指定的文件名,看一看这个文件是不是一个程序。这里的判断方法是在Web服务器中事先设置好的,一般是通过文件的扩展名来进行判断,例如将.cgi、.php等扩展名的文件设置为程序,当遇到这些文件时,Web服务器就会将它们作为程序来对待。也可以设置一个存放程序的目录,将这个目录下的所有文件都作为程序来对待。此外,还可以根据文件的属性来进行判断。

如果判断要访问的文件为程序文件,Web服务器会委托操作系统运行这个程序,然后从请求消息中取出数据并交给运行的程序。如果方法为GET,则将URI后面的参数传递给程序;如果方法为POST,则将消息体中的数据传递给程序(图6.11)。

Web服务器程序在组装网络包、还原数据之后,会运行其中指定的程序(实际是委托操作系统来运行),然后将数据传递给已运行的程序。

运行的程序收到数据后会进行一系列处理,并将输出的数据返回给Web服务器。

Web 服务器得访问控制

Web服务器的访问控制规则主要有以下3种。
(1)客户端IP地址
(2)客户端域名
(3)用户名和密码

图6.12 根据域名进行访问控制.png

当根据客户端域名设置规则时,需要先根据客户端IP地址查询客户端域名,这需要使用DNS服务器。一般我们使用DNS服务器都是根据域名查询IP地址,其实根据IP地址反查域名也可以使用DNS服务器。具体来说,这个过程是这样的。

  • 收到客户端的请求消息后,Web服务器(图6.12①)会委托协议栈告知包的发送方IP地址,然后用这个IP地址生成查询消息并发送给最近的DNS服务器(图6.12②)。

  • 接下来,DNS服务器找出负责管辖该IP地址的DNS服务器,并将查询转发给它(图6.12③),查询到相应的域名之后返回结果(图6.12④),然后Web服务器端的DNS服务器再将结果转发给Web服务器(图6.12⑤)。这样一来,我们就可以根据发送方IP地址查询到域名。

  • 接下来,为了保险起见,还需要用这个域名查询一下IP地址,看看结果与发送方IP地址是否一致(图6.12⑥)。这是因为有一种在DNS服务器上注册假域名的攻击方式,因此我们需要进行双重检查,如果两者一致则检查相应的访问控制规则,判断是否允许访问。从图6.12中可以看出,这种方式需要和DNS服务器进行多次查询,整个过程比较耗时,因此Web服务器的响应速度也会变慢。

图6.13 利用 HTTP 验证用户名和密码.png

如果用户名和密码已设置好,那么情况如图6.13。通常的请求消息中不包含用户名和密码,因此无法验证用户名和密码(图6.13①)。

  • 因此,Web服务器会向用户发送一条响应消息,告诉用户需要在请求消息中放入用户名和密码(图6.13②)。

  • 浏览器收到这条响应消息后,会弹出一个输入用户名和密码的窗口,用户输入用户名和密码后(图6.13③),浏览器将这些信息放入请求消息中重新发送给服务器(图6.13④)。

  • 然后,Web服务器查看接收到的用户名和密码与事先设置好的用户名和密码是否一致,以此判断是否允许访问,如果允许访问,则返回数据(图6.13⑤)。

返回响应消息

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容