【问题标题】:Http connection freezes when request's content-length exceeds real content length当请求的内容长度超过实际内容长度时,Http 连接冻结
【发布时间】:2011-07-27 15:51:21
【问题描述】:

我有一个非常基本的 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 Bad Request。

我在生产站点上进行了尝试,显然我立即得到了响应。

谁能解释一下 TCP 级别发生了什么以及我缺少什么 apache 配置 - 我想摆脱这样 5 分钟的等待。

【问题讨论】:

  • 根据规范,HTTP 请求应该是:GET /lol /HTTP1.1\r\nContent-Length: 10\r\n\r\n*********,即使用\r\n 进行标头字段分隔,使用双\r\n\r\n 进行标头/正文分隔。不确定大小。常识说服务器应该等待第 10 个 octec 到达并超时退出,这就是你正在看的。
  • 是的,粘贴代码时打错了。编辑过的问题。
  • 试过 KeepAliveTimeout,但似乎没有帮助。我需要检查什么 apache 选项?
  • @Stipa:KeepAliveTimeout 应该会影响该行为。这是套接字的读取超时,但我不确定 apache 选项。我认为,这是一种可以预期的行为。以及为什么不能发送正确的Content-length:
  • 我正在尝试消除我系统上的攻击向量。

标签: python apache http sockets tcp


【解决方案1】:

好的,这是 apache conf 中的 Timeout 指令。 http://httpd.apache.org/docs/2.2/mod/core.html#timeout

【讨论】:

    猜你喜欢
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-07-12
    • 2020-09-13
    相关资源
    最近更新 更多