作者回复: 一个标准的HTTP请求是这样的:GET /uri HTTP/1.1\r\nHost: xxx\r\n,这里第一个\r\n就是请求行。
作者回复: 对的!
作者回复: 1、状态机解析请求行是指:比如接收到GET /inde时,就知道接收完方法了,在解析path过程中;接收到GET /index.htm HTTP/1.1\r\nHos时,就知道接收完request line,正在解析Header头部,其中第1个header尚未解析出name。
对http body通常不用使用状态机。
2、任何技术都有两面性,与内核共用会导致进程不能随时修改内存中的内容,否则内核很可能要崩掉。建议你看一下内核态地址空间与用户态地址空间的区别。
作者回复: 1、client_header_buffer_size定义的这段内存,是从连接的内存池中分配出的(即connection_pool_size),如果连接被复用的话,虽然请求内存池会被释放,但连接内存池照旧使用。所以,我们需要先分清连接与请求,并清楚他们的内存池。
2、pool_size只是内存池的初始分配大小,当然实际使用中可以超出此大小。而client_header_buffer_size则具体指明某一用途下的内存大小,这里就是最开始接收HTTP请求的内存大小。
作者回复: :-)
作者回复: 是的
作者回复: 理解正确,因为TCP请求是字节流,需要先接收再用状态机解析。
作者回复: 1、超过1K,就分配8K
2、如果未超过1K,不包含;如果超过了,就直接在请求内存池中分配8K,并把那1K拷贝过来
作者回复: 不对。这两者不同。
1、request_pool_size的含义是:分配请求内存池,且请求内存池的初始分配 大小是4K;
2、而client_header_buffer_size的含义是:分配1K的内存空间,且从连接内存池中分出来。
作者回复: 不要把问题罗列到一起啊,5个问题分5次提问好了。
先回答第1个:
对,描述内存池的结构体所占用的内存,与内存池分配出的内存,隶属于2块内存池中。比如,描述HTTP请求内存池的结构体,其实是从连接内存池中分配出的。
作者回复: 1、不是,单线程一样可做到,只要定期的、且非常及时的去查看是否有触发的读写事件即可。
2、建立好连接后就会有connection_pool,此时究竟收到的消息是HTTP/1还是其他协议的消息并不确定,所以只能从这个内存池中分配。
对。
3、connection连接管理并不只为HTTP协议服务;另外,很可能连接建立起后客户端长期不发送消息,分配过大内存可能浪费。
作者回复: 拒绝服务,发送4xx错误码给客户端,对于概率极小的不正常请求这样做没有问题
作者回复: 根据TCP四元组和sequence信息
作者回复: 当接收到任1个字节时,才会分配这1K内存。建立好连接,到接收到字节,有时间差的。内存池的功能,请参考36课。
浪费和效率是无法兼顾的,通常我们需要从概率角度出发,解决最常出现的场景,例如,我们配置的HTTP大头部,通常默认配置是8K*4,你可以思考下为什么不分配成1K*32
作者回复: 不是,内存池空间是直接调用malloc从进程堆内存中分配的。描述内存池的结构体与实际从内存池中分出的内存是两回事
作者回复: 1、对,不用分配。
2、一定分配。
3、是的。
作者回复: 请求的内存池
作者回复: 所有与请求无关的内存都要在连接内存池里分配.例如第一次接收http请求行,此时既没有Host也没有URL,只能用连接内存池里分配默认1K的内存