1. 程式人生 > 程式設計 >Tomcat原理系列之六:詳解socket如何封裝成request(上)

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

@TOC

看原始碼雖然不能馬上提升你的編碼水平。但能讓你更好的理解程式設計。

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

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

參與者

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

1.協議處理ProtocolHandler

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

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

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

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

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

2.Socket的封裝

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

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

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

3.多種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物件方便編碼。所以他是一個提供了編碼功能,操作快取的工具。

4.兩對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包多是用於Servlet規範。

5.多種處理器

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。