Mongoose源码剖析:外篇之web服务器

引言

在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个web服务的这些通性。

web服务器:通常是指一个计算机程序(web服务器是什么?),在World Wide Web上提供诸如web页面的服务(提供什么服务?),使用HyperText Transfer Protocol(HTTP)(使用什么协议?)。当然web服务器也可以指运行这个程序的计算机或虚拟机,我们这里讲到的web服务器是指程序。

本文的主要内容如下:

  • 1、web服务器
  • 2、web服务器怎样提供服务
  • 3、web服务器使用的协议
  • 4、客户端如何唯一标识web服务器的资源
  • 5、当前比较流行的web服务器

1、web服务器

web服务器的主要功能
是传送web页面给clients。这意味着,传送HTML文档和其它包含在文档中的内容,诸如images、style
sheets、JavaScripts。client通常是一个web浏览器或web爬虫,使用HTTP发起一个指定资源的请求,web服务器用指定的内
容响应请求,或当不能做指定请求时返回一个错误消息。请求的资源通常是web服务器的辅助存储器上的一个实际文件,但是这不是必须,取决于web服务器的
实现。

虽然web服务器的主要功能是提供内容,但一个完整的HTTP实现还包括接收来自client的内容。这个功能用于提交web表单,包括上载文件。


多web服务器也支持服务器端脚本,例如,Apache
Http服务器和PHP。这意味着,web服务器的行为可以写成脚本分离到分散的文件中,然而实际的服务器软件仍然保持不变。通常的,这个功能用于创建
HTML文档,相对于返回固定的文档。这分别涉及到动态和静态内容。前者主要检索和(或)修改数据库中的信息,然而后者通常更快和更容易缓存。

web服务器并不总是用在万维网上,也可以嵌入到诸如打印机、路由器、网络摄像机和本地网络,这时web服务器可用于系统的监视部分,或设备的管理部分。

2、web服务器怎样提供服务


想过没有,当你在浏览器中看到我这篇日志的时候,它是如何显示到你的浏览器的呢?虽然这个过程很大程度上去取决于web服务器,但他们仍有共性。典型的,
当用户通过点击一个超链接或在浏览器的地址栏中输入一个URL浏览一个web站点。但是同一个站点如何同时在网络上的不同计算机上显示的呢?

以我博客的主页为例,当你在浏览器的地址栏中输入http://home.cnblogs.com/skynet/时,通过一个Internet连接,通过将域名转换为ip地址,然后定位到博客园服务器,你的浏览器初始化一个与博客园web服务器的连接。web服务器上存储了我的博客里所有的资源,如我写的每篇文章、文章中用到的图片、还有博客模板中用到的css、脚本等等。

一旦连接建立,浏览器使用HTTP从web服务器请求数据,服务器传输数据给你的浏览器。浏览器接着转换和格式化数据显示到你的浏览器中。类似的,web服务器可以同时发生文件到多个client,允许多个client同时浏览同一页面。

图1、Web客户端与服务器端的交互

当然,我这里描述的比较简单,更详细的步骤请参考:

3、web服务器使用的协议

相信通过上面的介绍,你已经知道了web服务器与client是通过HTTP来交互的。关于HTPP,我以前写过博文介绍过:HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等,我非常自信的推荐你去阅读以下这篇文章,比较详细地介绍了HTTP及其与client的交互过程,我这里就不再累述了。

4、客户端如何唯一标识web服务器的资源

URI,
没错就是它统一资源定位符(Uniform Resource
Identifiers),用它唯一标识Internet的一个web页面。不过你可能听的更多的是URL,它是Uniform Resource
Location的缩写,译为“统一资源定位符”。通俗地说,URL是Internet上用来描述信息资源的字符串,主要用在各种WWW客户程序和服务器
程序上。采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL的格式,URL的格式由下列三部分组成:

  • 第一部分是协议(或称为服务方式)
  • 第二部分是存有该资源的主机IP地址(有时也包括端口号)
  • 第三部分是主机资源的具体地址,如目录和文件名等。


一部分和第二部分之间用“://”符号隔开,第二部分和第三部分用“/”符号隔开。第一部分和第二部分是不可缺少的,第三部分有时可以省略。其实关于:
//不是必须的,只是万维网当初是这样设计的,请Google or
百度《万维网之父说http://中的两道斜杠其实多余》。完整的URL的格式如下所示:

scheme://username:password@domain:port/path?query_string#anchor

scheme就是上面我们所说的协议部分,web服务器中通常用的就是HTTP和HTTPS,但它还可以是gopher、wais、ftp、mailto。

username:password@domain:port就是我们上面说的第二部分,一般我们都不用输入用户名和密码、还有端口(HTTP协议的端口号是80,一般默认都用的这个),而只是直接输入域名orIP地址。

path?query_string#anchor
就是我们上面说的第三部分,path指定资源在服务器上的路径(注意:像这种archive/2010/05/18/1738301.html,不一定就
是web服务器上的绝对路径,而是经过URL重写之后的路径,但不管怎么样说,它还是唯一标识了资源在服务器上的路径);后面的query_string
包含传递给web应用程序(如CGI)的数据。查询字符串以键/值对的形式,并且每个键值对之间用&隔开,如userId=skynet&
amp;password=123456;最后当使用HTTP,#anchor表示web页面的某一个部分。

HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等为例它的URL是:http://www.cnblogs.com/skynet/archive/2010/05/18/1738301.html


面说到URI和URL,肯定还有人不知道他们的区别,下面我来解释一下。URI:Uniform Resource
Identifier,统一资源标识符;URL:Uniform Resource Locator,统一资源定位符;URN:Uniform
Resource Name,统一资源名称。 其中,URL、URN是URI的子集。他们的关系如下图所示:

图2、URI、URL、URN的关系

Web
上地址的基本形式是URI,它代表统一资源标识符。有两种形式:URL、URN。URL与URN好比,URN就像一个人的名字,然而URL就像这个人所在
的位置地址。换句话说,URN定义了一个元素的标识符,URL提供方法来找到它。即URN不依赖于位置,并且有可能减少失效连接的个数。但是其流行还需假
以时日,因为它需要更精密软件的支持。

5、当前比较流行的web服务器

下面是目前比较流行的几个web服务器软件,及他们2010年的市场份额。


Vendor


Product


Web Sites Hosted (millions)


Percent


Apache


Apache


111


54%


Microsoft


IIS


50


24%


Igor Sysoev


nginx


16


8%


Google


GWS


15


7%


lighttpd


lighttpd


1


0.46%

而我现在所研究的web服务器软件不在其中,之所以选Mongoose来研究,原因有三:

  • Mongoose比较小巧、容易使用,而且能够嵌入到现有的应用程序中。
  • 麻雀虽小,五脏俱全!Mongoose虽小巧,它具有基本的web服务器应该有的功能。通过研究它,可以更快地学习到web服务器软件的特性、实现细节。
  • Mongoose是开源的,可以自由使用。 
时间: 2024-08-18 04:40:38

Mongoose源码剖析:外篇之web服务器的相关文章

Mongoose源码剖析:Introduction and Installation

引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么协议.怎么提供服务等,如果你还不知道建议首先阅读:<Mongoose源码剖析:外篇之web服务器>. 本文主要内容如下: 1.Mongoose介绍 2.Mongoose的编译和使用 3.Makefile的简单分析 4.如何将Mongoose嵌入到应用程序中 1.Mongoose介绍 Mongoos

Mongoose源码剖析:核心处理模块

引言 前面我们介绍了 Mongoose所有的几个主要的数据结构mg_context.mg_connection.mg_request_info,还有Mongoose的 生命主线.有了这些基础就可以来看看Mongoose的核心处理工作是怎样的.如果你还没有阅读前面的文章,你可以通过下面的隧道直通: Mongoose源码剖析:外篇之web服务器 Mongoose源码剖析:Introduction and Installation Mongoose源码剖析:数据结构篇 Mongoose源码剖析:mon

Mongoose源码剖析:mongoose的工作模型

引言 我看一个项目的时候,比较喜欢首先看它的架构和设计.因为这样在研读源码的时候,有一个指导作用,不会迷失于具体细节,并能够引导我如何去将点串成线,将线串成面.而且一个软件怎么样,很大程度上取决于它采用的架构. 本文主要介绍Mongoose的工作模型,及根据这个模型将代码大致串起来,找出主线.内容框架如下: 1.线程模型 2.从程序入口着手 3.Mongoose的生命旅程 1.线程模型 Mongoose 采用了一个自适应的线程池的模型.有一个主线程(master thread)用于打开配置端口和

linux0.11内核源码剖析:第一篇 内存管理、memory.c【转】

转自:http://www.cnblogs.com/v-July-v/archive/2011/01/06/1983695.html linux0.11内核源码剖析第一篇:memory.c   July  二零一一年一月六日 ----------------------------------------- 博主声明:1.本系列非linux系统教程,仅仅是针对linux0.11内核源码,所做的剖析,注释.2.本系列参考:深入理解linux内核.linux内核完全注释,linux内核源代码情景分析

菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是"牛之鼻",只要能理清main函数,就一定能理解其中的奥秘,下面我们就一起来研究一下nginx的main函数. 1.nginx的main函数解读 nginx启动显然是由main函数驱动的,main函数在在core/nginx.c文件中,其源代码解析如下,涉及到的数据结构在本节仅指出其作用,将在第二节中详细解释. nginx main函数的流

Mongoose源码剖析:数据结构篇

引言 Mongoose中有几个数据结构扮演着重要的角色,它们分别是: struct mg_context:保存Mongoose的上下文,几乎每个函数都有mg_context参数 struct mg_connection:保存HTPP连接信息 struct mg_request_info:保存HTTP请求的信息,这个结构体传递给URL处理函数 我之所以现在这里介绍它,因为之后的分析工作中要用到它们,如果在读完本文后还不能很好的理解,请将问题带到后续文章中或代码分析中去,你会找到答案的.下面分别介绍

Apache Flink fault tolerance源码剖析完结篇

这篇文章是对Flinkfault tolerance的一个总结.虽然还有些细节没有涉及到,但是基本的实现要点在这个系列中都已提及. 回顾这个系列,每篇文章都至少涉及一个知识点.我们来挨个总结一下. 恢复机制实现 Flink中通常需要进行状态恢复的对象是operator以及function.它们通过不同的方式来达到状态快照以及状态恢复的能力.其中function通过实现Checkpointed的接口,而operator通过实现StreamOpeator接口.这两个接口的行为是类似的. 当然对于数据

Java集合源码剖析:TreeMap源码剖析

前言 本文不打算延续前几篇的风格(对所有的源码加入注释),因为要理解透TreeMap的所有源码,对博主来说,确实需要耗费大量的时间和经历,目前看来不大可能有这么多时间的投入,故这里意在通过于阅读源码对TreeMap有个宏观上的把握,并就其中一些方法的实现做比较深入的分析. 红黑树简介 TreeMap是基于红黑树实现的,这里只对红黑树做个简单的介绍,红黑树是一种特殊的二叉排序树,关于二叉排序树,参见:http://blog.csdn.net/ns_code/article/details/1982

Java集合源码剖析:LinkedList源码剖析

LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈.队列和双端队列来使用. LinkedList同样是非线程安全的,只在单线程下适合使用. LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆. LinkedList源码剖析 LinkedList的源码如下(加入了比较详细的注释): package java.util; publi