ATS回环检测

ATS的回环检测是通过判断本机ip是否出现在请求头中的Via头来实现。

Machine::Machine(char const* the_hostname, sockaddr const* addr):函数初始化了本机的入口ip。

如果没有配置proxy.local.incoming_ip_to_bind,这个函数第二个参数是地址存的值是一个空的sockaddr结构体。函数调用了getifaddrs,这个api可以获取系统所有的网络接口信息,存到一个ifaddrs结构体中,这个机构体是一个链表结构,每一个节点都是一个网络接口,由一个for循环依次分析么一个节点。

如果getifaddrs调用成功了,初始化一个枚举结构体,枚举包括五个变量,分别代表:无效,回环,不可分配地址,广播,全球唯一地址。顺序很重要,越靠后数值越大,优先级越高,越有可能成为incoming ip。有三个变量(spot_type,ip4_type,ip6_type),其中spot_type将被赋值为for循环中当前网络接口的类型,ip4_type和ip6_type分别代表目前出现过的最优的类型。

随后执行了一个for循环,每个循环分析一个ifaddrs结构体节点。首先会将地址和上述枚举对应上,用spot_type记录。如果是无效地址,直接continue,分析下一个节点。如果地址有效,首先判断是ipv4还是ipv6,然后判断spot_type是否大于ipv4或ipv6,如果大于,分别将spot_type赋值给ipv4或ipv6。for循环之后比较ip4_type和ip6_type,选择优先级更高的那个作为目标ip。经过一系列的转换,这个ip被转换为两个版本的字符串,点分十进制和十六进制分别保存。

HttpTransactHeaders::insert_via_header_in_request(HttpTransact::State *s, HTTPHdr *header):函数生成了Via头,并且插到回源的请求头中,ats会将Machine中的ip的十六进制字符串拼到Via头中。

HttpTransact::will_this_request_self_loop(State* s):函数判断Machine中的ip的十六进制字符串是否在Via头中存在,如果存在,判定为发生了loop,返回"400 Multi-Hop Cycle Detected"

时间: 2024-10-25 06:40:52

ATS回环检测的相关文章

ORB-SLAM(六)回环检测

上一篇提到,无论在单目.双目还是RGBD中,追踪得到的位姿都是有误差的.随着路径的不断延伸,前面帧的误差会一直传递到后面去,导致最后一帧的位姿在世界坐标系里的误差有可能非常大.除了利用优化方法在局部和全局调整位姿,也可以利用回环检测(loop closure)来优化位姿. 这件事情就好比一个人走在陌生的城市里,一开始还能分清东南西北,但随着在小街小巷转来转去,已经不知道自己在什么地方了.通过认真辨识周边环境,他可以建立起局部的地图信息(局部优化).再回忆以前走过的路径,他可以纠正一些以前的地图信

(八)ORBSLAM回环检测之位置识别

ORBSLAM2回环检测简介 由于回环检测模块包含两个部分的内容:其一是位置识别,即外观验证,通过图像间的相似度信息进行判断:其二是几何验证,通过回环候选帧与当前关键帧的几何关系来做进一步验证. 由于两部分内容都较为繁琐,因此笔者将回环检测模块拆分成两讲,今天这一讲主要介绍外观验证,下一讲则继续几何验证. 外观验证,或者叫位置识别,实际上是一个图像检索的问题,即输入图像与地图存储的所有关键帧进行相似度比较,找出相似度分数最高的即是最优匹配.由于还有几何验证,因此在外观验证阶段,通常会留下几个相似

(九)ORBSLAM回环检测之几何验证

ORBSLAM2回环检测之几何验证简介 回环检测的目的是找到当前场景在历史中是否出现过,如果出现过,那会给我们提供一个非常强的约束条件,把我们偏离很多的轨迹一下子修正到正确的位置上.当然,这么好的东西,有利自然就有弊.万一我们检测出来的回环不是真正的回环,也就是说我们认错了地方,这种时候提供的回环约束会导致轨迹被错误地“修正”了,结果就是估计的轨迹跟真实的轨迹相差十万八千里,这显然是不可接受的. 因此,回环检测的正确性就显得非常重要.我们会宁愿不要回环约束,也不要一个错误的回环约束.所以ORBS

回环栅栏CyclicBarrier

通过它可以实现让一组线程等待至某个状态之后再全部同时执行.叫做回环是因为当所有等待线程都被释放以后,CyclicBarrier可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. CyclicBarrier类位于java.util.concurrent包下,CyclicBarrier提供2个构造器: ? 1 2 3 4 5 public CyclicBarrier(int parties, Runnable barrierAction)

一维回环数组求解最大子数组问题

一.题目与要求 题目:返回一个整数数组中最大子数组的和. 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n) 二.设计思想 通过上次求解简单一维数组的最大子数组问题的解决,我们找到了一种实现时间复杂为O(n)的方法,采用的是二分法和递归

SharePoint回环检查(Loopback Check)相关问题

Loopback Check(回环检查)本来不是一个SharePoint问题,是Windows Server为了增强自身安全性在Server 2003 SP1后引入的一个功能, 在近几个月中导致了一系列问题的爆发. 一. 主要场景: 1. SharePoint站点使用了主机头(Host Header). 2. 本地访问SharePoint站点. 3. 安装下面的任意一个补丁: 1. IE累计安全补丁 (KB963027) 2. Internet Explorer 8. 3. Windows Se

linux命令练习:mount fdisk swap dd创建本地回环设备

练习一   1.创建一个1G的分区,文件系统为ext4,卷标为MYDATA,块大小为1024,预留管理空间为磁盘 分区的3%,要求开机后制动挂载至/data目录,并且自动挂载的设备要使用卷标进行引用.   fdisk /dev/sda  [[email protected] ~]# fdisk /dev/sda WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode

Linux中的lo回环接口详细介绍

1.linux的网络接口之扫盲 (1)网络接口的命名 这里并不存在一定的命名规范,但网络接口名字的定义一般都是要有意义的.例如: eth0: ethernet的简写,一般用于以太网接口. wifi0:wifi是无线局域网,因此wifi0一般指无线网络接口. ath0: Atheros的简写,一般指Atheros芯片所包含的无线网络接口. lo: local的简写,一般指本地环回接口. (2)网络接口如何工作 网络接口是用来发送和接受数据包的基本设备. 系统中的所有网络接口组成一个链状结构,应用层

thread_CyclicBarrier回环栅栏

CyclicBarrier回环栅栏,字面意思是可循环使用(Cyclic)的屏障(Barrier).通过它可以实现让一组线程等待至某个状态之后再全部同时执行. 它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活. 叫做回环是因为当所有等待线程都被释放以后,可以被重用.我们暂且把这个状态就叫做barrier,当调用await()方法之后,线程就处于barrier了. await()            在所有