squid TCP_HIT/504/000是怎么产生的

来源:互联网 发布:高桥和希 知乎 编辑:程序博客网 时间:2024/06/10 07:41


今天调查一下问题,发现某个请求的访问有很多TCP_HIT/504, 504的意思我们都很清楚,是连接超时,但TCP_HIT/504 是什么意思呢?相信这让很多人都很迷惑,仔细调查才发现,原来是这样的:

以 url http://www.sina.com.cn 为例,第一个请求一定是TCP_MISS的,然后这个请求就回源与www.sina.com.cn域名对应的ip 想连接,这个请求连接建立之前有另外的请求 http://www.sina.com.cn过来,

首先第一个请求在创建时就已经为 http://www.sina.com.cn/ 这个url 创建了相应的storeEntry, 当第二个请求来时,在storeEntry的hash表中就能够找到这个storeEtnry 了,这时候自然就会是TCP_HIT, 但因为第一个请求还未与源站建立连接,所以第二个请求也同样要与源站建联,从而能在access日志中看到回源的记录。

    而直到第一个请求超时,在这段时间内所有的请求都会是TCP_HIT/504,第一个请求超时后,就会是第二个TCP_MISS/504啦,如此往复、循环。


  借上一篇博文《squid TCP_HIT/504...》来说一下TCP_HIT/000,其实道理和TCP_HIT/504差别多。首先说一下000是什么意思,就是squid 还没有给客户端的响应码赋值,客户端那边的请求就断啦,这样squid自然要将客户端的这个请求给释放,释放的时候就吐出来了"000" 这种日志。

     模拟一下,仍然请求http://www.sina.com.cn/ ,当第一次访问时仍然假设请求时MISS的,而且是MISS 504,也就是客户端 要的东西,squid 中不存在,squid 要从源站取拿,而squid 与server端建联又超时的这种情况,当第二个请求过来的时候,不难理解这次是HIT的(如果不能理解,请看TCP_HIT/504那篇博文),而这时,客户端受不了这种连接超时,于是还没等squid断开连接,client端自己吧连接给断开了,这样squid 也同样还没来得及给client端得响应码赋值(真正要来得及赋值得是server端返回了一个响应吗,例如504,squid将这个504赋值给客户端得响应吗),于是就产生了TCP_HIT/000。

    其他产生TCP_HIT/000的情况也都类似,但最根本原因就是squid 还没来得及给客户端响应吗赋值,客户端就断开了连接。