美文网首页Tomcat
Tomcat中的网络通信

Tomcat中的网络通信

作者: loveFXX | 来源:发表于2020-05-06 08:38 被阅读0次

    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源码的理论基础。

    相关文章

      网友评论

        本文标题:Tomcat中的网络通信

        本文链接:https://www.haomeiwen.com/subject/dyvpghtx.html