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"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章