标签:soft 描述 http请求 处理过程 driver 比较 代码 之间 现在
一,服务器接受http请求的实际处理过程
二,当客户端将请求通过网络传送到服务器时,HTTP.SYS会在内核模式下实时监听当前的http请求。Http.sys功能如下描述:
http.sys 是一个位于Win2003和WinXP SP2中的操作系统核心组件,
Http.sys是IIS 6.0使用的新型侦听器。在IIS 6.0出现之前,inetinfo.exe完成侦听HTTP请求的功能,同时还要将请求转发给对应的处理程序。从IIS 6.0开始,侦听器与inetinfo.exe分离开来,inetinfo.exe在用户模式下运行,Http.sys则完成侦听HTTP请求的功能,在 内核模式下运行。
1. 内核模式和用户模式
在Windows Server 2003中,一个进程既可以运行于内核模式,也可以运行于用户模式。如果一个进程运行于内核模式,那么这个进程就可以访问所有硬件和系统数据;如果一个进 程运行于用户模式,那么这个进程不能直接访问硬件,而且访问系统数据时也会受到限制。在Intel处理器架构中,内核模式运行于ring 0之内,而用户模式运行于ring 3。通过在内核模式运行Http.sys,侦听器可以直接访问TCP/IP协议栈,但是又能够位于WWW服务之外,这样就不会受到应用程序中代码缺陷的影 响,也不会因为应用程序崩溃而出现问题。
通过在内核模式运行,Http.sys获得了比较高的优先级,与先前版本的IIS相比,对HTTP请求响应速度比较快。Http.sys不仅因为具 有较高的优先级而提高了IIS的性能,而且,还可以在等待应用程序响应(即使应用程序已经停止响应)的同时,将请求进行排队。在IIS 6.0中,每个应用程序池都拥有一个内核模式队列,Http.sys可以将请求转发给合适的队列。所以,在IIS 6.0中,当我们对性能进行调优时,可以将负载比较重的应用程序分隔到不同的应用程序池,从而使负载比较轻的应用程序不必与负载较重的应用程序共享同一个 队列。对每个应用程序池而言,队列规模是可配置的。
Http.sys可以将请求进行缓存,并尽可能地在内核模式中完成对请求的服务。如果某个请求的响应已经得到了缓存,那么IIS就无须重新处理这个 请求,Http.sys只需要将这个响应从缓存中取出,这样就绕开了所有的IIS功能,从而也就避免了重新处理。这些已缓存的请求都保存在内存中,并且不 允许换出,因此,尽可能地增大系统内存是提高IIS性能的一种简单有效的方法。
尽可能地增大系统内存还能够减少inetinfo.exe的磁盘交换次数。inetinfo.exe运行于用户模式,可以在必要时交换到磁盘空间。如果系统内存过少,那么IIS的性能会急剧下降。
2. 其他Http.sys功能
针对HTTP请求和响应,Http.sys还能够处理TCP/IP连接,包括创建连接和断开连接。因为Http.sys直接运行于TCP/IP协议栈之上,因此还需要处理连接和超时,以及连接数限制和带宽不足。此外,Http.sys还需要处理日志。
Http.sys通过执行两项重要功能来提高IIS 6.0的性能。首先,Http.sys在内核模式下对请求进行缓存,因此,为了给某个请求提供服务,如果该请求所需内容最近已经为先前某个请求提供服务 (无论是提供静态内容还是提供动态内容),那么可以在内核模式下直接为该请求提供其所需内容,而不需要再切换到用户模式下在inetinfo.exe进程 中运行。
Http.sys还可以将请求进行排队,由合适的工作进程完成对请求的服务。每个应用程序池都拥有自己的队列,队列的规模是可以配置的,这样,我们 可以对某个具体应用程序池的性能进行调优。针对可能会发生失效的应用程序,使用队列还有另一个优点,就是针对失效应用程序的请求仍然会保存在队列中,直到 队列中保存的请求总数达到该队列的上限。当应用程序能够重新进行响应时,这些请求仍然能够得到处理;此外,通过自动重启发生失效的应用程序池,还能够降低 响应时间,从用户看来,应用程序的响应仅仅是稍微延迟了一点。
三,Http.sys是如何知道当前这个请求是给哪个应用程序池?????
当实施工程师创建应用程序池的时候,会将对应的应用程序池ID注册到注册表里面,这个注册表是Http.sys里面的。那么Http.sys会根据当前请求送到对应的应用程序池里面。
四,IIS如何处理
在了解 IIS 如何处理 ASP.NET 请求之前,我们必须要清楚 Web 服务和 Web 应用程序之间的界限。Web 服务器与 Web 应用程序之间的关系,就像 操作系统 与 普通桌面应用程序之间的关系一样 —— 一个提供了运行环境,一个提供实际的业务功能实现。简短一点说,一个是宿主 Host ,一个是应用程序 Application。操作系统能够为各种各样的应用程序提供运行环境,而 Web 服务器是构建于操作系统之上的、具有针对性的应用程序宿主(针对 Web 应用程序),就像 Windows 服务一样。没错,如果你对 Windows 服务的了解多过 Web 服务器,那么使用类比法通过 Windows 服务来了解 Web 服务器是个不错的选择(事实上用 Web服务 替代 Web服务器来表述可能会更合理一点,但这样就很容易将 Web服务 与 .NET Web Service 技术搞混)。
在中文操作系统中,IIS 被称为 互联网信息服务 —— 这是 Microsoft 公司提供的运行于 Windows 操作系统之上的 Web 服务器,它的功能绝不只是能处理 ASP.NET 请求。但本文要尝试讲明的是 IIS 如何处理 ASP.NET 请求,所以,我们可以假设“IIS就是为 ASP.NET 而生的”。
作为 Web 服务器,IIS 的主要工作是接收请求并通过Web管理服务(Web Admin Services,WAS)将请求分发给不同的应用程序池。
应用程序池接收到请求后,根据当前运行状况将请求投放给某个工作进程(w3wp.exe),工作进程会依据请求 url 的相关特性(比如后缀 aspx)选择和加载特定的 ISAPI(Internet Server Application Programming Interface,网络服务应用编程接口)。
ASP.NET 对应的 ISAPI 为 aspnet_isapi.dll, 它将构造一个 HttpRuntime 作为应用程序入口,从这里开始,请求将会来回经过HttpApplication 中的一序列 HttpModule 和 HttpHandler,然后做出响应。
.NET 程序员应该都知道,想要 ASP.NET 正常运行,必须安装 .NET Framework。但有时候明明已经安装了 .NET Framework,部署在 IIS 上的网站却怎么也不能正常访问,然后在网上折腾捣鼓,终于在运行 aspnet_regiis 并设置应用程序池的 .NET Framework 版本之后就可以正常访问了。 没错,运行 aspnet_regiis 的目的是为了 将相应版本的 .NET Framework 注册到 IIS ,如果你是先安装 IIS ,后装 .NET Framework, 就无需那么复杂 —— .NET Framework 会自动注册。
.NET Framework 注册到 IIS 时,就会给 IIS 添加相应的 ISAPI —— aspnet_isapi.dll。
IIS 内核模块(Kernel Mode)包含一个 HTTP.SYS 文件。
向 IIS 添加一个应用程序池的同时会生成一个对应的标识ID,并被记录到 HTTP.SYS(事实上记录的是 url 与 应用程序池之间的对应关系)。
任何来自客户端的 HTTP 请求都将首先触发 HTTP.SYS 。事实上 HTTP.SYS 本身不会执行任何代码,它仅仅是监听客户端的 HTTP 请求。HTTP 请求包含了 Web 站点的主机(或 IP)、端口和资源路径信息,即 url —— 根据映射,IIS 自然就知道如何分发请求给应用程序池了。
标签:soft 描述 http请求 处理过程 driver 比较 代码 之间 现在
原文地址:https://www.cnblogs.com/LGDD/p/9129850.html