HTTP工作原理
● 规定浏览器和服务器之间的数据传输协议,基于TCP/IP协议传递数据,不涉及数据包的传输,主要规范了客户端与服务器端的通信格式
一个请求流程
其中tomcat主要参与接受连接,解析请求数据,处理请求,发送响应结果
- 用户通过浏览器进行操作,点击链接等,浏览器获取到这个事件
- 浏览器向服务器发出TCP链接请求
- 服务程序接收浏览器的请求,通过TCP三次握手建立连接(linux底层握手)
- 连接成功后,浏览器将请求数据打包成一个HTTP协议格式的数据包
- 浏览器将该数据包推入网络中,数据包经过网络传输,最终达到服务端程序
- 服务端程序拿到这个数据包,同样用HTTP协议格式解析,获取到客户端的操作意图(tomcat连接器,封装Request对象)
- 根据客户端的操作意图进行处理,提供数据
- 服务器将处理响应结果用HTTP再次打包
- 服务器将该数据包推入网络中,数据包经过网络传输,最终达到客户端浏览器
- 浏览器拿到数据包后,以http协议的格式解析,比如得到html
- 浏览器将html展示给用户
Tomcat整体架构
Http服务器请求处理
● http服务器不直接调用业务类,把请求交给Servlet容器来处理 ● 容器通过servlet接口调用业务类,实现http服务器与业务类解耦
servlet容器工作过程
● 客户端请求某个资源的时候,http服务器会用一个ServletRequest对象把客户端的请求信息封装起来,调用Servlet容器的service方法 ● Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的处理的Servlet ● 如果此时Serlvet容器还没有被加载就会通过反射机制创建这个Servlet,并调用其init方法完成初始化 ● 而后调用Servlet的service方法来处理请求 ● service处理的结果会被封装到ServletResponse对象中返回给HTTP服务器 ● http服务器将响应结果发送给客户端
tomcat两个核心
● 连接器(Connector):负责对外连接。处理Socket连接,负责网络字节流与Request和Response对象的转化 ● 容器(Container):负责内部处理。加载和管理Servlet,处理具体Request请求
连接器Connector
Coyote
● tomcat中连接器框架,是tomcat服务器提供客户端访问的外部接口 ● 客户端通过Coyote与服务器实现 建立连接、发送请求、接收响应
Coyote与Catalina容器的交互
● Coyote封装了底层网络通信(Socket),为Catalina容器提供统一的接口,使Catalina容器与具体的请求协议和IO操作完全解耦 ● Coyote只负责具体协议和IO相关操作,与Servlet规范没有直接关系,Request和Response对象也是在Catalina中对其进一步封装为ServletRequest和ServletResponse ● Coyote将Socket输入的对象封装为Request对象,Servlet相关都交给Catalina处理,由Catalina容器进行请求处理,实现组件之间解耦 ● 请求处理完成,Catalina通过Coyote提供的Response将结果写入输出流
支持的IO模型与协议
IO模型
IO模型 | 描述 |
---|
BIO | 阻塞IO,tomcat8.5之后移除了对的该IO模型的支持 | NIO | 非阻塞IO,javaNIO类库实现 | NIO2 | 异步IO,NIO2类库实现 | APR | 使用Apache可移植运行库实现,需要单独安装APR库 |
应用层协议
应用层协议 | 描述 |
---|
HTTP/1.1 | 大部分web协议采用 | HTTP/2.0 | tomcat8.5之后版本支持,大幅度提醒web性能 | AJP | 用于与web服务器集成,实现对静态资源的优化及集群部署 |
连接器组件
组件 | 作用 |
---|
EndPoint | Endpoint是Coyote通信端点,即通信监听的接口,是具体socket接收和发送处理器,是对传输层的抽象; Endpoint用来实现TCP/IP协议 | Processor | Processor是Coyote协议处理接口,用来实现Http协议;Processor接收来自EndPoint的Socket,读取字节流解析成的Tomcat Request和Response对象,并通过Adapter适配交给容器处理;Processor是对应应用层协议的抽象 | ProtocolHandler | 是Coyote协议接口,通过Endpoint和Processor实现针对具体协议的处理能力;Tomcat按照协议和IO提供6个实现类: AjpNioProtocol, AjpAprProtocol, Http11NioProtocol, Http11Nio2Protocol, Http11AprProtocol | Adapter | 由于协议不同,客户端发过来的请求信息不尽相同;tomcat定义了自己的Request类来封装这些请求信息;ProtocolHandler接口负责解析请求并生成Tomcat Request类,通过CoyoteAdapter适配为selvert容器可以解析的ServletRequest,执行对应的service方法 |
EndPoint
- 对传输对象层的抽象,用来实现TCP/IP协议
- Coyote通信端口,通信监听的接口,具体Socket的接收和发送处理器
- tomcat提供了抽象类AbstractEndPoint,定义了Acceptor和SocketProcessor
- Acceptor:用于监听Socket请求
- SocketProcessor:用于处理接收到的Socket请求,最终实现Runnable,在run/doRun方法里调用协议处理组件Processor进行处理,为提高性能,SocketProcessor被提交给Executor执行器线程池来管理
Processor
- 对应用层协议的抽象,EndPoint实现了TCP/IP协议,Processor实现了HTTP协议
- Coyote协议处理接口,接收EndPoint的Socket
- 读取字节流解析成Tomcat的Request和Response对象,并通过Adapter将其提交给容器处理
ProtocolHandler
- Coyote协议接口,同EndPoint和Processor实现针对具体协议的处理能力
Adapter
- 使用CoyoteAdapter类,适配Request/ServletRequest和Response/ServletRespose的适配器
- 由于协议不同,tomcat为了兼容,定义了Request类来接收请求信息
- ProtocolHandler负责解析请求生成Tomcat的Request对象
- CoyoteAdapter负责将tomcat的Request适配成Servlet可以解析的ServletRequest标准对象
- 从而调用Servlet的service方法,实现请求、响应能力
容器Container
Catalina
- tomcat本质是一个Servlet容器,容器的实现由Catalina,涉及到安全、会话、集群、管理等Servlet容器各个方面
- 通过松耦合方式集成Coyote,完成按照请求协议进行数据读写等
Catalina结构
- Catalina负责管理Server,Server表示整个服务器。
- Server下面有多个服务Service,每个Service包含多个多个连接器组件Connector(Coyote实现)和一个容器组件Container。
- tomcat启动的时候初始化一个Catalina实例
组件 | 功能 |
---|
Catalina | 负责解析tomcat配置文件,来创建服务器Server组件并对其进行管理 | Server | 表示整个Catalina Servlet容器及组件,负责组装并启动Servlet引擎,tomcat连接器。通过实现Lifecycle接口,提供一种优雅的启动和关闭整个系统的方式 | Service | 一个Server包含多个Service组件,它将多个Connector组件绑定到一个Container(Engine)上 | Connector | 连接器,处理与客户端的通信,负责接收客户端请求,然后转给相关的容器处理,最终向客户端返回响应结果 | Container | 容器,负责处理用户的servlet请求,返回对象给web用户 |
Container
Container结构
组件 | 功能 |
---|
Engine | 表示整个Catalina的Servlet引擎,用来管理多个host虚拟主机,一个Service最多就一个Engine,一个Engine包含多个Host | Host | 代表一个虚拟主机,可以给tomcat配置多个虚拟主机地址,一个虚拟主机下面可以包含多个Context | Context | 表示一个web应用程序,可包含多个Wrapper | Wrapper | 表示一个(一种?)Servlet,容器最底层 |
|