手写WEB服务器-02-静态页面

手写WEB服务器-02-静态页面

1.客户端发起请求

当你在浏览器输入一个域名或者服务器ip的时候,发生了什么呢?

首先,你的浏览器比较智能,会把你输入的地址做一下修正,会给这个地址添加一个“http://”的开头,然后添加一个默认的访问端口80,以及默认文档根目录”/”,即实际效果相当于你输入了:

  • http://192.168.237.130:80/

其中:

  1. 192.168.237.130和80是web服务器的ip地址和端口号,这两个信息表示你要向这个ip的这的端口发起TCP连接,发送请求,接收应答等,所以web服务器本质上是一个侦听80端口的tcp服务器
  2. “http”表示这个tcp服务器跟客户端通信所用的协议,这是一个基于tcp的文本协议,协议的细节不在本文讨论范围内,如需详细了解可参考《HTTP权威指南》
  3. “/”是http协议的”文档根目录”,详细信息也可参考上书,为了便于理解,本文一律只考虑文档根目录为”/”的情况
  4. 如果输入的是域名而非ip地址,还要经过一次域名解析最终转换为ip地址,该过程也不在本文讨论之列,如需了解网上搜索相关知识即可

所以综上来说,当你在浏览器输入一个域名或者ip地址时,浏览器会把你输入的地址做下修正,添加一些必要的信息,然后将这个请求打包成http协议,发送给web服务器,即上文所说的那个侦听在80端口的web服务器。

那么在上面这个过程中,web服务器实际收到了什么呢?

2.服务器收到数据

我们以debug模式运行web服务器(websvr -d),在浏览器输入地址,回车访问后,查看后台日志(/root/websvr/log/websvr.log):

可以看到:

  1. 服务器收到的数据全是字符串,说明http协议是一个文本协议(而非二进制协议)
  2. 最重要的信息位于第一行,可以分成三段来看:
    • “GET”说明调用的是服务器的GET方法(与之类似的还有POST方法),表明客户端(浏览器)要从服务器请求数据
    • “/”表示从服务器请求的文件是哪个,这个信息其实有一个专用的名词叫URI,即统一资源定位符,这个路径唯一对应了web服务器上的某个文件,具体是哪个文件,后文马上解释
    • “HTTP/1.1″表示所用的http协议的版本号,这里不再赘述
  3. 其他行的信息,我们暂时用不到,这里直接忽略

3. 服务器处理过程

服务器收到的请求中,包含的最主要的信息就是URI,即客户端要访问哪个文件,即客户端要求服务器把哪个文件发给它。

我们看下服务器解析的结果:

其中method、uri、version是直接从客户端发送的请求中读取的,我们需要关注的是filename这个信息,这个信息是个文件路径,是web服务器根据uri翻译过来的,他是如何翻译的呢?

首先,这个”/”没有写全,这里其实是用到了一个默认用法,”/”写全了应该是”/index.html”或者”/index.htm”、”/index.php”等,浏览器没有提供的话, 服务器需要在处理时自动把这个index.*补全。

具体补全为哪个,在我们的服务器中是个配置(配置文件为:/root/websvr/etc/websvr.cfg),实际配置是:

因此在这个例子中,”/”会首先被补全为”/index.html”。

然后是翻译”/”的含义,”/”在http协议中表示文档根目录,这个目录会被web服务器翻译成web服务器所在主机上的某个实际的文件目录,具体翻译为哪个,在我们的web服务器中也是个配置:

因此在这个例子中,”/”会变成”/root/www”,所以完整路径就被翻译为了“/root/www/index.html”。

服务器所需要做的,就是打开这个文件,把它通过tcp协议发给客户端(浏览器)就行了。

浏览器收到这个文件后,会对其进行解析、渲染,最终呈现给我们的就是下面的画面了:

4.总结

这样一看,web服务器的原理确实非常简单,总结来讲就是:

web服务器本质上是一个tcp服务器,它侦听在80端口,接收客户端(浏览器)发来的请求,从中解析出URI,将URI翻译成服务器上的一个实际文件路径,然后把这个文件直接发给客户端(浏览器)。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注