Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18681641
  • 博文数量: 7460
  • 博客积分: 10434
  • 博客等级: 上将
  • 技术积分: 78178
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 22:54
文章分类

全部博文(7460)

文章存档

2011年(1)

2009年(669)

2008年(6790)

分类: BSD

2008-11-04 08:23:34

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

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

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

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

请求转发过程以rotoDispatch()函数开始。该函数peer选择,可能包含发送和接受ICP消息的调用。peer选择算法也会检查相关配置选项例如never_directalways_direct

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

HTTP模块首先打开到原始WEBcache 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里注释掉其自身。同时它要么等待客户端的下一个请求,要么关闭客户端连接。

阅读(943) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~