HTTP1.1
Connection:keep-alive(代表长连接)
Connection:close(关闭连接)
1:浏览器请求数据,通过tcp/ip和对应的操作系统进行socket连接
2:socket会把请求数据存到操作系统的一个缓冲区中
3:tomcat第一次从socket中获取数据到InputBuffer(字节数组)中(tomcat缓冲区),BIO对应的是InternalInputBuffer
4:通过InputBuffer(缓冲区)进行解析
5:先解析请求行,把请求方法,请求url,和请求协议封装到Request对象中。,
6:再解析请求头,基于请求头初始化一些参数,Connection是keepalive还是是close.
7:然后在交给容器
8:容器再把请求交给具体的servlet进行处理
一:
浏览器和操作系统建立socket连接,每个请求都会分配一个线程
不同的浏览器,和后台建立的socket连接是有一定的数量限制的
如果用ie浏览器 ie是6个连接
用ie浏览器请求10个请求,
最多建立6个socket连接。每个不同的socket连接会处理多个请求
二:在每个请求头上会设置Connection,keepalive还是是close.
如果是请求头带着keepalive到后台,tomcat解析后,会带着keepalive响应给浏览器,同时标注此socket连接数据长连接,其它请求可以通过此连接请求到tomcat。
如果请求头带着close,tomcat解析后,会带着close响应给浏览器,浏览器接收后,关闭此socket连接, 不让其它请求通过此socket发送到后台
三:
tomcat可以设置处理的每个socket,允许有几个请求,如果设置为1,那么不管浏览器,带着keepalive还是close.tomcat处理后,会把colse响应给浏览器。浏览器关闭socket
四:
请求超时,每个socket 会在缓冲区排队等候处理,若果一个tomcat设置超时时间是20s。socket在缓冲区中呆了6s
那么。从socket中读取数据只有14秒。现在会减去socket在缓冲区排队的时间,如果socket在缓冲区呆了超过20秒,那么会抛出此socket超时异常