Java面試HTTP篇之一:HTTP協(xié)議
一、技術(shù)基石及概述
問:什么是HTTP?
答:HTTP是一個客戶端和服務(wù)器端請求和響應(yīng)的標(biāo)準(zhǔn)TCP。其實建立在TCP之上的。
當(dāng)我們打開百度網(wǎng)頁時,是這樣的:
https://www.baidu.com
多了個S,其實S表示TLS、SSL。在這里不做解釋,因此HTTP的技術(shù)基石如圖所示:
那HTTP協(xié)議呢?HTTP協(xié)議(HyperText Transfer Protocol),即超文本傳輸協(xié)議是用于服務(wù)器傳輸?shù)娇蛻舳藶g覽器的傳輸協(xié)議。Web上,服務(wù)器和客戶端利用HTTP協(xié)議進(jìn)行通信會話。有OOP思想的得出結(jié)論:其會話的結(jié)構(gòu)是一個簡單的請求/響應(yīng)序列,即瀏覽器發(fā)出請求和服務(wù)器做出響應(yīng)。
二、深入理解技術(shù)基石和工作流程
既然HTTP是基于傳輸層的TCP協(xié)議,而TCP協(xié)議是面向連接的端到端的協(xié)議。因此,使用HTTP協(xié)議傳輸前,首先建立TCP連接,就是因此在談的TCP鏈接過程的“三次握手”。如圖
在Web上,HTTP協(xié)議使用TCP協(xié)議而不是UDP協(xié)議的原因在于一個網(wǎng)頁必須傳送很多數(shù)據(jù),而且保證其完整性。TCP協(xié)議提供傳輸控制,按順序組織數(shù)據(jù)和錯誤糾正的一系列功能。
一次HTTP操作稱為一個事務(wù),其工作過程可分為四步:
1、客戶端與服務(wù)器需要建立連接。(比如某個超級鏈接,HTTP就開始了。)
2、建立連接后,發(fā)送請求。
3、服務(wù)器接到請求后,響應(yīng)其響應(yīng)信息。
4、客戶端接收服務(wù)器所返回的信息通過瀏覽器顯示在用戶的顯示屏上,然后客戶機(jī)與服務(wù)器斷開連接。
建立連接,其實建立在TCP連接基礎(chǔ)之上。圖解核心工作過程(即省去連接過程)如下:
三、詳解工作過程的HTTP報文
HTTP報文由從客戶機(jī)到服務(wù)器的請求和從服務(wù)器到客戶機(jī)的響應(yīng)構(gòu)成。
一、請求報文格式如下:
- 請求行
- 通用信息頭
- 請求頭
- 實體頭
- (空行)
- 報文主體
如圖,請求我博客一篇文章時發(fā)送的報文內(nèi)容:
對于其中請求報文詳解:
1、請求行 方法字段 + URL + Http協(xié)議版本
2、通用信息頭 Cache-Control頭域:指定請求和響應(yīng)遵循的緩存機(jī)制。 keep-alive 是其連接持續(xù)有效【在下面百度的例子,會得到驗證】
3、請求頭 Host頭域,腦補吧 Referer頭域:允許客戶端指定請求URL的資源地址。 User-Agent頭域:請求用戶信息?!究梢钥闯鲆恍┛蛻舳藶g覽器的內(nèi)核信息】
4、報文主體 如圖中的 “ p=278 ”一般來說,請求主體少不了請求參數(shù)。
二、應(yīng)答報文格式如下:
狀態(tài)行 通用信息頭 響應(yīng)頭 實體頭 (空行) 報文主體
如圖,就是這篇博客響應(yīng)的內(nèi)容:
對其中響應(yīng)報文詳解:
1、狀態(tài)行 HTTP協(xié)議版本 + 狀態(tài)碼 + 狀態(tài)代碼的文本描述 【比如這里,200 代表請求成功】
2、通用信息頭 keep-alive 是其連接持續(xù)有效【在下面百度的例子,會得到驗證】 Date頭域:時間描述
3、響應(yīng)頭 Server頭:處理請求的原始服務(wù)器的軟件信息。
4、實體頭 Content-Type頭:便是接收方實體的介質(zhì)類型。(這也表示了你的報文主體是什么。)
(空行)
5、報文主體 這里就是HTML響應(yīng)頁面了,在截圖tab頁中的response中可查看。
一次簡單的請求/響應(yīng)就完成了。
三、HTTP協(xié)議知識補充
請求報文相關(guān):
請求行-請求方法
- GET 請求獲取Request-URI所標(biāo)識的資源
- POST 在Request-URI所標(biāo)識的資源后附加新的數(shù)據(jù)
- HEAD 請求獲取由Request-URI所標(biāo)識的資源的響應(yīng)消息報頭
- PUT 請求服務(wù)器存儲一個資源,并用Request-URI作為其標(biāo)識
- DELETE 請求服務(wù)器刪除Request-URI所標(biāo)識的資源
- TRACE 請求服務(wù)器回送收到的請求信息,主要用于測試或診斷
- CONNECT 保留將來使用
- OPTIONS 請求查詢服務(wù)器的性能,或者查詢與資源相關(guān)的選項和需求
響應(yīng)報文相關(guān):
響應(yīng)行-狀態(tài)碼
- 1xx:指示信息--表示請求已接收,繼續(xù)處理
- 2xx:成功--表示請求已被成功接收、理解、接受
- 3xx:重定向--要完成請求必須進(jìn)行更進(jìn)一步的操作
- 4xx:客戶端錯誤--請求有語法錯誤或請求無法實現(xiàn)
- 5xx:服務(wù)器端錯誤--服務(wù)器未能實現(xiàn)合法的請求
常見的狀態(tài)碼
200 OK 請求成功(其后是對GET和POST請求的應(yīng)答文檔。) 304 Not Modified 未按預(yù)期修改文檔。客戶端有緩沖的文檔并發(fā)出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文檔)。服務(wù)器告訴客戶,原來緩沖的文檔還可以繼續(xù)使用。 404 Not Found 服務(wù)器無法找到被請求的頁面。 500 Internal Server Error 請求未完成。服務(wù)器遇到不可預(yù)知的情況。
比如304
1、304狀態(tài)碼:有些圖片和js文件在本地客戶端緩存,再次請求后,緩存的文件可以使用。
2、以上所以HTTP請求,只靠一個TCP連接,這就是所謂的持久連接。
四、關(guān)于HTTP協(xié)議的Web應(yīng)用框架或者規(guī)范
JavaEE的人會知道Servlet規(guī)范。其中Web應(yīng)用容器都實現(xiàn)了HTTP協(xié)議中的對象,即請求和響應(yīng)對象。比如 javax.servlet.http.HttpServletResponse 對象中肯定有對狀態(tài)碼描述,如圖
至于如何使用它們,坐等系列文章吧。
五、總結(jié)
回顧全文,HTTP協(xié)議其實就是我們對話一樣,語言就是其中的協(xié)議。所以掌握HTTP協(xié)議明白以下幾點就好:
1、用什么通過HTTP協(xié)議通信
2、怎么通過HTTP協(xié)議通信
【本文為51CTO專欄作者“李強強”的原創(chuàng)稿件,轉(zhuǎn)載請通過51CTO聯(lián)系作者獲取授權(quán)】