Writer :BYSocket(泥沙磚瓦漿木匠) java
微 博:BYSocket 瀏覽器
豆 瓣:BYSocket 緩存
FaceBook:BYSocket 服務器
Twitter :BYSocket 併發
泥瓦匠記得和左瀟龍【博客園】上次聊天時,龍哥問了個Session的問題。我當時的理解就是雲裏霧裏,先從Http協議理解開始吧。 框架
問:什麼是HTTP?
答:HTTP是一個客戶端和服務器端請求和響應的標準TCP。其實創建在TCP之上的。 socket
當咱們打開百度網頁時,是這樣的: 性能
https://www.baidu.com 測試
多了個S,其實S表示TLS、SSL。在這裏不作解釋,所以HTTP的技術基石如圖所示: spa
那HTTP協議呢?HTTP協議(HyperText Transfer Protocol),即超文本傳輸協議是用於服務器傳輸到客戶端瀏覽器的傳輸協議。Web上,服務器和客戶端利用HTTP協議進行通訊會話。有OOP思想的得出結論:其會話的結構是一個簡單的請求/響應序列,即瀏覽器發出請求和服務器作出響應。
既然HTTP是基於傳輸層的TCP協議,而TCP協議是面向鏈接的端到端的協議。所以,使用HTTP協議傳輸前,首先創建TCP鏈接,就是所以在談的TCP連接過程的「三次握手」。如圖
在Web上,HTTP協議使用TCP協議而不是UDP協議的緣由在於一個網頁必須傳送不少數據,並且保證其完整性。TCP協議提供傳輸控制,按順序組織數據和錯誤糾正的一系列功能。
一次HTTP操做稱爲一個事務,其工做過程可分爲四步:
一、客戶端與服務器須要創建鏈接。(好比某個超級連接,HTTP就開始了。)
二、創建鏈接後,發送請求。
三、服務器接到請求後,響應其響應信息。
四、客戶端接收服務器所返回的信息經過瀏覽器顯示在用戶的顯示屏上,而後客戶機與服務器斷開鏈接。
創建鏈接,其實創建在TCP鏈接基礎之上。圖解核心工做過程(即省去鏈接過程)以下:
HTTP報文由從客戶機到服務器的請求和從服務器到客戶機的響應構成。
1、請求報文格式以下:
請求行
通用信息頭
請求頭
實體頭
(空行)
報文主體
如圖,請求我博客一篇文章時發送的報文內容:
對於其中請求報文詳解:
一、請求行
方法字段 + URL + Http協議版本
二、通用信息頭
Cache-Control頭域:指定請求和響應遵循的緩存機制。
keep-alive 是其鏈接持續有效【在下面百度的例子,會獲得驗證】
三、請求頭
Host頭域,腦補吧
Referer頭域:容許客戶端指定請求URL的資源地址。
User-Agent頭域:請求用戶信息。【能夠看出一些客戶端瀏覽器的內核信息】
四、報文主體
如圖中的 「 p=278 」通常來講,請求主體少不了請求參數。
2、應答報文格式以下:
狀態行
通用信息頭
響應頭
實體頭
(空行)
報文主體
如圖,就是這篇博客響應的內容:
對其中響應報文詳解:
一、狀態行
HTTP協議版本 + 狀態碼 + 狀態代碼的文本描述
【好比這裏,200 表明請求成功】
二、通用信息頭
keep-alive 是其鏈接持續有效【在下面百度的例子,會獲得驗證】
Date頭域:時間描述
三、響應頭
Server頭:處理請求的原始服務器的軟件信息。
四、實體頭
Content-Type頭:即是接收方實體的介質類型。(這也表示了你的報文主體是什麼。)
(空行)
五、報文主體
這裏就是HTML響應頁面了,在截圖tab頁中的response中可查看。
一次簡單的請求/響應就完成了。
請求報文相關:
請求行-請求方法
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就證實了
一、304狀態碼:有些圖片和js文件在本地客戶端緩存,再次請求後,緩存的文件可使用。
二、以上因此HTTP請求,只靠一個TCP鏈接,這就是所謂的持久鏈接。
JavaEE的人會知道Servlet規範。其中Web應用容器都實現了HTTP協議中的對象,即請求和響應對象。好比 javax.servlet.http.HttpServletResponse 對象中確定有對狀態碼描述,如圖
至於如何使用它們,坐等系列文章吧。
回顧全文,HTTP協議其實就是咱們對話同樣,語言就是其中的協議。因此掌握HTTP協議明白如下幾點就好:
一、用什麼經過HTTP協議通訊
二、怎麼經過HTTP協議通訊
Writer :BYSocket(泥沙磚瓦漿木匠)
微 博:BYSocket
豆 瓣:BYSocket
FaceBook:BYSocket
Twitter :BYSocket