🔗 IP 缓存和 FQDN 缓存
🔗 简介
IP 缓存是 Squid 的内置组件,提供主机名到 IP 地址的转换功能并管理相关的数据结构。效率方面的考虑要求有允许对这些映射进行非阻塞访问的机制。IP 缓存通常不会在请求时阻塞,除非是期望发生的特殊情况(见下文)。
🔗 数据结构
用于存储名称-地址映射的数据结构是一个小型哈希表 (static hash_table *ip_table),其中包含 ipcache_entry 类型的结构,其最有趣的成员是
struct _ipcache_entry {
char *name;
time_t lastref;
ipcache_addrs addrs;
struct _ip_pending *pending_head;
char *error_message;
unsigned char locks;
ipcache_status_t status:3;
}
🔗 外部概述
主要功能通过调用以下函数提供:
ipcache_nbgethostbyname(const char *name, IPH *handler, void *handlerdata),其中 name 是要解析的主机名,handler 是 IP 缓存(或 IP 缓存未命中时的 DNS)的回复到达时要调用的函数的指针,handlerdata 是传递给处理程序的、不影响 IP 缓存的信息。ipcache_gethostbyname(const char *name,int flags),其区别在于它仅检查其数据结构中是否存在条目,并且默认情况下不联系 DNS,除非通过将 flags 设置为 IP_BLOCKING_LOOKUP 或 IP_LOOKUP_IF_MISS 来请求。ipcache_init()在磁盘初始化之后、反向 FQDN 缓存初始化之前,从 mainInitialize() 调用。ipcache_restart()被调用以清除 IP 缓存的数据结构,取消所有挂起的请求。目前,它仅从 mainReconfigure 调用。
🔗 内部操作
在内部,执行流程如下:在未命中时,ipcache_getnbhostbyname 检查该名称的请求是否已挂起,如果为真,则使用 ipcacheAddNew 创建一个新条目,并将 IP_PENDING 标志设置为 true。然后调用 ipcacheAddPending 将请求与数据和处理程序一起添加到队列中。否则,将调用 ipcache_dnsDispatch() 直接创建 DNS 查询,或者在所有 DNS 端口都空闲时调用 ipcacheEnqueue()。ipcache_call_pending() 会定期调用以遍历挂起列表并调用处理程序。LRU 清理通过 ipcache_purgelru() 根据 ipcache_high 阈值执行。
导航:网站搜索,网站页面,分类,🔼 向上