浏览器访问服务器使用的是 Http协议 , Http协议 是应用层协议,用于定义数据通信的格式,具体的数据传输使用的是 TCP/IP协议 。
Tomcat是一个 Http服务器 (能够接受并且处理 http 请求,所以 Tomcat 是一个 Http服务器 )。
HTTP服务器接收到请求之后把请求交给 Servlet容器 来处理, Servlet容器 通过 Servlet接⼝ 调⽤业务类。
Servlet接⼝和 Servlet容器 这⼀整套内容叫作 Servlet规范 。
Servlet容器有解耦的作用,避免 Http服务器 和 业务类 的直接耦合。
由于 Tomcat 根据 Servlet规范 实现了 Servlet容器 ,同时它又具有 Http服务器 的功能,所以 Tomcat 拥有两个重要身份:
当用户请求某个URL资源时:
Tomcat设计了两个核心组件 连接器(Connector) 和 容器(Container) 来完成 Tomcat 的两大核心功能:
Coyote是 Tomcat连接器组件 的名称,是对外的接口。客户端通过 Coyote 与服务端建立连接、发送请求并接受响应。
Coyote负责的是 具体协议(应用层) 和 IO(传输层) 的相关内容:
Tomcat (Coyote)支持多种应用层协议和I/O模型:
在 8.0 版本之前, Tomcat 默认采用的 I/O模型 是 BIO , 8.0 版本之后,改为 NIO 。
Coyote内部各组件的作用:
组件作用EndPointEndPoint 是 Coyote 的通信端点,即通信监听的接口,是具体 Socket 接收和发送的处理器,是对 传输层的抽象 。因此 EndPoint 用来实现 TCP/IP协议ProcessorProcessor 是 Coyote 的协议处理接口,用来实现 HTTP协议 , Processor 接收来⾃ EndPoint 的 Socket ,读取字节流解析成 Tomcat Request 和 Response对象 ,并通过 Adapter 将其提交到容器处理, Processor 是对应⽤层协议的抽象ProtocolHandlerCoyote 协议接⼝,通过 Endpoint 和 Processor , 实现针对具体协议的处理能⼒。 Tomcat 按照协议和I/O 提供了6个实现类 : AjpNioProtocol , AjpAprProtocol , AjpNio2Protocol , Http11NioProtocol , Http11Nio2Protocol , Http11AprProtocolAdapterCoyoteAdapter 负责将 Tomcat Request 转成 ServletRequest ,再调⽤容器
Tomcat是由一系列可配置(conf/server.xml)的组件构成的 Web容器 ,而 Catalina 是 Tomcat 的 Servlet容器 。
Tomcat本质上就是⼀款 Servlet容器 , 因为 Catalina 才是 Tomcat 的核⼼ , 其他模块都是为 Catalina 提供⽀撑的。 ⽐如 : 通过 Coyote 模块提供链接通信, Jasper 模块提供 JSP引擎 , Naming 提供 JNDI服务 , Juli 提供 ⽇志服务 。
我们往往有⼀个认识, Tomcat 就是⼀个 Catalina 的实例,因为 Catalina 是 Tomcat 的核⼼。
Tomcat/Catalina实例:
其实,可以认为整个 Tomcat 就是⼀个 Catalina实例 , Tomcat 启动的时候会初始化这个实例, Catalina实例 通过加 server.xml 完成其他实例的创建,创建并管理⼀个 Server , Server 创建并管理多个 服务(Service) ,每个 服务(Service) ⼜可以有多个 Connector 和⼀个 Container 。
Container组件下有⼏种具体的组件,分别是 Engine 、 Host 、 Context 和 WrApper 。这4种组件(容器)是⽗⼦关系。 Tomcat 通过⼀种分层的架构,使得 Servlet 容器具有很好的灵活性。