「第四届青训营 」笔记创作活动的第30天 用户通过浏览器进行了一个操作,比如输入网址并回车,或者是点击链接,接着浏览器获取了这个事件。 浏览器向服务端发出TCP连接请求。 服务程序接受浏览器的连接请求并经过TCP三次握手建立连接。 浏览器将请求数据打包成一个HTTP协议格式的数据包。 浏览器将该数据包推入网络,数据包经过网络传输,最终达到端服务程序。 服务端程序拿到这个数据包后,同样以HTTP协议格式解包,获取到客户端的意图。 得知客户端意图后进行处理,比如提供静态文件或者调用服务端程序获得动态结果。 服务器将响应结果(可能是HTML或者图片等)按照HTTP协议格式打包。 服务器将响应数据包推入网络,数据包经过网络传输最终达到到浏览器。 浏览器拿到数据包后,以HTTP协议的格式解包,然后解析数据,假设这里的数据是 HTML。 浏览器将HTML文件展示在页面上。 那我们想要探究的Tomcat作为一个HTTP服务器,在这个过程中都做了些什么事情呢?
主要是接受连接、解析请求数据、处理请求和发送响应这几个步骤。
6.2、Tomcat整体架构 Tomcat要实现两个核心功能:
处理Socket连接,负责网络字节流与Request和Response对象的转化。 加载和管理Servlet,以及具体处理Request请求。 因此Tomcat设计了两个核心组件连接器(Connector)和容器(Container)来分别做这 两件事情。连接器负责对外交流,容器负责内部处理。
6.3、Coyote连接器架构 Coyote是Tomcat的连接器框架的名称 , 是Tomcat服务器提供的供客户端访问的外部接口。客户端通过Coyote与服务器建立连接、发送请求并接受响应 。
Coyote封装了底层的网络通信(Socket请求及响应处理),为Catalina容器提供了统一的接口,使Catalina容器与具体的请求协议及IO操作方式完全解耦。Coyote 将Socket输入转换封装为Request对象,交由Catalina容器进行处理,处理请求完成后,Catalina通过Coyote提供的Response对象将结果写入输出流 。
Coyote作为独立的模块,只负责具体协议和IO的相关操作,与Servlet规范实现没有直接关系,因此即便是Request和Response对象也并未实现Servlet规范对应的接口, 而是在Catalina中将他们进一步封装为ServletRequest和ServletResponse。