Tomcat原理系列之六:詳解socket如何封裝成request(上)


@

看源碼雖然不能馬上提升你的編碼水平。但能讓你更好的理解編程。

因為我們tomcat多是以NIO形式處理請求,所以本系列講的都是NIO類型請求的處理相關組件。

在講解過程之前,把相關概念理解是非常關鍵的

參與者

tomcat中Connector是負責處理請求的。

協議處理ProtocolHandler

Connector使用ProtocolHandler處理器來處理請求。不同的ProtocolHandler代表不同連接類型。

ProtocolHandler處理器可以用看作是協議處理統籌者,通過管理其他工作組件實現對請求的處理。ProtocolHandler 包含了三個非常重要的組件:

  • Endpoint: 負責接受,處理socket網絡連接

  • Processor: 負責將從Endpoint接受的socket連接根據協議類型封裝成request

  • Adapter:負責將封裝好的Request交給Container進行處理。

Socket的封裝

  • NioChannel: SocketChannel的基礎包裝類,在EndPonit中使用。

  • SocketWrapper:socket的包裝類,用於攜帶(NioChannel)socket進行傳遞。

區別:NioChannel是基本包裝,SocketWrapper是對NioChannel的進一步包裝.

多種buffer

  • 套接字輸入流InputStream:屬於jdk中的io包。充當操作系統從底層讀取socket字節的通道
  • SokcetBuffer即ByteBuffer。位於java.nio包下,NIO層面的buffer。Tomcat在創建此類Buffer時默認的大小時8*1024,也就是8K
  • InputBuffer接口(內部緩沖區):coyote包下, 用於Tomcat內部的Request緩沖區。套接字輸入緩沖裝置,即提供一種緩沖的模式從socket中讀取字節流。通過查看源碼我感覺他也是一個工具接口,更加偏向於一個工具.列如:實現類Http11InputBuffer,具有提供解析請求頭與轉義功能.
  • InputBuffer類:connector包下。用於Servlet規范的Request內部的緩沖區
  • MessageBytes消息字節:tomcat在接受socket傳入的字節之后並不會馬上進行編碼轉換,而是保持byte[]數組,在用到的地方再進行轉換。MessageBytes正是byte[]的抽象
  • 子節塊操作工具ByteChunk: 首先他是一個工具,一個操作緩沖的工具。其次有兩個內部接口:ByteInputChannel和ByteOutputChannel讀寫數據。還有一個Chartset對象方便編碼。所以他是一個提供了編碼功能,操作緩存的工具。

兩對request,response

tomcat中存在兩組request,respone

  • org.apache.coyote包下的:
    屬於Tomcat內部對請求的一個定義,final類型的類不對開發者開放。主要功能就是封裝socket解析http協議的header內容。
  • org.apache.catalina.connector包下的:
    屬於對servlet規范的實現。也是我們開發常見的request對象。

所以tomcat中會有一個涉及request與request的轉換過程,這些過程都放到后續講,此篇只講解組件概念。

Tomcat內部使用Apache Coyote庫來處理網絡I/O的。Connector包多是用於Serlvet規范。

多種處理器

tomcat內部很多都命名為處理器。這里講講提幾個講講區別:

  • ProtocolHandler處理器:統籌或者管理級別的處理器。Connector把請求處理的工作交給ProtocolHandler去處理。剩下的是ProtocolHandler統籌。由此看出他是一個管理界別的處理器

  • ConnectionHandler:連接處理器,.內部維護Processor的map用於重用SocketProcessor. 把創建Processor的工作交給ProtocolHandler去做.

    SocketProcessor處理器調用ConnectionHandler.process()將socket請求內容傳入Processor.process()進行處理.

    由此可見ConnectionHandler具有承上啟下的作用.

  • SocketBufferHandler:socketBuffer處理器。包含兩個SocketBuffer,用於socket讀寫的緩沖。

  • SocketProcessor: socket處理器,針對socket的處理器。本身是一個worker,將socket內容交給Processor處理

  • (Processor)Http11Processor: HTTP協議1.1是目前使用最多的一個HTTP協議版本。從此處理器的名字我們也可以看出,他就是針對此協議的處理。此處理器是將socket轉為請求的主要組件,他從socket將HTTP協議的內容解析出來,不過在tomcat中他只負責了對http請求行,請求頭的解析;請求體的解析延遲到了servlet中去解析了。 Http11Processor 由ConnectionHandler 創建,tomcat 對關鍵的類都實現了重用,以減少頻繁創建和銷毀的開銷,會從recycledProcessors 里pop出來

總結

掌握了這些相關組件的概念后。下章講解socket如何變成request。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM