● 规定浏览器和服务器之间的数据传输协议,基于TCP/IP协议传递数据,不涉及数据包的传输,主要规范了客户端与服务器端的通信格式
其中tomcat主要参与接受连接,解析请求数据,处理请求,发送响应结果
● http服务器不直接调用业务类,把请求交给Servlet容器来处理
● 容器通过servlet接口调用业务类,实现http服务器与业务类解耦
● 客户端请求某个资源的时候,http服务器会用一个ServletRequest对象把客户端的请求信息封装起来,调用Servlet容器的service方法
● Servlet容器拿到请求后,根据请求的URL和Servlet的映射关系,找到相应的处理的Servlet
● 如果此时Serlvet容器还没有被加载就会通过反射机制创建这个Servlet,并调用其init方法完成初始化
● 而后调用Servlet的service方法来处理请求
● service处理的结果会被封装到ServletResponse对象中返回给HTTP服务器
● http服务器将响应结果发送给客户端
● 连接器(Connector):负责对外连接。处理Socket连接,负责网络字节流与Request和Response对象的转化
● 容器(Container):负责内部处理。加载和管理Servlet,处理具体Request请求
● tomcat中连接器框架,是tomcat服务器提供客户端访问的外部接口
● 客户端通过Coyote与服务器实现 建立连接、发送请求、接收响应
● Coyote封装了底层网络通信(Socket),为Catalina容器提供统一的接口,使Catalina容器与具体的请求协议和IO操作完全解耦
● Coyote只负责具体协议和IO相关操作,与Servlet规范没有直接关系,Request和Response对象也是在Catalina中对其进一步封装为ServletRequest和ServletResponse
● Coyote将Socket输入的对象封装为Request对象,Servlet相关都交给Catalina处理,由Catalina容器进行请求处理,实现组件之间解耦
● 请求处理完成,Catalina通过Coyote提供的Response将结果写入输出流
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
Processor
ProtocolHandler
Adapter
Catalina结构
组件 | 功能 |
---|---|
Catalina | 负责解析tomcat配置文件,来创建服务器Server组件并对其进行管理 |
Server | 表示整个Catalina Servlet容器及组件,负责组装并启动Servlet引擎,tomcat连接器。通过实现Lifecycle接口,提供一种优雅的启动和关闭整个系统的方式 |
Service | 一个Server包含多个Service组件,它将多个Connector组件绑定到一个Container(Engine)上 |
Connector | 连接器,处理与客户端的通信,负责接收客户端请求,然后转给相关的容器处理,最终向客户端返回响应结果 |
Container | 容器,负责处理用户的servlet请求,返回对象给web用户 |
Container结构
组件 | 功能 |
---|---|
Engine | 表示整个Catalina的Servlet引擎,用来管理多个host虚拟主机,一个Service最多就一个Engine,一个Engine包含多个Host |
Host | 代表一个虚拟主机,可以给tomcat配置多个虚拟主机地址,一个虚拟主机下面可以包含多个Context |
Context | 表示一个web应用程序,可包含多个Wrapper |
Wrapper | 表示一个(一种?)Servlet,容器最底层 |