从一个WEB请求说开去(四)
时间:2010-09-03 来源:大河
前面几篇是通过一个WEB请求的历程把iis6.0相关的几个重要知识点串起来讲述的,就像一个冰糖葫芦。而本篇作为结束篇,同时也作为总结篇,我会把这个WEB请求的整体流程贯穿起来讲述,以便给大家一个清晰的思路。如图:
步骤一、我们知道,HTTP.SYS收到来自客户端浏览器的WEB请求后,会判断请求的类型(HTTP或HTTPS),如果请求类型为HTTPS,HTTP.SYS会把这个请求放置到LSASS.EXE中的SSL队列。对于HTTP类型的请求我们暂且搁置,后面再说。
对于SSL请求,HTTPFilter会执行下面的步骤:
1) 监听被添加到SSL队列的请求
2) 从SSL队列中取出请求
3) 通过SSL解密来自HTTP.SYS的请求
4) 将解密后的请求返回给HTTP.SYS等待处理。
写到这里,我顺便简单描述一下SSL(Secure Sockets Layer),即安全套接层。SSL介于TCP/IP层和HTTP层之间,它是基于公钥密码机制的网络安全协议,用于在客户端和服务器之间建立一个安全通道,实现在Internet上传递信息的保密性,说的简单点儿,就是对HTTPS的请求/响应数据再进行一次加解密、验证等操作。注意,此处说的SSL处于内核模式下,千万别把它与上图LSASS.EXE中的SSL For HTTP.SYS搞混。实际情况比较复杂,有兴趣的朋友可以读读这方面的书籍。SSL简图如下:
当HTTP.SYS收到经SSL加密的请求后,处于内核模式下的HTTP 协议层并不会解密请求或加密响应,相反,处于用户模式下的HTTP SSL(HTTPFilter)会实现该功能。在工作进程隔离模式下,HTTP SSL(HTTPFilter)宿主在LSASS.EXE中。
对于处在IIS6.0工作进程隔离模式下的SSL请求,HTTP.SYS收到后会将其放到SSL队列中,HTTPFilter则会监听放入队列的请求,取出来进行解密,然后将解密后的请求返回给HTTP.SYS,此时,HTTP.SYS就会将解密后的请求放到适当的请求队列中,然后工作进程会直接从HTTP.SYS对应的队列中取出该解密后的请求进行进一步处理。其实,在将请求放入HTTP.SYS的队列之前,HTTP.SYS还会判断针对该请求的响应,在Response Cache中是否已经存在,如果已经有了会直接返回。
步骤二、 上面简要介绍了一下SSL以及对于HTTPS类型的请求的处理过程,下面让我们继续。我们知道判断完请求类型后,接下来HTTP.SYS还会判断请求的有效性。如果请求无效,则会直接返回400的错误页至客户端,如果请求有效,HTTP.SYS会检查在Response Cache是否已经存在针对该请求的响应。
步骤三、HTTP.SYS检查Response Cache的过程如下:
1) 如果响应存在,则立即返回响应而不必将请求转发到用户模式下的工作进程处理。
2) 如果响应不存在,HTTP.SYS会根据namespace Map映射表来判定将该请求放到哪个应用程序池
对应的队列中,然后将请求放入此队列。
3) 如果没找到该应用程序池对应的队列,或者这个队列已经满了,HTTP.SYS会返回一个503的错误页
给客户端。
步骤四、当请求放置到队列后,HTTP.SYS会查看有没有有效的且可以启动的工作进程,如果没有,HTTP.SYS会告诉WAS启动一个工作进程。
步骤五、启动工作进程过程中会加载相应的ISAPI以及CLR、创建应用程序域等操作。然后从HTTP.SYS的请求队列中取出该web请求进行相应的处理。
步骤六、将根据请求得到的web响应结果返回给HTTP.SYS并指示HTTP.SYS是否将该响应缓存到Response Cache。
步骤七、当然,HTTP.SYS还会判断响应类型(HTTP或HTTPS),如果是HTTPS类型的响应,HTTP.SYS就会将请求放到HTTP SSL(HTTPFilter)的队列中。
对于SSL响应,即HTTPS类型的响应,HTTP SSL(HTTPFilter)会按以下步骤执行:
1) 监听放入SSL队列的响应
2) 取出放入SSL队列的响应
3) 通过SSL加密响应
4) 将加密后的响应返回给HTTP.SYS
步骤八、HTTP.SYS将响应结果返回给客户端并记录针对该响应的请求(如果可以记录的话)。也就是说,如果有相同请求进来的话,会直接将其响应结果从Response Cache中去出来返回给客户端,这样就加快WEB请求的响应速度。
好了,说了这么多,不知跟大家讲清楚了没有,如果有啥问题还望兄弟们和我多多交流指正。本系列到此也就结束了,如果真要把IIS6.0说的面面俱到,就我所掌握的情况,我还真没那本事。就到这里吧,谢谢朋友们的支持,谢谢。