作者回复: 对的!
作者回复: 一个标准的HTTP请求是这样的:GET /uri HTTP/1.1\r\nHost: xxx\r\n,这里第一个\r\n就是请求行。
作者回复: 当http header未经解析时,它是tcp有序字符流,此时需要有一块缓冲区存放它们,再用状态机来取出有意义的header,而这块缓冲区的大小就是client_header_buffer_size,它是从连接内存池中分配的。 当解析出header后,是从请求内存池中分配内存池存放的
作者回复: 是的,你的理解都对^_^
作者回复: 1、状态机解析请求行是指:比如接收到GET /inde时,就知道接收完方法了,在解析path过程中;接收到GET /index.htm HTTP/1.1\r\nHos时,就知道接收完request line,正在解析Header头部,其中第1个header尚未解析出name。 对http body通常不用使用状态机。 2、任何技术都有两面性,与内核共用会导致进程不能随时修改内存中的内容,否则内核很可能要崩掉。建议你看一下内核态地址空间与用户态地址空间的区别。
作者回复: 不要把问题罗列到一起啊,5个问题分5次提问好了。 先回答第1个: 对,描述内存池的结构体所占用的内存,与内存池分配出的内存,隶属于2块内存池中。比如,描述HTTP请求内存池的结构体,其实是从连接内存池中分配出的。
作者回复: 1、不是,单线程一样可做到,只要定期的、且非常及时的去查看是否有触发的读写事件即可。 2、建立好连接后就会有connection_pool,此时究竟收到的消息是HTTP/1还是其他协议的消息并不确定,所以只能从这个内存池中分配。 对。 3、connection连接管理并不只为HTTP协议服务;另外,很可能连接建立起后客户端长期不发送消息,分配过大内存可能浪费。
作者回复: 根据TCP四元组和sequence信息
作者回复: 1、对,不用分配。 2、一定分配。 3、是的。
作者回复: 1、client_header_buffer_size定义的这段内存,是从连接的内存池中分配出的(即connection_pool_size),如果连接被复用的话,虽然请求内存池会被释放,但连接内存池照旧使用。所以,我们需要先分清连接与请求,并清楚他们的内存池。 2、pool_size只是内存池的初始分配大小,当然实际使用中可以超出此大小。而client_header_buffer_size则具体指明某一用途下的内存大小,这里就是最开始接收HTTP请求的内存大小。