前言:在园子里混迹了很长一段时间,一直没有自己的博客,此次本着学习和交流的态度也建了一个,以便对ASP.NET技术有一个沉淀,同时也给自己一个交待。好了,言归正传,一个WEB请求经过怎样的心路历程最终到达服务器,并其处理后返回给客户端呢?本着这个思路我会一步一步说下去,有不对的地方还望兄弟们踊跃拍砖。
开篇之前,我还是想特别声明一下,本系列是以IIS6.0为准进行阐述的。
当我们在浏览器地址栏中键入比如http://192.168.1.1/test.aspx,回车后,相当于向服务器(192.168.1.1)发送了一个Web页(test.aspx)请求,这个请求经由HTTP.SYS后转发到IIS。那么在到达IIS之前,HTTP.SYS对这个请求做了什么?HTTP.SYS又是个啥呢?它又有什么特点呢?这就是本系列的第一站:HTTP.SYS
HTTP.SYS是一个内核模式网络驱动程序。即HTTP.SYS运行在内核模式下,作为驱动程序而存在。从结构上来讲,HTTP.SYS是位于TCPIP.SYS之上的。也就是说,一个请求首先由TCPIP.SYS处理,然后才转发到HTTP.SYS上;同理,该请求被Web应用程序处理后作为响应返回时则是先到达HTTP.SYS在转发到TCPIP.SYS最后到达客户端浏览器。注意:TCPIP.SYS和HTTP.SYS都处于内核模式下。
如图:
注:为了避免用户应用程序访问或者修改关键的操作系统数据,windows提供了两种处理器访问模式:用户模式(User Mode)和内核模式(Kernel Mode)。一般地,用户程序运行在User mode下,而操作系统代码运行在Kernel Mode下。Kernel Mode的代码允许访问所有系统内存和所有CPU指令。
接下来让我们看一下HTTP.SYS功能特点:
(1) HTTP.SYS的主要功能是监听用户(来自于TCPIP.SYS)的HTTP请求。
(2) 管理TCP连接
(3) 验证HTTP请求。比如URL和Header长度等,如果验证没有通过则直接返回。否则将WEB请求放到适当请求队 列中,并对其进行排队。
(4) 路由HTTP请求到正确的WEB应用程序池。HTTP.SYS中维护着一个从URL到WEB应用程序池的对应关系路由表(映射表),所以HTTP.SYS可以迅速将WEB请求转发到web应用程序。注意,如果WEB请求没找到相应的映射,则返回404错误,就是我们常见的那个并不雅观的页面。当然你也可以自己画一个漂亮的将这个页面覆盖掉。
(5) 缓存web应用程序对于该请求的响应结果。当同一请求被频繁访问时可以不必转发到Web应用程序,直接从此缓存中将结果返回给用户,大大提高了其响应速度。
(6)实现比如连接限制、连接超时、消息队列长度限制以及IIS宽带限制等控制。
上面说了这么多,其最最重要的功能就是监听来自用户的WEB请求,请一定要记住。
HTTP.SYS其模块结构,如图:
|
|
上面介绍了HTTP.SYS是什么以及其功能特点,那么HTTP.SYS是如何工作的呢?
当你创建一个WEB站点的时候,IIS就会在HTTP.SYS上注册这个站点,这样就会接收来自该站点的任何WEB请求。HTTP.SYS从功能上讲类似于一个转发器。发送收到的WEB请求到WEB应用程序,并且发送返回的响应到客户端。
当IIS6.0在工作进程隔离模式下运行时,HTTP.SYS就监听用户请求,并为这些收到的WEB请求在适当的队列中进行排队。每个请求队列都对应一个应用程序池,一个应用程序池又对应一个HTTP.SYS中的请求队列和一个或多个工作进程。
通过上面的介绍我想也应该对一个WEB请求在HTTP.SYS中的历程有所了解了,即HTTP.SYS收到用户的请求后对其进行相关验证,通过则去映射表中查找其对应的应用程序池,找到后将该web请求转发到应用程序池的工作进程中,经WEB应用程序处理后最终又通过TCPIP.SYS将处理结果返回给用户浏览器。那么web请求被转发到Web应用程序池后,接下来会发生什么呢,我想通过本系列下一篇来着重讲述一下,不对之处,欢迎拍砖。谢谢。