因為Tomcat 本身就是一個“HTTP 服務器 + Servlet容器”悍缠,所以這一節(jié)先對HTTP工作原理進行一下回顧。
HTTP的本質
HTTP協(xié)議是瀏覽器和服務器之間的數據傳輸協(xié)議飞蚓,主要規(guī)定了客戶端和服務器之間的通信格式。
當瀏覽器需要從服務器上獲取信息的時候溅漾,實際上經歷了兩個過程:
- 與服務器簡歷socket鏈接
- 生成請求數據并通過socket鏈接發(fā)送過去
HTTP協(xié)議其實就是在瀏覽器和服務器之間約定好通信格式的著榴。這樣服務器就可以通過約定好的格式來分析出瀏覽器想要獲取數據還是上傳數據。傳過來的數據格式是什么樣的兄渺。
HTTP 工作原理
- 用戶通過瀏覽器發(fā)送一個請求挂谍,瀏覽器獲取了這個事件
- 瀏覽器通過TCP協(xié)議向服務器發(fā)送請求
- 服務器接受請求,通過TCP三次握手建立連接
- 瀏覽器將請求數據打包成HTTP協(xié)議個數的數據包
- 服務器程序拿到數據包口叙,同樣使用HTTP協(xié)議解析數據包,獲得客戶端的意圖
- 服務器執(zhí)行相關代碼俺亮,得到結果
- 服務器將相應數據推入網絡疟呐,數據包通過網絡傳輸最終到達瀏覽器
- 瀏覽器拿到數據包通過HTTP協(xié)議解析包,然后解析數據(展示或者...)
我們主要考慮Tomcat 在這個過程中作為一個HTTP服務器都做了什么事情启具?主要就是接受連接、解析請求數據拷沸、處理請求和發(fā)送響應數據這四個部分薯演。Tomcat 為了提高服務能力和并發(fā)能力,在這幾個步驟中往往都是并行執(zhí)行的跨扮,具體實現方式就是使用了線程池技術。
在服務器接受請求時愉镰,Tomcat 會把HTTP請求數據字節(jié)流解析成一個Request對象钧汹,這個Request對象封裝了HTTP請求的所有信息。Tomcat把這個Request對象傳遞給Web應用去進行業(yè)務處理拔莱,處理完成后得到一個Response對象,Tomcat會把Response對象轉化成HTTP格式的響應數據并發(fā)送給瀏覽器讼渊。