Tomcat处理请求过程
2022-10-26 23:10:37 0 举报
Tomcat处理请求过程
作者其他创作
大纲/内容
返回true
processor = createProcessor();
socket.setKeptAlive(true);socket.access();
比如说最大请求头大小1.maxHttpHeaderSize=8kb2.maxSwallowSize=2M3.maxKeepAliveRequests=1004.keepAliveTimeout=soTimeout5.httpParser6.inputBuffer=new InternalInputBuffer7.outputBuffer = new InternalOutputBuffer
Http11Processor对应bio
初始化state为openSocketState state = SocketState.OPEN;
InternalInputBuffer中包括1.buf= new byte[headerBufferSize]请求头的缓冲区域大小,一个请求的请求头数据不能超过这个区域,默认为8192,也就是8*1024个字节=8kb2.parsingHeader = true;解析请求头标识位初始化值
bio:一个socket连接对应一个线程nio:???getExecutor().execute(new SocketProcessor(wrapper));
if (maxKeepAliveRequests == 1) { // 如果最大的活跃http请求数量仅仅只能为1的话,那么设置keepAlive为false,则不会继续从socket中获取Http请求了 keepAlive = false; } else if (maxKeepAliveRequests > 0 && socketWrapper.decrementKeepAlive() <= 0) { // 如果已经达到了keepAlive的最大限制,也设置为false,则不会继续从socket中获取Http请求了 keepAlive = false; }
将socket的InputStream与InternalInputBuffer进行绑定
设置socket超时时间,设置成功就处理socketsetSocketOptions(socket)
JIoendpoint的内部类Acceptor的run方法
返回false
解析请求头getInputBuffer().parseHeaders()
SocketProcessor类中执行run方法
初始化很多参数
第一次从socket中读取数据,并设置socket的读取数据的超时时间对于BIO,一个socket连接建立好后,不一定马上就被Tomcat处理了,其中需要线程池的调度,所以这段等待的时间要算在socket读取数据的时间内而对于NIO而言,没有阻塞setRequestLineReadTimeout();
关闭连接,最大连接数-1
state = AbstractHttp11Processor.process(wrapper);
解析请求行getInputBuffer().parseRequestLine(keptAlive)
此处阻塞直到有请求进来socket = serverSocketFactory.acceptSocket(serverSocket);
state返回open等
processSocket(socket)
Tomcat处理socket请求入口
state返回close
调用fill方法第一次读取的是请求头的数据
0 条评论
回复 删除
下一页