正文開始以前,先推薦兩篇我認爲寫的很好的博客:html
HTTP協議格式詳解 https://www.jianshu.com/p/8fe93a14754cnginx
HTTP協議詳解(真的很經典) https://blog.csdn.net/u013219814/article/details/56290792web
本文絕大部分是摘自《HTTP協議格式詳解》,版權歸原做者全部。服務器
HTTP使用統一資源標識符(URI)來傳輸數據和創建鏈接。URL(統一資源定位符)是一種特殊種類的URI,包含了用於查找的資源的足夠的信息,咱們通常經常使用的就是URL,而一個完整的URL包含下面幾部分:app
http://www.fishbay.cn:80/mix/76.html?name=kelvin&password=123456#first性能
協議部分 該URL的協議部分爲http:,表示網頁用的是HTTP協議,後面的//爲分隔符測試
域名部分 域名是www.fishbay.cn,發送請求時,須要向DNS服務器解析IP。若是爲了優化請求,能夠直接用IP做爲域名部分使用優化
端口部分 域名後面的80表示端口,和域名之間用:分隔,端口不是一個URL的必須的部分。若是端口是80,也能夠省略不寫.net
虛擬目錄部分 從域名的第一個/開始到最後一個/爲止,是虛擬目錄的部分。其中,虛擬目錄也不是URL必須的部分,本例中的虛擬目錄是/mix/代理
文件名部分 從域名最後一個/開始到?爲止,是文件名部分;若是沒有?,則是從域名最後一個/開始到#爲止,是文件名部分;若是沒有?和#,那麼就從域名的最後一個/從開始到結束,都是文件名部分。本例中的文件名是76.html,文件名也不是一個URL的必須部分,若是沒有文件名,則使用默認文件名
錨部分 從#開始到最後,都是錨部分。本部分的錨部分是first,錨也不是一個URL必須的部分
參數部分 從?開始到#爲止之間的部分是參數部分,又稱爲搜索部分、查詢部分。本例中的參數是name=kelvin&password=123456,若是有多個參數,各個參數之間用&做爲分隔符。
HTTP的請求包括四個部分組成:
抓包(可使用 wireshark等)的request結構以下:
GET /mix/76.html?name=kelvin&password=123456 HTTP/1.1 Host: www.fishbay.cn Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
通常狀況下,服務器收到客戶端的請求後,就會有一個HTTP的響應消息,HTTP響應也由4部分組成,分別是:
抓包的數據以下:
HTTP/1.1 200 OK Server: nginx Date: Mon, 20 Feb 2017 09:13:59 GMT Content-Type: text/plain;charset=UTF-8 Vary: Accept-Encoding Cache-Control: no-store Pragrma: no-cache Expires: Thu, 01 Jan 1970 00:00:00 GMT Cache-Control: no-cache Content-Encoding: gzip Transfer-Encoding: chunked Proxy-Connection: Keep-alive {"code":200,"notice":0,"follow":0,"forward":0,"msg":0,"comment":0,"pushMsg":null,"friend":{"snsCount":0,"count":0,"celebrityCount":0},"lastPrivateMsg":null,"event":0,"newProgramCount":0,"createDJRadioCount":0,"newTheme":true}
HTTP協議的狀態碼由3位數字組成,第一個數字定義了響應的類別,共有5中類別:
其中,經常使用的狀態碼以下:
200 OK //客戶端請求成功 400 Bad Request //客戶端請求有語法錯誤,不能被服務器所理解 401 Unauthorized //請求未經受權,這個狀態代碼必須和WWW-Authenticate報頭域一塊兒使用 403 Forbidden //服務器收到請求,可是拒絕提供服務 404 Not Found //請求資源不存在,eg:輸入了錯誤的URL 500 Internal Server Error //服務器發生不可預期的錯誤 503 Server Unavailable //服務器當前不能處理客戶端的請求,一段時間後可能恢復正常
HTTP定義了多種請求方法,來知足各類需求。HTTP/1.0定義了三種請求方法:GET、POST 和 HEAD,到了HTTP/1.1,新增了五種請求方法:OPTIONS、PUT、DELETE、TRACE 和 CONNECT。各個請求方法的具體功能以下:
GET 請求指定的頁面信息,並返回實體主體。 HEAD 相似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭 POST 向指定資源提交數據進行處理請求(例如提交表單或者上傳文件)。數據被包含在請求體中。POST請求可能會致使新的資源的創建和/或已有資源的修改。 PUT 從客戶端向服務器傳送的數據取代指定的文檔的內容。 DELETE 請求服務器刪除指定的頁面。 CONNECT HTTP/1.1協議中預留給可以將鏈接改成管道方式的代理服務器。 OPTIONS 容許客戶端查看服務器的性能。 TRACE 回顯服務器收到的請求,主要用於測試或診斷。