Squid请求处理的典型流程
2009-05-13 15:14:51来源:未知 阅读 ()
客户端的连接,可被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
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- mysql-bin.000001文件的来源及处理方法 2009-05-13
- OpenBSD下PF防火墙典型应用(针对FTP环境) 2009-05-13
- 使用Nagios监控服务器,Python处理故障通知(邮件与短信) 2009-05-13
- PF防火墙典型应用(针对FTP环境)OpenBSD 2009-05-13
- FreeBSD安装时关于硬盘参数提示的处理方法(整理) 2009-05-13
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash