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

2023-10-10 08:08

本文主要是介绍Mongoose源码剖析:外篇之web服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

2010-07-24 06:34 by 吴秦, 4725 阅读, 3 评论, 收藏, 编辑
引言

在深入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同时浏览同一页面。

image

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

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

  • What really happens when you navigate to a URL
  • 当你输入一个网址的时候,实际会发生什么?
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&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的子集。他们的关系如下图所示:

image

图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是开源的,可以自由使用。


作者:吴秦
出处:http://www.cnblogs.com/skynet/
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名吴秦(包含链接).

这篇关于Mongoose源码剖析:外篇之web服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179145

相关文章

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

JavaWeb 中的 Filter组件详解

《JavaWeb中的Filter组件详解》本文详细介绍了JavaWeb中的Filter组件,包括其基本概念、工作原理、核心接口和类、配置方式以及常见应用示例,Filter可以实现请求预处理、响应后... 目录JavaWeb 中的 Filter 详解1. Filter 基本概念1.1 什么是 Filter1.

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

Apache服务器IP自动跳转域名的问题及解决方案

《Apache服务器IP自动跳转域名的问题及解决方案》本教程将详细介绍如何通过Apache虚拟主机配置实现这一功能,并解决常见问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录​​问题背景​​解决方案​​方法 1:修改 httpd-vhosts.conf(推荐)​​步骤

Linux云服务器手动配置DNS的方法步骤

《Linux云服务器手动配置DNS的方法步骤》在Linux云服务器上手动配置DNS(域名系统)是确保服务器能够正常解析域名的重要步骤,以下是详细的配置方法,包括系统文件的修改和常见问题的解决方案,需要... 目录1. 为什么需要手动配置 DNS?2. 手动配置 DNS 的方法方法 1:修改 /etc/res

java 恺撒加密/解密实现原理(附带源码)

《java恺撒加密/解密实现原理(附带源码)》本文介绍Java实现恺撒加密与解密,通过固定位移量对字母进行循环替换,保留大小写及非字母字符,由于其实现简单、易于理解,恺撒加密常被用作学习加密算法的入... 目录Java 恺撒加密/解密实现1. 项目背景与介绍2. 相关知识2.1 恺撒加密算法原理2.2 Ja

Nginx屏蔽服务器名称与版本信息方式(源码级修改)

《Nginx屏蔽服务器名称与版本信息方式(源码级修改)》本文详解如何通过源码修改Nginx1.25.4,移除Server响应头中的服务类型和版本信息,以增强安全性,需重新配置、编译、安装,升级时需重复... 目录一、背景与目的二、适用版本三、操作步骤修改源码文件四、后续操作提示五、注意事项六、总结一、背景与

Android实现图片浏览功能的示例详解(附带源码)

《Android实现图片浏览功能的示例详解(附带源码)》在许多应用中,都需要展示图片并支持用户进行浏览,本文主要为大家介绍了如何通过Android实现图片浏览功能,感兴趣的小伙伴可以跟随小编一起学习一... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

Linux搭建ftp服务器的步骤

《Linux搭建ftp服务器的步骤》本文给大家分享Linux搭建ftp服务器的步骤,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录ftp搭建1:下载vsftpd工具2:下载客户端工具3:进入配置文件目录vsftpd.conf配置文件4: