Squid请求处理的典型流程

2009-05-13 15:14:51来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折


客户端的连接,可被client-side模块接收和解析,也可以由clientBeginRequest()函数主动创建一个到客户端的连接。

检查访问控制规则。客户端请求会建立一个ACL数据结构,并且注册一个回调函数,用于在访问控制完成时,通知相关结果。

在访问控制通过后,请求可能被重定向。

客户端请求转交到GetMoreData()函数,该函数在缓存里查找请求目标,和相应的Vary:版本号。假如缓存命中,client-side模块注册其自身信息到StoreEntry里。否则,请求被转发,并可能带一个If-Modified-Since头部。

请求转发过程以rotoDispatch()函数开始。该函数
[url=javascript:;]启动[/url]
peer选择
[url=javascript:;]算法[/url]
,可能包含发送和接受ICP消息的调用。peer选择算法也会检查相关配置选项例如never_direct和always_direct。

假如有ICP响应抵达,选择过程就终止在protoStart()函数。该函数调用相应的协议级函数,用以转发请求。我们假设这里是一个HTTP请求。

HTTP模块首先打开到原始WEB
[url=javascript:;]服务器[/url]
或cache peer的连接(cache peer仅在配置了cache集群时才存在)。假如没有持久socket可用,就发起一个到Network Communication模块的连接请求,并包含一个回调函数。comm.c程序负责建立连接,并处理连接异常。

当TCP连接建立后,HTTP建立写缓存,并将请求写入socket。然后它建立相应的socket读缓存,用以接受和处理HTTP响应。

响应一旦接受,HTTP响应头部(header)被解析,并被放在一个响应数据结构里。在响应数据(data)被读取时,它被追加到StoreEntry里。每次数据追加到StoreEntry时,会通过一个回调函数,通知client-side模块有新的数据。读取速率取决于延迟池(delay pools,如果配置了的话)。

当client-side模块接收到通知后,它从StoreEntry里拷贝出数据,并写往客户端socket。

当数据追加到StoreEntry里,并被客户端读取后,数据可能被写往磁盘。

当HTTP模块完成了从上流服务器读取数据后,它把StoreEntry标记为“完成”。到服务器的socket可能被关闭,或被放入持久连接池,以备将来使用。

当client-side模块写完所有目标数据后,它从StoreEntry里注释掉其自身。同时它要么等待客户端的下一个请求,要么关闭客户端连接。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/4206/showart_1358831.html

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:(EAI 8)hostname nor servname provided, or not know

下一篇:apache mod_rewrite - URL Rewriting