HTTP協議
HTTP協議的概念和作用
HTTP(HyperText Transfer Protocol)超文本協議傳輸協議,是互聯網上應用最為廣泛的一種網絡協議,所有WWW文件都必須遵守這個標准,設計HTTP是為了提供一種發布和接收HTML頁面的方法
HTTP是一個客戶端與服務器端請求和應答的標准(TCP),就是客戶端按一定規則向服務器發送數據,而服務器也按一定規則回應數據,客戶端是終端用戶,服務器端是網站,通過使用Web瀏覽器、網絡爬蟲或其他工具,客戶端發起一個到服務器上指定端口(默認端口為80)的HTTP請求
HTTP協議是一種無狀態的,以請求/響應方式運行的協議,它使用可擴展的語義和自描述消息格式,與基於網絡的超文本信息系統靈活的互動
HTTP協議是一種應用層協議
特點:
- 無狀態:不會存儲用戶的信息
- 可擴展的語義:可以在協議的基礎上添加內容,比如頭部的字段
- 自描述:消息類型可以是文本、圖片、音視頻
- 超文本信息系統:HTML
在Web應用中,服務器把網頁傳給瀏覽器,實際就是把網頁的HTML代碼發送給瀏覽器,瀏覽器解析后顯示出來,瀏覽器和服務器之間的傳輸應用層協議就是HTTP
- HTML是一種用來定義網頁的文本
- HTTP是用來在網絡上傳輸HTML文本的協議,用於瀏覽器和服務器的通信
Elements:查看或修改HTML元素的屬性、CSS屬性、監聽事件、斷點等
Console:控制台一般用於執行一次性代碼,查看JavaScript對象,查看調試日志或異常信息
Sources:查看和調試頁面HTML文件源碼、JavsScript源碼、CSS源碼,給JS代碼添加斷點等
Network:查看header等與網絡連接相關的信息
Network中的每一項就是一次請求/響應過程,點擊項可以查看本次請求/響應的報文信息
request - response 模式
瀏覽器 | ← TCP連接 → | 服務器 |
---|---|---|
發送請求 → | ||
← 做出響應 | ||
← 斷開TCP連接 → |
HTTP協議分為兩部分:請求協議、響應協議,接收請求的一端一定要響應對方
不管是請求還是響應,HTTP協議都是由一個一個簡單的協議項組成,報文中每個協議項都單獨占用一行
協議名:協議內容(值)
HTTP報文格式
HTTP協議的請求報文和響應報文的結構基本相同,由三大部分組成:
- 起始行(start line):描述請求或響應的基本信息
- 頭部字段集合(header):使用 key:value 形式更詳細的說明報文
- 空行
- 消息正文(entity):實際傳輸的數據,可以是本文、圖片、音視頻等二進制數據,GET請求方式沒有此部分
請求協議報文格式(request)
請求報文中傳遞參數的方式:URL(GET),request Body(POST)
請求行:分為三個部分
METHOD | 空格 | URL | 空格 | VERSION | 換行 |
---|
- 請求方式:如 GET/POST/HEAD/PUT ,表示對資源的操作
- 請求路徑:通常是一個 URL ,標記了請求方式要操作的資源的路徑
- 協議版本:表示報文使用的 HTTP 協議版本
請求行單獨占一行;請求路徑不包含域名
請求頭:請求頭是所有當前需要用到的協議項的集合
協議項就是瀏覽器在請求服務器的時候事先告訴服務器的一些信息,即事先約定
常見的請求頭有:
host:當前URL中要請求的服務器主機名(域名)
accept-encoding:聲明瀏覽器支持的壓縮編碼類型,如gzip
accept_charset:瀏覽器支持的字符集
referer:表示此次請求來自哪個網址
accept-language:可接收的語言類型,有權重之分
cookie:如果當前請求的服務器在瀏覽器中設置了cookie,當瀏覽器再次請求該服務器時會傳遞此數據
user-agent:用戶代理,當前發起請求的瀏覽器內核信息
accept:瀏覽器可接收的數據類型,如txt/html,image/img
content-length(POST):當前要提交數據的長度(字節)
if-modified-since(GET):請求某個資源文件時,詢問此資源文件是否被修改過
空行:分隔請求頭和請求主體
請求主體:瀏覽器發送給服務端的數據
參數格式:?參數1=值1&參數2=值2&參數3=值3&......
二進制數據,如圖片
GET和POST的區別
-
GET是從服務器上獲取數據,POST是向服務器傳送數據
-
GET把參數加到URL中,POST把數據加到表單中
-
GET傳送的數據量較小,不能大於2KB,POST傳送的數據量大
-
GET安全性較低,POST更安全,但GET執行效率更好
做數據查詢時使用GET方式,做數據添加、修改、刪除或數據包含機密信息時使用POST方式
響應協議報文格式(response)
響應行:分為三個部分
VERSION | 空格 | STATUS CODE | 空格 | REASON | 換行 |
---|
-
協議版本:表示報文使用的 HTTP 協議版本
-
狀態碼:三位數,用代碼表示處理的結果
- 2xx:請求被成功接收;200:請求已成功
- 3xx:重定向,要完成請求需要進一步操作;301:永久重定向,302:臨時重定向
- 4xx:客戶端錯誤;403:收到請求但拒絕提供此服務,404:請求資源不存在,408:請求超時
- 5xx:服務器錯誤;500:服務器發生不可知的錯誤,503:服務器當前不能處理請求,一段時間后可能恢復
-
狀態描述:作為數字狀態碼的補充,是更詳細的解釋文字
響應頭:需要用到的協議項的集合
常見的響應頭有:
server:服務器主機信息
date:響應時間
last-modified:文件最后修改時間
content-length:響應主體的長度(字節)
content-type:響應內容的數據類型,如text/html,image/png
location:重定向,解析到此項時立即跳轉,不會再解析后面的內容
refresh:重定向(刷新),解析到此項時准備跳轉,刷新一般有時間限制,到時間才跳轉
content-encoding:文件編碼格式
cache-control:緩存控制,no-cached:不要緩存
空行:分隔響應頭和響應主體
響應主體:服務器返回給瀏覽器的數據
HTTP頭字段
頭字段 key:value 的形式,最后用CRLF換行表示字段結束。如前后端分離時經常遇到要協商傳輸數據的類型,"Content-type:application/json",HTTP頭字段非常靈活,不僅可以使用標准里的 Host、Content 等已有頭,也可以添加自定義頭
頭字段注意事項:
- 字段名不區分大小寫,字段名里不允許出現空格,可以使用連字符 ‘ - ’ ,不能使用下划線 ‘ _ ’ ,(有的服務器不能解析帶 ‘ _ ’ 的字段),字段名后面必須緊接 ‘ : ’ , ‘ : ’ 后的字段前可以有多個空格
- 字段的順序沒有意義,可以任意排序不會影響語義
- 字段原則上不能重復,除非字段本身語義允許
HTTP請求的完整過程
-
用戶在瀏覽器輸入地址后回車
-
先到本地DNS查找域名對應的IP地址,如果本地DNS中沒有找到,再到DNS服務器查
-
首先從瀏覽器緩存中查看,如下可以查看瀏覽器中域名對應IP的解析
chrome://net-internals/
-
解析域名對應的IP地址后,瀏覽器就可以發起與服務器的三次握手
-
連接建立之后就開始組裝HTTP請求報文,並發送報文
-
服務器收到請求報文之后開始解析報文,生成響應數據,發送響應數據
-
瀏覽器收到響應后,開始渲染頁面