从地址栏输入到页面显示 -深入探究web运行机制(半草稿持续更新中)

服务器特点:的相对性

 

dns解析,tcp/ip网络,必须有ip地址才能数据传输

http封包

osi七层协议

 

定义

主机:连接在网络上,有通过网络进行数据收发的设备。对于web开发而言,主要关心指web服务器,数据库服务器,普通用户计算机,除此还有dns解析服务器,代理服务器,等其它类型。

互联网上主机,要想进行数据传输,就必需有传输目的主机的ip地址。如,普通用户计算机,对于web开发者而言,主要关心的是其浏览器,有时也称web客户端(在与web服务器相对而言时,也简称客户端)。本文在不引起误解的情况下,会混称以下概念:web浏览器,客户端,用户主机。

对于web开发者,在不引起误解时web服务器也经常简称服务器。

 

服务器(端)与客户端,及其特点

服务器(端)与客户端,是一对相对的概念。服务器是可以向其它主机提供一种网络服务的网络设备。繁体中文(台湾)中称伺服器,这个名称更能体现服务器的特点,即“伺”与“服”,即等待其它主机提出服务请求,并向其它主机提供响应。它永远都是被动的向请求方(客户端)提供响应,而不会主动提供服务。服务器提供的响应,一般是一个数据包,通过一定的网络协议把响应数据包发给请求方。(网络协议可以简单的理解为数据传输的格式或规则)。以数据传递的走向来看,客户端是主动方,它主动向服务器提出请求。而服务器则是被动方,只有在接受到客户端的请求时,才向客户端提供相应的响应数据。

服务器可以按所提供服务划分为多种类型,如数据库服务器,域名服务器,web服务器,缓存服务器等多种。

(注:以上从功能的角度对服务器与客户端的进行的解释,非物理实体角度的解释。)

从软件的角度看,一台物理上的服务器就是安装了某种网络服务软件的计算机。

一般情况下,一台物理服务器都提供单一的网络服务,以获得最佳的性能。当然在服务器主机性能有富余时、或降低成本时,也会安装把多个服务器软件安装在同一台物理服务器主机上。

 

Web服务器与浏览器

web服务器是提供web服务的服务器;而主动向web服务器发送请求的主机,即是web客户端。一般情况下,服务器都提供单一的网络服务,以获得最佳的性能,web服务器也是这样;而物理上的 web客户端,绝大多数情况就是我们平时使用的计算机,上面会安装多种软件,包括浏览器、下载工具、输入法程序、即时通讯工具等,浏览器只是其中之一,不过对于web开发者,我们主要关心的只是浏览器,所以在不死混淆时,我们会笼统地把用户端计算机、web客户端与浏览器等价看待。

 

 

Web服务器的主要功能解析

web服务器是安装了web服务软件的一台主机。上面最主要的软件就是web服务器软件,它接受http协议的请求,并返回相应的http响应数据给请求者。 目前最常用的是Apache HTTP Server (简称apache, httpd) internet information services(简称iis)ginxlighttpd

它主要有以下功能模块:http请求数据包分析器,响应数据生成器,响应数据包封装器。

http请求数据包分析器,是分析浏览器发送来的请求数据包,从中拆解出请求字段,并传递给响应数据生成器。拆解出的字段至少包括请求的主机域名,请求端口号,请求文件路径,请求字符串(GET请求字串)等等。

响应数据生成器,主要是根据请求中的字段,生成相应的响应数据。1. 对服务器上静态页面的请求,就直接把请求文件路径字段对应的文件读取出来,传递给响应数据包封装器。一般来说图片、静态html页面,css文件,javascript文件都是这样。 2. 而动态页面的请求,则需要调用安装在web服务器程序里的动态程序引擎,执行相应的web程序,才得到响应数据。web开发者开发程序主要打交道的主要就是这里所说的“动态程序引擎”,web开发者编写的程序正是由它执行的。每种动态程序,如php, jsp, python, asp(.net)等,都有其相应的引擎;其中asp的引擎比较特殊,它内置在iis里,以一个.dll的形式存在,与iis紧密联系。

响应数据包封装器,把动态或静态生成的响应数据,附带上必要的http头字段,构造成http响应数据包。

最终生成的响应包,递交给操作系统,由操作系统发送给客户端。

 

浏览器的主机功能

浏览器至少包含以下重要的功能模块:域名解析客户端,http请求封装器,http响应接收器,排版引擎,客户端脚本解析引擎,页面缓存系统,cookie处理模块,

域名解析客户端,互联网上的主机需要与任何主机进行数据传输,都需要知道对方的ip地址,使用网址访问服务器时,就必须查询到网址域名的ip地址,该项工作就是由域名解析客户端进行。工作过程大致如下:域名解析客户端向dns服务器(操作系统的网络配置里的dns配置)发起域名解析请求,请求包中包括待解析的域名,dns服务器通过一系列查询,得到域名对应的ip地址,返回给域名解析客户端。

http请求封装器根据请求域名的ip地址,请求域名、端口、文件路径、GET字串、POST数据、COOKIE、浏览器描述信息(user-agent, 是否接收zip压缩,保持连接等)等信息,封装成http请求数据包,提交给操作系统,发送给目标服务器。

http响应接收器,接收服务器的响应数据包。

排版引擎,根据html文档,css样式把页面内容显示在浏览器视图区域。

客户端脚本解析引擎,处理客户端动态脚本,主要是javascript,在IE系列浏览器里还有vbscript.

页面缓存系统,打开网页时,如果页面中的一幅图片是刚刚请求过的图片,就不必重新向服务器请求该图片,而是使用之前请求返回的图片文件,这样可以加快整个网页打开速度,还节约带宽。这就是页面缓存系统的功能。

cookie处理模块,cookie机制在浏览器上的实现。

特殊的浏览器:搜索引擎的蜘蛛,即网络爬虫,自动获取网页html代码,用于搜索引擎的索引系统。

 

浏览器几个特性

连接保持,缓存,排版引擎差异,

连接保持,浏览器与服务器进行数据传递(http请求与响应都是数据传递)前,需要建立数据连接,一般是tcp连接,而这一过程通常是个比较耗时的过程。为了减少整个数据传递的总耗时、从而加快页面打开速度,通常会开启“连接保持”的功能,即服务器与浏览器在首次建立tcp连接、并完成一个http数据传递后,并不把这个tcp连接断开,而是暂时保持一段时间(一般在2分钟左右),如果这一段时间内还需要进行数据传输,则直接使用这个tcp连接;这样就节省了建立连接的时间花费。

缓存,已经在上面讲述过(打开网页时,如果页面中的一幅图片是刚刚请求过的图片,就不必重新向服务器请求该图片,而是使用之前请求返回的图片文件,这样可以加快整个网页打开速度,还节约带宽)。缓存在动态文件上有可能造成一些问题,如有一个动态user.php,作用为显示当前用户的状态;当浏览器第一次打开该文件时,用户状态是未登录的,而用户登录后,该页面将显示用户信息;但如果浏览器使用缓存,则还显示未登录的信息。所以就需要在响应数据包的http头中加入一个字段: Cache-Control,标识是缓存有效期 ,用于告诉浏览器当前页面使用缓存方式。如果在http响应头里没有这个字段,浏览器就按其自身默认设置应用缓存,而不同的浏览器默认设置并不相同。正是因此,有时页面刚刚修改过,但某些浏览器显示的还是老内容,点浏览器的“刷新”也不行,只能关闭浏览器窗口,并清空缓存。强制浏览器不使用缓存还可以在每次请求的地址后面加入随机的GET字串,如user.php?a=25seg

排版引擎差异,同样的html,在不同浏览器里显示效果并不相同,如IEfirefoxchrome等浏览器之间,甚至IE的不同版本间都有很大差异。

 

 

 

web服务器是安装了web服务软件的一台主机,web开发者的计算机中一般都会安装上相应的web服务器端软件,常称为web server,如apache, iis 等,这台计算机也就是一台web服务器;同时,该主机上也有浏览器,因此,这台物理上的主机,既上服务器端也是客户端。

 

 

实例:简单模拟一个常规静态页面的打开。

服务器www.testsite.net上有这样一个简单网页(如图),其中包含一个html文档及一张引用图片

index.html

<html>

<head>测试网页</head>

<body>

<p>第一行文字</p>

<p>the 2nd line</p>

<img src=”img.jpg” alt=”just a test image” height=”50” width=”40” />

<p>本文档到此就结束了</p>

</body>

</html>

 

img.jpg

 

 

 

 

就这两个文件,放置在站点www.testsite.netweb根目录下,这样使用浏览器访问www.testsite.net/index.html就可以打开这个页面。这个过程至少包括以下几个重要的步骤:

  1. 域名解析。浏览器根据用户输入的网址,从中获取请求的主机名,www.testsite.net,通过域名解析获得该域名对应的ip地址192.168.10.166.
  1. 请求数据库的封装。浏览器根据用户请求,把多个信息封装成为http请求包,这个请求包里一般都包含以下几部分,请求的主机名,请求服务器上的文件路径,请求字符串,cookie,客户端(浏览器)的IP地址等(除此还有,客户端user-agent字符串,是否接受zip压缩等多个字段)
  2. 浏览器(客户端)提交给所在计算机操作系统,由操作系统把封装好的http请求数据包提交给目标主机,这里就是www.testsite.net所在的192.168.10.166. 提交完成后,浏览器一般会在状态栏里显示为“正在等待服务器响应”,并显示进度条表示等待服务器返回响应数据的过程。。
  3. 服务器接收到客户端的请求后,由操作系统把这个请求递交给web服务器(一般是apache, iis 等)。
  4. web服务器对这个请求包进行分析,然后交由www.testsite.net站点进行处理。
  5. web服务器到www.testsite.netweb根目录下寻找index.html,找到该文件后,把此文件的内容读取,然后按照http响应数据包的格式进行封装。其中包括http响应数据头,响应数据内容主体两大部分。响应头里包含了响应状态码,响应数据类型(这次为text/html),要求客户端设置cookie的信息等。
  6. 客户端从服务器响应数据包里,解析出响应数据的类型,为text/html,浏览器于是按照text/html的格式分析其内容,边分析边把页面内容按html格式显示在浏览器的页面里。(不同的排版引擎之间对html的解析稍有不同,所以同样的网页在不同浏览器下看到效果可能稍有不同)
  7. 浏览器解析index.html文件时,发现其中还有对图片img.jpg的引用,于是再发送一次http请求给服务器www.testsite.net,用于请求img.jpg文件。这一过程,如果发生在浏览器全部获取http响应数据之前,就可以解析出还需要其它文档,这里就开始对下一个页面元素的请求;而不是等浏览器还没有读取到完整的html文档后,这样无疑就加快了浏览器打开页面的速度。如果打开一个比较庞大的html文档时,这个影响就很可观了。
  8. 服务器对请求图片的http请求作出响应。这次响应的数据类型是image/jpeg.
  9. 浏览器得到服务器的响应,解析出图片,并把图片在index.html页面上绘制出来。

 

直观查看http数据包的传递,及http

工具:firefox(需要插件live http headers, firebug)

一般我们通过浏览器看到的内容,都是http数据主体的内容,而http头,我们一般是看不到的。因为浏览器向我们隐藏了这些细节,这些细节对于一般使用者是没有意义的。但对于web开发人员,还是十分有必要理解这些的。所以我们就需要借助一些工具达成目的。

可以查看http头的工具很多,包括本机网络数据抓包工具,浏览器插件等都是可行的,以浏览器插件最为简便实用。

 

 

域名与web服务器 /域名解析,域名绑定

域名解析,有时也会说dns解析。互联网上的数据传输依赖于IP地址,但日常使用的却是英文域名,所以首先要把域名解析为IP地址,这项工作是dns服务器进行。而前面说过,服务器的工作都是被动的,这个域名解析过程中的主动方就是需要把域名解析为ip地址的程序,在B/S架构里,就是浏览器(B,browser)

平时我们在浏览器地址栏里输入网站域名,就能打开其网页,看似域名与web服务器是同一套服务,但事实上完全不是这样。域名服务与web服务两人者是隔离的,要把这两者协同工作,我们至少需要完成两项工作:域名解析到web主机ip地址、web主机上设定该域名的站点。

以实际中的例子讲解。举个例子,我们注册了一个域名path8.net,注意,注册域名时,前面没有wwwwww其实是我们注册域下的一个子域名,子域名我们可以任意开设。不过习惯上,在web上,大家都把www的子域名作为主要域名;甚至有些人错误的认为域名前面都要带www,笔者就多次见过这样的情形。笔者参与维护的一个网站为客户开设了子域名服务,于是就有了zhangsan.xxx.yy, lisi.xxx.yy, wangwu.xx.yy等等这样的一系列子域名,但很多用户访问网站时,会输入www.zhangsan.xxx.yy这样的域名,就是在子域名前面再加上www. ,这当然是无效的子域名。然而我们无法给每个访客说明子域名与www的关系(我们无法控制用户的行为,只能适应用户,或者有意引导用户),所以使用了一个巧妙的方法,对于www.subdomain.xxx.yy的请求,在web程序里直接把前面的www.去掉,这样用户即使

多输www.也可以打开正确的页面。扯远了。

每一个子域名都是需要单独设置解析的,域名解析有多种形式,最常见的就是A记录,也就是直接把一个域名解析到一个ip地址上。除了A记录外,还有mx记录,cnametxt记录等。cname记录是把域名解析到另外一个域名上,也称为“别名”,这点非常有用。假设我有100个域名,我想把这100个域名全部指向到一台主机上,但这台主机的ip地址会定期改变。,这样的话,岂不是ip地址一变化,我就要设置100条域名解析信息吗?!如果有更多域名,可想而知是什么情况。借助cname就可以轻松实现这一点,我可以把其中100个域名“别名”。到一个域名(如alias.xxx.yy)上,然后再为这个域名alias.xxx.yy设置一条A记录到ip地址上;以后只需要修改alias.xxx.yyA记录就可以了。cname还经常在cdn加速服务器设置。mx记录是用于邮件系统的,txt一般用于防止“谎称域名而发送防垃圾邮件”的授权验证。如果你看过域名管理的控制面板,应该见过这些。

上面所说的A记录,mx记录,cnametxt记录,每设置一条都是一条解析。如果为path8.net设置 5A记录linux.path8.net, php.path8.net, mysql.path8.net, path8.net, 另有2cname记录,一条mx记录,那我们就一共需要设置5+2+1=8条解析记录。事实上,我们的域名注册(服务)商,一般不会允许我们设置无限多条解析记录的,限制通常是1020条,如果需要更多条解析,就需要另外购买了。当然我们可以自建dns服务器,用来解析我们的域名,而不再使用域名商的解析服务,这样我们就可以设置任意多条域名了。不过自建服务器费用昂贵,通常没有这个必要。

有人问了,如果我有100万个用户的博客站点,我想为他们每个人开设一个子域名,可以通过cname别名到一个域名上,对这个域名再设置A记录。这种情况下,我就需要100万还多的解析,不自建服务器怎么办呢? 我们的回答是,照样不需要,我们可以设置泛域名解析。泛域名解析就是把所有没有设置的子域名全部都指向一个ip地址S上。如上对path8.net 设置了4个子域名,再设置一个泛域名指向ip地址P上。这样linux.path8.net的解析当然还是ip地址S,而对windows.path8.net, mssql.path8.net, 将全部解析到ip地址P(如果没有设置泛域名解析,这几个子域名将全部解析失败)。当然,泛域名解析需要域名商的支持(多数域名商是支持的)。

对域名解析扯了很多,也不过是简单介绍,对站长入门有一参考价值,但于web开发人员来说,可能显得多余。不过,个人感觉,对web系统运行的背后的知识不了解,知识结构总是显得苍白无力。个人当初学习web开发时,就对这些东西很感好奇,但不知道去哪里学习(个人完全是靠自学计算机方面的东西,除思科ccna的培训之外,可以臭美一下~~)。

 

下面还要对web程序在服务器上的设置做一下简单介绍。这也是web开发的入门级人员有必要了解的。

 

web服务器,当下最常用的是Apache HTTP Server (简称apache, httpd) internet information services(简称iis)。这里不对它们的配置方法介绍,主要是讲web 服务器共同之处。

最初一台web服务器只能设置一个web站点(对应一个域名),也就是说,如果我要开设一个web站点,就要一台web服务器;每增加一个域名,就要新安装一台物理上的服务器,即使是一个访问量很小的站点也是一样——这早已是很古老的事情了——这里面就有一个无法发挥服务器性能及浪费的问题了。

聪明的人类发现问题后,总是会想解决方案的。虚拟主机的概念就此应运而生。它就是在一台物理的服务器、一套web服务器软件、一个ip地址、一个对外服务的端口上,同时运行多个web站点。在同一台服务器上运行多个web站点,从软件开发角度上讲,就是要用一种机制,把这多个站点区分开来。如果你对网络基础有所了解,这一点类似于:在同一个ip地址、一种协议上,可以使用“端口”对外建立多个数据连接。区分多个web站点的方式,就是“虚拟主机技术”,其实原理非常简单的,就是找区分标准。一台服务器同时运行多个站点,那么这些站点的域名是不同的,我们就可以根据这一点做文章了:如果我们开发一套web服务器软件,它根据客户端(浏览器)发来的http请求数据包里的“主机名”——就是请求网站的域名——的不同,向请求方返回相应站点的页面,这样不就可以解决问题了!

事实上虚拟主机就是这个原理,主流的web服务器软件都有这样功能,不需要我们做相应开发了。

早期的web服务都是静态文件,当时的web服务器主要就是为了共享一些文档而用的;动态web程序是后来才的有。web服务器上每个web站点都对应着一个目录,作用就是通过http协议共享这个目录里的文件。

那我们是否可以在web服务器上建立多个站点(每个站点对应一个域名),对多这个站点全部设置为同一个目录呢?答案是肯定的。但这并不是最简便的方式,可以只建立一个站点,而对这个站点绑定多个域名。

了解了以上这些,你可能已经想象到了:web服务器的多站点功能,其实是一个web服务器软件对http请求的分发,把不同的http请求分发给相应的web站点进行处理;而web站点都是对应着服务器上的一个目录。

上面我们对虚拟主机的讨论,是建立在一个假定的基础上:web服务器只有一个ip地址。那如果我们的web服务器有多个ip地址,是否是也可以就此区分多个站点呢?答案是肯定的。这也是虚拟主机的一种实现机制(同样是对http请求的分发机制),不过目前ipv4的地址很缺乏,都“告急”好些年了,尤其在中国,几乎大家都是在“凑合”着用,大多数公司的办公室都是用对外一个ip地址,通过nat在内部使用私网ip地址,甚至听说有些地方adsl拨号获得的ip地址都是私网ip地址了。又扯远了。总之,就是说ip地址是稀缺资源,“基于ip地址划的虚拟主机”代价太高,很少这么用。而“基于主机名划分的虚拟主机”是常用的,几乎所有的虚拟主机提供商都是采用这种技术。国外某些虚拟主机提供商还提供独立ip地址,他们是把这两人种虚拟主机技术结合实施的。

还说“基于主机名划分的虚拟主机”,我们要在一台服务器上设置多个虚拟主机,就要建立多个站点,给它们分别设置不同的域名(域名绑定)。

再回到我们前面讨论过的“为100万个用户分别设置子域名”的问题。这100万个子域名,是否都要逐个设置呢?先不说答案,我们自己从底层原理上分析一下先。

http请求分发的观点分析:web服务器接收到http请求后,从请求包里读出出所请求的域名,如果发现它是该服务器上绑定的域名,就把该请求分发给相应的web站点进行处理;但如果不在已绑定域名之列,那怎么办呢? 对这样的请求,要么正确响应,要么返回给请求浏览器一个错误消息。返回错误,很简单,就是”请求错误,域名未知”这样的错误消息,不知你是否注意过打开某些网址后显示Bad Request (Invalid Hostname) 样的消息时,这就是iis对这要错误返回的消息文本。而要向请求方发回正确的影响该怎么办呢,总得把这个请求交给一个站点处理才可以吧?是这样的,这个对非配置域名也能处理的站点,就是“默认站点”。

分析到这里,你是否已经想到这怎么解决对100万用户分别设置子域名的解决方案了,不错,就是借助web服务器软件的默认站点功能。

是否发现了,这里有一个问题,那就是一台服务器上只能配置一个默认站点,也就是这要的功能,在从虚拟主机商购买的虚拟主机上,是难于实现的(除非你在该虚拟主机上有独立ip地址,再加上虚拟主机商提允许你“配置该ip地址的默认站点”的功能)。想通过配置默认站点的方式给100万会员分别分配子域名,只能在独立主机上实现。

现在假定已经有独立服务器并配置好了默认站点,它被设置到了一个目录上,我们在web开发者的角度,分析一下怎么对不同的子域名返回不同的页面。

这个问题,其实还是请求分配的问题。现在的情况是:默认站点对应的是一个特定的目录,也就是这些所有子域名,都是靠同样的处理程序实现的。不同的用户有同的用户id号。如果有这个id号,我们就可以根据这个id号,向浏览器输出相应的页面(一般是从数据库里读取出来相应的数据,并形成动态页面)。就是要根据用户id号来作为区分标准,显示不同的页面,现在我们没有这个id号,但我们可以根据子域名的最前一段进行区分。也就是,我们可以根据用户的用户名(或是让用户自己设定的一个子域名)分配子域名给每个用户,而在服务器端的处理程序上,根据用户子域名,从数据库里查询出该用户的id号,接下来,就是常规的程序了,这里就不需多讲了。

 

这里有一个问题,如果一台web服务器上配置了10个域名,浏览器向这台服务器发送一个http请求包,这个请求包里如果包含的是这10个域名其中之一,是没有问题的,可以正确得到结果。但如果请求的是这10个域名之外的域名,返回什么结果呢?

 

综合讲一下域名及web服务器。域名服务器与web服务器是相互隔离的,我们要建网站,就至少要做两个工作:注册域名及对域名的设置,购置web服务器(可以是实际的服务器也可以是虚拟主机)及对web服务器的设置。详细过程大致如下:

  1. 注册域名。(获得了域名及对域名解析到ip地址的管理权)
  2. 购买web服务器。(获得web服务器ip地址及web服务器主机名——也就是域名——的设置权)
  3. 把域名解析到web服务器的ip地址上。一般使用A记录解析。
  4. 把域名“绑定”到web服务器上。使用apache独立主机的话修改apache配置文件,iis的话在iis管理器里,从虚拟主机商购买的虚拟主机的话在的管理后台里。

后两步的设置工作,是缺一不可的。

可以这样讲,因为 域名服务器与web服务器是相互隔离的,所以要建站,就要对域名及web服务器做双向指向:要让域名知道web服务器的存在(域名解析),还要让主机知道域名的存在(域名绑定)

(未完待续)

————————- 以下是计划写入的主题条目,实际可能会有适当增减 ——————————-

服务器特性:相对性;从来都是被动的,从来不主动向任何对象发送数据,而是只在收到请求后才响应;“伺服器”的名称更体现这特点。

dns解析,tcp/ip网络的数据库传输必需得到对方的ip地址才能进行。

http封包

osi七层及tcp/ip

网络数据传输(局域网广域网交换机路由器)简述

web服务器

防火墙

http请求包的拆解,http请求包的分配(被web服务器分配到相应的站点,默认站点)

HTTP变量赋值,rewrite

web语言脚本解析引擎

http响应包的封装,脚本引擎生成部分,再由web服务器补充

http响应状态码

http无状态性及patch方案

cookie,session,不同语言的session机制,不互通

浏览器解析html文档,载入内嵌媒体(图片,js,css等),cookie

http连接保持

客户端脚本javascript执行,js事件触发,ajax

排版引擎

web server的多站点原理,

程序并发性,冲突:

正在进行的一个操作,受到了另一个操作运行的影响,就有可以造成并发访问问题。

(正在进行的一个操作的结果,影响了另一个操作进行的条件)

在一个操作操作完成所需要的时间段内,有另外一个操作也对该资源进行可能冲突访问(一般是“写”),就很有可能造成并发冲突

 

发表评论?

1 条评论。

  1. 很有收获,挺楼主

发表评论