Tomcat的整体架构
Tomcat.png整体架构的层次结构与tomcat的server.xml文件的层级结构相同。
操作系统级别网络通信
网络通信.png当客户端发起tomcat访问时,浏览器便构建了Http请求(包含请求头,请求行,请求体)。然后调用操作系统的构建的Socket(Socket是TCP协议的操作系统实现)进行通信。我们应用层的Socket创建便是调用操作系统(os)的Socket接口。
以window的ServerSocket、Socket类的创建为例。
当创建ServerSocket、Socket对象时,最终会调用到socketCreate方法
java.net.DualStackPlainSocketImpl#socketCreate
socketCreate.png
socketCreate方法调用本地方法socket0
socket0.png
不仅在创建时会调用到native方法的socket0,在实现通信的其他方法如bind0、connect0、accept0、configureBlocking、listen0也都是native方法。
这些实现方法都是JVM级别的实现方法
DualStackPlainSocketImpl.c文件的Java_java_net_DualStackPlainSocketImpl_socket0方法
socket0.png
通过NET_Socket创建fd,调用到jdk/src/windows/native/java/net/net_util_md.c的NET_Socket方法。SOCKET这里实现会调用winsock库函数socket方法。是操作系统级别的方法调用
hotspot/src/share/vm/prims/jvm.cpp
socket.png
在创建SOCKET过程是经过TCP的三次握手。
操作系统级别的Socket接口实现了TCP协议,应用层的实现会调用到操作系统Socket接口。应用层的实现例如JVM实现,java类库的Socket类,浏览器的接口调用(通过浏览器调用遵循Http协议,所以这里是应用层的协议)
应用级别的网络通信
Tomcat服务端是通过endpoint接收数据的,根据不同的协议会有不同的IO实现。Tomcat9是默认通过NIO实现
image.png
这个实现逻辑对应于Tomcat的整体架构的Connector连接容器,endpoint是一个AbstractEndpoint抽象类的实现,在Tomcat7以及之前,有BIO的实现。到Tomcat8之后,Tomcat放弃了BIO的实现类。
Tomcat7默认实现是JIoEndpoint,包含了NioEndpoint和AprEndpoint实现类
Tomcat9默认实现是NioEndpoint,也有Nio2Endpoint和AprEndpoint实现类
在NioEndpoint启动中,创建了Acceptor线程(用来接收连接),Poller线程(用来存放连接后的封装Socket对象)。最终会放到executor线程池中执行Poller线程池的events任务。
在处理Socket传输过来的数据时,会通过Http11Processor解析处理。这里会解析客户端封装后的Http数据。解析数据之后会交给Servlet不同层级的容器,一级级处理,是通过Pipeline管道传递给下级容器
总结:
在服务端怎么接收客户端的连接、解析Http请求数据、在Servlet容器的处理过程便是Tomcat服务端的核心逻辑。也是了解并读懂tomcat源码的理论基础。
网友评论