为什么apachebench在http1.0会话中通过相同的连接不断重复它的请求?

2024-05-15 09:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我用一种HTTP服务器制作了一个简单的python脚本:

import SocketServer

response  = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n'
response += b'Content-Type: text/plain\r\nContent-Length: 14\r\n\r\n'
response += b'Hello, world!\n'

class MyTCPHandler(SocketServer.StreamRequestHandler):

    def handle(self):
        while True:
            line = self.rfile.readline().strip()
            print "{} {}:{} wrote: {}".format(self.connection, self.client_address[0], self.client_address[1], line)
            if not line:
                self.wfile.write(response)        
                print 'Sent hello world'
                #break

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler)
    server.serve_forever()

现在我启动ab,通过1个连接执行1个请求: ab-n1-c1http://127.0.0.1:9999/

当我在响应后不关闭连接,期望客户机在收到我的响应后关闭其端部的套接字时,会发生一些奇怪的事情。在

Ab始终通过同一个连接重复发送相同的请求:

^{pr2}$

。。。它通过同一个插座在内部重复。在

我尝试从套接字读取原始数据:

import SocketServer

class MyTCPHandler2(SocketServer.BaseRequestHandler):

    def handle(self):
        while True:
            self.data = self.request.recv(1024).strip()
            print "{} wrote:".format(self.client_address[0])
            print self.data

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999

    server = SocketServer.TCPServer((HOST, PORT), MyTCPHandler2)
    server.serve_forever()

Ab甚至都不想等待响应,它在同一个连接中处理大量的请求。在

为什么?是不是我丢失了在HTTP 1.0中重复使用的某种连接?我是否应该始终关闭连接,而不考虑第一对数据之后的\r\n\r\n数据?在

尝试重现相同行为的httperf参数是什么?在


Tags: importselfclienthttphostworldifserver