HTTP.SYS 详解 (网络转载)
http.sys 是一个位于Win2003和WinXP SP2中的操作系统核心组件,
能够让任何应用程序通过它提供的接口,以http协议进行信息通讯。
温馨提示:如果用户不慎删除了该驱动文件,不用担心,该驱动会在下次系统启动时重建。是一个删不掉的系统核心组件!实用程序结束该驱动,该驱动也会马上重新创建(只有粉碎文件才不能马上重建,但粉碎后,下次启动会重建)。
微软在Windows 2003 Server里引进了新的HTTP API和kernel mode driver Http.sys,目的是使基于Http服务的程序更有效率。这个改变的直接收益者就是IIS 6.0 和 asp.net.
其实在Windows XP安装SP2后,Http.sys已经出现在系统里了,但事实上,操作系统并没有真的使用这个内核级驱动,而XP上自带的IIS 5.1也没有使用HTTP API。
新的HTTP API里最核心的变化都封装在Http.sys这个kernel mode driver里了。在此之前,基于HTTP协议的程序都是在User mode下运行的,而且必须自己处理诸如软件中断、context switch、线程调度等等问题,并且往往无法自由接触系统资源。过去,HTTP服务器,如IIS, Apache等都是利用Winsock API来创建一个User mode下的network listener。Network listener通常独自(i.e.: per application or per thread basis)占用一个IP端口。通俗点说,就是在同一时间只有一个应用程序可以监听一个端口,这在有些时候是一个不太令人舒服的限制。
新的Http.sys带来的好处大致有如下一些:
1. 缓存 - 静态的内容现在被缓存于内核模式下,这使服务响应速度更快
2. 记录 (Log)-IIS的log功能更快且标准化了
3. 带宽控制 - greater scalability control and throttling
4. 可靠性 - 所有的服务请求会在Http.sys里暂存入队列,而不是由服务程序本身来处理,这样,即使服务程序重启,尚未被处理的请求也不会丢失了
5. IP端口重用 - 现在,只要是通过Http.sys管理的端口(基本包括了那些著名的端口,比如80),都可以同时允许多个程序同时监听了。
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://www.delphi6.com/thread-6.htm
HTTP.SYS 详解 (网络转载)的更多相关文章
- 高并发网络编程之epoll详解(转载)
高并发网络编程之epoll详解(转载) 转载自:https://blog.csdn.net/shenya1314/article/details/73691088 在linux 没有实现epoll事件 ...
- [转载]详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
[转载]详解网络传输中的三张表,MAC地址表.ARP缓存表以及路由表 虽然学过了计算机网络,但是这部分还是有点乱.正好在网上看到了一篇文章,讲的很透彻,转载过来康康. 本文出自 "邓奇的Bl ...
- DNS解析过程详解(转载)
DNS解析过程详解(转载) DNS Domain Name System 域名系统,它就是根据域名查出IP地址. 先说一下DNS的几个基本概念: 一. 根域 就是所谓的“.”,其实我们的网址ww ...
- linux进程地址空间详解(转载)
linux进程地址空间详解(转载) 在前面的<对一个程序在内存中的分析 >中很好的描述了程序在内存中的布局,这里对这个结果做些总结和实验验证.下面以Linux为例(实验结果显示window ...
- Spring AOP详解(转载)所需要的包
上一篇文章中,<Spring Aop详解(转载)>里的代码都可以运行,只是包比较多,中间缺少了几个相应的包,根据报错,几经百度搜索,终于补全了所有包. 截图如下: 在主测试类里面,有人怀疑 ...
- ServletConfig详解 (转载)
ServletConfig详解 (转载) 容器初始化一个servlet时,会为这个servlet建一个唯一的ServletConfig.容器从DD读出Servlet初始化参数,并把这些参数交给S ...
- (转载)详解网络传输中的三张表,MAC地址表、ARP缓存表以及路由表
郑重声明:原文转载于http://dengqi.blog.51cto.com/5685776/1223132 向好文章致敬!!! 一:MAC地址表详解 说到MAC地址表,就不得不说一下交换机的工作原理 ...
- sk_buff封装和解封装网络数据包的过程详解(转载)
http://dog250.blog.51cto.com/2466061/1612791 可以说sk_buff结构体是Linux网络协议栈的核心中的核心,几乎所有的操作都是围绕sk_buff这个结构体 ...
- JScript中的条件注释详解(转载自网络)
JScript中的条件注释详解-转载 这篇文章主要介绍了JScript中的条件注释详解,本文讲解了@cc_on.@if.@set.@_win32.@_win16.@_mac等条件注释语句及可用于条件编 ...
随机推荐
- iOS 利用FZEasyFile本地保存 和 常规保存
1.常规保存(较麻烦) NSFileManager *fileManager = [NSFileManager defaultManager]; //获取document路径,括号中属性为当前应用程序 ...
- Windows完成端口与Linux epoll技术简介(能看懂)
WINDOWS完成端口编程1.基本概念2.WINDOWS完成端口的特点3.完成端口(Completion Ports )相关数据结构和创建4.完成端口线程的工作原理5.Windows完成端口的实例代码 ...
- OVS处理upcall流程分析
处理upcall总体框架: 1.由函数handle_upcalls()批量处理(in batches)的是由内核传上来的dpif_upcalls,会解析出upcall的类型.这里主要看在内核中匹配流表 ...
- Heterogeneous Self-Organizing Network for Access and Backhaul
This application discloses methods for creating self-organizing networks implemented on heterogeneou ...
- Delphi中预编译指令
本文转自 http://www.cnblogs.com/JackSun/archive/2010/12/20/1911250.html <Delphi下深入Windows核心编程>(附录A ...
- oracle的number的浅析
author:skate time:2011-02-14 oracle的number的浅析 从例如以下几个方面来认识number 1.表示的数值范围 2.占用的存储空间 3.number的性能 ...
- SQL Server 统计某个月周末的天数
---注意:这里统计的周末包括周5,周6,但不包括周日ALTER FUNCTION [dbo].[GetWeekDaysByMonth] ( @Year INT, @Month INT, @Day I ...
- win10 uwp 使用 asp dotnet core 做图床服务器客户端
原文 win10 uwp 使用 asp dotnet core 做图床服务器客户端 本文告诉大家如何在 UWP 做客户端和 asp dotnet core 做服务器端来做一个图床工具 服务器端 从 ...
- hdu 3966 树链分割第一3遍
真的不好意思说话.你写得越多,对风暴各种问题泄露,更离谱,有什么错有.. .但是,仍然有一个.同时经过规范的编写清晰的代码.不能认为是理所当然... 树桩阵列版: #include<cstdio ...
- 《STL源代码分析》---stl_stack.h读书笔记
Stack堆栈是频繁使用FILO数据结构,FILO指first in last out,最后出来. 因为只有一个堆叠端口,这也是在口腔进入口. 可以在堆栈中只能操作,你不能访问其它元件的堆叠.器. S ...