JavaEE 要懂的小事:一、圖解Http協議
作者:李強強
筆者記得上次和左瀟龍【部落格園】聊天時,龍哥問了一個Session的問題。我當時的理解就是雲裡霧裡,通過一番研究之後,逐漸有了思路和自己的理解,讓我們先從HTTP協議理解開始吧。
一、技術基石及概述
問:什麼是HTTP?
答:HTTP是一個客戶端和伺服器端請求和響應的標準TCP。其實建立在TCP之上的。
當我們開啟百度網頁時,是這樣的:https://www.baidu.com,多了個S,其實S表示TLS、SSL。在這裡不做解釋,因此HTTP的技術基石如圖所示:
那HTTP協議呢?HTTP協議(HyperText Transfer Protocol),即超文字傳輸協議是用於伺服器傳輸到客戶端瀏覽器的傳輸協議。Web上,伺服器和客戶端利用HTTP協議進行通訊會話。有OOP思想的得出結論:其會話的結構是一個簡單的請求/響應序列,即瀏覽器發出請求和伺服器做出響應。
二、深入理解技術基石和工作流程
既然HTTP是基於傳輸層的TCP協議,而TCP協議是面向連線的端到端的協議。因此,使用HTTP協議傳輸前,首先建立TCP連線,就是因此在談的TCP連結過程的“三次握手”。如圖
在Web上,HTTP協議使用TCP協議而不是UDP協議的原因在於一個網頁必須傳送很多資料,而且保證其完整性。TCP協議提供傳輸控制,按順序組織資料和錯誤糾正的一系列功能。
一次HTTP操作稱為一個事務,其工作過程可分為四步:
1、客戶端與伺服器需要建立連線。(比如某個超級連結,HTTP就開始了。)
2、建立連線後,傳送請求。
3、伺服器接到請求後,響應其響應資訊。
4、客戶端接收伺服器所返回的資訊通過瀏覽器顯示在使用者的顯示屏上,然後客戶機與伺服器斷開連線。
建立連線,其實建立在TCP連線基礎之上。圖解核心工作過程(即省去連線過程)如下:
三、詳解工作過程的HTTP報文
HTTP報文由從客戶機到伺服器的請求和從伺服器到客戶機的響應構成。
一、請求報文格式如下:
請求行
通用資訊頭
請求頭
實體頭
(空行)
報文主體
如圖,請求我部落格一篇文章時傳送的報文內容:
對於其中請求報文詳解:
1、請求行
方法欄位 + URL + Http協議版本
2、通用資訊頭
Cache-Control頭域:指定請求和響應遵循的快取機制。
keep-alive 是其連線持續有效【在下面百度的例子,會得到驗證】
3、請求頭
Host頭域,腦補吧
Referer頭域:允許客戶端指定請求URL的資源地址。
User-Agent頭域:請求使用者資訊。【可以看出一些客戶端瀏覽器的核心資訊】
4、報文主體
如圖中的 “ p=278 ”一般來說,請求主體少不了請求引數。
二、應答報文格式如下:
狀態行
通用資訊頭
響應頭
實體頭
(空行)
報文主體
如圖,就是這篇部落格響應的內容:
對其中響應報文詳解:
1、狀態行
HTTP協議版本 + 狀態碼 + 狀態程式碼的文字描述
【比如這裡,200 代表請求成功】
2、通用資訊頭
keep-alive 是其連線持續有效【在下面百度的例子,會得到驗證】
Date頭域:時間描述
3、響應頭
Server頭:處理請求的原始伺服器的軟體資訊。
4、實體頭
Content-Type頭:便是接收方實體的介質型別。(這也表示了你的報文主體是什麼。)
(空行)
5、報文主體
這裡就是HTML響應頁面了,在截圖tab頁中的response中可檢視。
一次簡單的請求/響應就完成了。
三、HTTP協議知識補充
請求報文相關:
請求行-請求方法
GET 請求獲取Request-URI所標識的資源
POST 在Request-URI所標識的資源後附加新的資料
HEAD 請求獲取由Request-URI所標識的資源的響應訊息報頭
PUT 請求伺服器儲存一個資源,並用Request-URI作為其標識
DELETE 請求伺服器刪除Request-URI所標識的資源
TRACE 請求伺服器回送收到的請求資訊,主要用於測試或診斷
CONNECT 保留將來使用
OPTIONS 請求查詢伺服器的效能,或者查詢與資源相關的選項和需求
響應報文相關:
響應行-狀態碼
1xx:指示資訊–表示請求已接收,繼續處理
2xx:成功–表示請求已被成功接收、理解、接受
3xx:重定向–要完成請求必須進行更進一步的操作
4xx:客戶端錯誤–請求有語法錯誤或請求無法實現
5xx:伺服器端錯誤–伺服器未能實現合法的請求
常見的狀態碼
200 OK
請求成功(其後是對GET和POST請求的應答文件。)
304 Not Modified
未按預期修改文件。客戶端有緩衝的文件併發出了一個條件性的請求(一般是提供If-Modified-Since頭表示客戶只想比指定日期更新的文件)。伺服器告訴客戶,原來緩衝的文件還可以繼續使用。
404 Not Found
伺服器無法找到被請求的頁面。
500 Internal Server Error
請求未完成。伺服器遇到不可預知的情況。
比如304,在瀏覽器第一次開啟百度時,如圖所示:
重新整理一下:
這上面的304就證明了
1、304狀態碼:有些圖片和js檔案在本地客戶端快取,再次請求後,快取的檔案可以使用。
2、以上所以HTTP請求,只靠一個TCP連線,這就是所謂的持久連線。
四、關於HTTP協議的Web應用框架或者規範
JavaEE的人會知道Servlet規範。其中Web應用容器都實現了HTTP協議中的物件,即請求和響應物件。比如 javax.servlet.http.HttpServletResponse 物件中肯定有對狀態碼描述,如圖
至於如何使用它們,坐等系列文章吧。
五、總結
回顧全文,HTTP協議其實就是我們對話一樣,語言就是其中的協議。所以掌握HTTP協議明白以下幾點就好:
1、用什麼通過HTTP協議通訊
2、怎麼通過HTTP協議通訊
Writer :BYSocket(泥沙磚瓦漿木匠)