当请求的内容长度超过实际内容长度时,Http连接会冻结

0 投票
1 回答
1417 浏览
提问于 2025-04-16 14:53

我有一个非常简单的Python脚本,用来进行HTTP连接。

import socket

def main():
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    host = "192.168.56.21"
    s.connect((host, 80))
    msg = """GET /lol /HTTP1.1
Content-Length: 10    

%s""" % ("*" * 9)
    s.send(msg)
    print msg
    print s.recv(1000)

if __name__ == "__main__":
    main()

你可以看到,Content-Length这个头信息的值比实际内容的长度要大。当我运行这个脚本时,它会卡住5分钟,之后我在Apache的日志中看到请求执行了5分钟,并且得到了HTTP 400的响应。

192.168.56.21 - - [01/Apr/2011:15:07:52 +0300] "GET /lol /HTTP1.1" 400 358 "-" "-" 47 531 300011809

我对此没意见,但我不明白的是,为什么Apache会在这5分钟内一直保持连接不关闭。

apache2   3947 www-data   19u  IPv6  17165       TCP 192.168.56.21:www->192.168.56.21:53112 (ESTABLISHED)
python2.6 4636   meuser    3u  IPv4  17164       TCP 192.168.56.21:53112->192.168.56.21:www (ESTABLISHED)

我猜Apache是在等Content-Length中指定的字节数,直到超时发生,然后才返回400错误请求。

我在生产环境的网站上试过,明显是立刻就得到了响应。

有没有人能解释一下在TCP层面上发生了什么,以及我在Apache配置上缺少了什么——我想要避免这种5分钟的等待。

1 个回答

1

好的,这里说的是Apache配置中的超时指令。你可以在这个链接找到更多信息:http://httpd.apache.org/docs/2.2/mod/core.html#timeout

撰写回答