好好學習,每天向上html
本文已收錄至個人Github倉庫DayDayUP:github.com/RobodLee/DayDayUP,歡迎Star,更多文章請前往:目錄導航git
咱們天天都在網上衝浪🚢,不少人都知道上網的用的最多的就是HTTP協議,可是你知道什麼是HTTP協議嗎?HTTP報文長什麼樣子?這篇文章就讓咱們來好好聊一聊什麼是HTTP協議。github
HTTP協議全稱爲Hyper Text Transfer Protocol(超文本傳輸協議)
,是用於客戶端和服務器之間的通訊的一種協議,它規定了傳輸信息的格式。瞭解計算機網絡的小夥伴都應該知道,TCP/IP網絡模型分爲四層,自上而下分別是:應用層,傳輸層,網絡層以及網絡接口層。而HTTP協議就是處於最上面的應用層協議。何時咱們會用到HTTP協議的呢,當咱們在瀏覽器中輸入一個地址時,或者點擊頁面上的某個連接的時候,HTTP協議就開始工做了。它會幫你添加請求方法,協議類型、版本,首部字段等一系列信息構成一個完整的請求報文發送給服務器,服務器一樣也會返回一個遵循HTTP協議規則的響應報文給你,而後瀏覽器對響應報文進行解析,給你呈現出一個精美的界面。雖然你只是作了一個很簡單的操做,可是HTTP協議在背後幫助你作了不少工做,從而保障了你與服務器之間可以順利地通訊。web
HTTP協議的一個特色就是它是無狀態協議。無狀態的意思就是不保存狀態,就是HTTP自身不對請求和響應之間的通訊狀態進行保存。當客戶端向服務器發送一次請求以後,再次請求的時候服務器已經不記得上次客戶端請求了什麼。json
可是有的時候要須要保存狀態,好比逛淘寶的時候。那麼HTTP怎麼實現保持狀態功能呢,這就用到了Cookie技術,客戶端和服務端經過在HTTP報文中添加一個Cookie字段來獲取以前的狀態信息。就像下圖所示:瀏覽器
什麼是HTTP狀態碼呢?當咱們訪問服務器時,服務器返回給咱們的信息中會有一個數字,叫作狀態碼,狀態碼是用來描述服務器返回給瀏覽器的請求結果。通常分爲5類:緩存
分類 | 描述 |
---|---|
1XX | 接收的請求正在處理 |
2XX | 請求正常處理完畢 |
3XX | 須要進行附加操做以完成請求 |
4XX | 服務器沒法處理請求 |
5XX | 服務器處理請求出錯 |
細分的話就不少了,我畫了幾張思惟導圖,這樣看起來比較清晰:安全
若是想要思惟導圖原件的話,能夠點擊下載服務器
我已經列舉了一大堆了,其實還不止這些,可是咱們日常用的其實很少,我在這裏列舉了這麼可能是但願你對HTTP狀態碼有個更全面的認識。其實經常使用的也就十幾個:微信
狀態碼 | 描述 |
---|---|
200 OK | 表示從客戶端發來的請求在服務器端被正常處理了 |
204 No Content | 正常處理,但響應報文中沒有主體部分 |
206 Partial Content | 客戶端進行了範圍請求,服務器只返回請求範圍中的內容 |
301 Moved Permanently | 永久性重定向,表示請求的資源已被分配了新的URL |
302 Found | 臨時性重定向,表示請求的資源臨時分配了新的URL,規定了禁止從POST變爲GET |
303 See Other | 功能和302相同,可是應使用GET請求 |
304 Not Modified | 服務端資源未改變,可直接使用客戶端未過時的緩存 |
307 Temporary Redirect | 和302相似,但不會從POST變爲GET |
400 Bad Request | 錯誤的請求,請求報文中存在語法錯誤 |
401 Unauthorized | 表示發送的請求須要有經過HTTP認證的認證信息 |
403 Forbidden | 服務器拒絕了瀏覽器的請求 |
404 Not Found | 不用我說了吧,你們都應該感覺過了 |
500 Internal Server Error | 服務器在執行請求時發生了錯誤 |
503 Service Unavailable | 服務器正忙着呢,沒空搭理你 |
當咱們向服務器發送請求報文的時候,會在請求行中添加一個方法,好比GET,POST等,服務器經過這個方法就能夠知道咱們的意圖,從而作出正確的判斷,返回正確的數據。由於每一種方法都對應着不一樣的意圖。
一般咱們使用到的大概是如下幾種:
序號 | 方法 | 說明 |
---|---|---|
1 | GET | 請求指定的頁面信息,並返回實體主體 |
2 | POST | 向指定資源提交數據進行處理請求,數據被包含在請求體中。好比登陸,註冊 |
3 | PUT | 更改服務器中的數據 |
4 | HEAD | 得到報文首部 |
5 | DELETE | 刪除指定的數據 |
6 | OPTIONS | 獲取服務器支持的HTTP請求方法 |
7 | TRACE | 追蹤路徑 |
8 | CONNECT | 要求用隧道協議鏈接代理 |
說完了以上幾個概念就能夠介紹HTTP報文了,HTTP報文是客戶端與服務器之間進行交互的信息,不管是你向服務器發送了一個請求仍是服務器返回給你一條數據,都是經過報文的形式發送的,請求用的是請求報文,響應用的是響應報文。咱們先來看一個例子直觀的感覺一下,好比咱們來訪問百度的主頁:
能夠看到,不管是請求報文仍是響應報文,都含有報文首部,報文主體等信息。固然,這裏的請求報文沒有主體,由於是GET請求。
上面這張圖就是完整的報文格式了,咱們來分析一下。
請求行包含了請求的方法,請求URI和HTTP版本,例如 GET /index.html HTTP/1.1
,請求URI不必定會有,好比上面的百度主頁就沒有,可是你用百度搜索內容就會有,我在這裏就不截圖了。
狀態行包含了HTTP版本,狀態碼和緣由短語,好比 HTTP/1.1 200 OK
。
空行就是一個空行,什麼也沒有,只是用於隔開首部和主體的。
報文主體沒什麼好說的,就是服務器給你的,或者你給服務器的真實數據,像什麼html或者json之類的。
這裏重點要說的就是首部字段,首部字段起到了傳遞額外重要信息的做用。是由首部字段名和字段值構成的,中間用冒號隔開,就像這樣:
Connection:keep-alive
根據實際用途分爲了4種類型:
通用首部字段 請求報文和響應報文都會使用的首部。
請求首部字段
從客戶端向服務器發送請求報文時使用的首部。
響應首部字段
從服務器端向客戶端返回響應報文時使用的首部。
實體首部字段
針對請求報文和響應報文的實體部分使用的首部。
關於HTTP首部的內容很是多,我就不細講了,上面的4張圖我是從《圖解HTTP》上面找的,感興趣的朋友能夠看看這本書,比我講的要詳細多了,內容也更全面。
文章寫到這裏就基本上把HTTP協議講完了。和HTTP相關的還有HTTPS,它是經過添加一層SSL(Secure Sockets Layer 安全套接字協議),使得HTTP可以安全地傳輸,由於HTTP是明文傳輸,不安全,這裏就不展開講了(由於我也沒太搞明白HTTPS,哈哈😄)。文中可能有講的不恰當的地方,歡迎留言交流。