HTTP
HTTP Hyper Text Transfer Protocol 超文本傳輸協議
HTML Hyper Text Markup Language 超文本標記語言
HTTP
0.9 只支持get請求獲取文本
1.0版本支持head,post請求,支持請求頭,響應頭,支持更多數據類型
請求一次建立一次TCP連接
1.1版本
支持PUT,DELETE請求,多個請求可以共用一個連接
2.0版本
報文格式
ABNF 核心規則
報文格式-整體
HTTP-message = start-line*(header-field CRLF)
CRLF
[message-body]
報文格式-request-line,status-line
request-line = method SP request-target SP HTTP-version CRLF
HTTP-version = HTTP-name "/" DIGIT "." DIGIT
HTTP-name = %x48.54.54.50 ; HTTP
GET /hello/ HTTP/1.1
status-line = HTTP-version SP status-code SP reason-phrase CRLF
status-code = 3DIGIT
reason-phrase = *( HTAB / SP / VCHAR / obs-text )
HTTP/1.1 200
HTTP/1.1 200 OK
URL的編碼
URL中出現了一些特殊字符,需要進行編碼
在瀏覽器中輸入URL,采用UTF-8編碼
Xshell+telnet
安裝一個Xshell,使用telnet
請求方法
? GET:常用于讀取的操作,請求參數直接拼接在URL的后面(瀏覽器對URL是有長度限制的)
? POST:常用于添加、修改、刪除的操作,請求參數可以放到請求體中(沒有大小限制)
? HEAD:請求得到與GET請求相同的響應,但沒有響應體
使用場景舉例:在下載一個大文件前,先獲取其大小,再決定是否要下載。以此可以節約帶寬資源
? OPTIONS:用于獲取目的資源所支持的通信選項,比如服務器支持的請求方法
OPTIONS * HTTP/1.1
? PUT:用于對已存在的資源進行整體覆蓋
? PATCH:用于對資源進行部分修改(資源不存在,會創建新的資源)
? DELETE:用于刪除指定的資源
? TRACE:請求服務器回顯其收到的請求信息,主要用于HTTP請求的測試或診斷
? CONNECT:可以開啟一個客戶端與所請求資源之間的雙向溝通的通道,它可以用來創建隧道(tunnel) ?可以用來訪問采用了 SSL (HTTPS) 協議的站點
頭部字段
?請求頭字段(Request Header Fields) ? 有關要獲取的資源或客戶端本身信息的消息頭
?響應頭字段(Response Header Fields) ? 有關響應的補充信息,比如服務器本身(名稱和版本等)的消息頭
?實體頭字段(Entity Header Fields) ? 有關實體主體的更多信息,比如主體長度(Content-Length)或其MIME類型
?通用頭字段(General Header Fields) ? 同時適用于請求和響應消息,但與消息主體無關的消息頭
請求頭字段
User-Agent 瀏覽器身份標示
Host 服務器域名,端口
Date 發送時間
Referer 前一個頁面
Content-Type 請求體類型
Content-Length 請求體長度
Accept 能接受的響應內容類型
Accept-Charset 能接受的字符集
Accept-Encoding 能接受的編碼方式列表
Accept-Language 能接受的響應內容語言
Range 請求某個實體的一部分
Origin 發起一個針對跨域資源共享的請求
Cookie 服務器發送的
Connection 瀏覽器想要使用的連接類型
Cache-Control 所有緩存機制都必須遵守的指令
響應頭字段
Date
Last-Modified 請求對象最后修改日期
Server 服務器名字
Exoires 指定時間,超過認為響應過期
Content-Type 響應體類型
Content-Length 響應體長度
Content-Encoding 編碼類型
Content-Disposition
Accept-Ranges
Content-Range
Access-Control-Allow-Origin
Location
Set-Cookie
Connection
Cache-Control
緩存( )
通常會緩存的情況是:GET請求 + 靜態資源(比如HTML、CSS、JS、圖片等)
Ctrl + F5:可以強制刷新緩存
緩存 響應頭
Pragma:作用類似于Cache-Control,HTTP/1.0的產物
Expires:緩存的過期時間(GMT格式時間),HTTP/1.0的產物
Cache-Control:設置緩存策略
no-storage:不緩存數據到本地
public:允許用戶、代理服務器緩存數據到本地
private:只允許用戶緩存數據到本地
max-age:緩存的有效時間(多長時間不過期),單位秒
no-cache:每次需要發請求給服務器詢問緩存是否有變化,再來決定如何使用緩存
優先級:Pragma > Cache-Control > Expires
緩存 響應頭
Last-Modified:資源的最后一次修改時間
ETag:資源的唯一標識(根據文件內容計算出來的摘要值)
優先級:ETag > Last-Modified
緩存 請求頭
If-None-Match
如果上一次的響應頭中有ETag,就會將ETag的值作為請求頭的值
如果服務器發現資源的最新摘要值跟If-None-Match不匹配,就會返回新的資源(200 OK)
否則,就不會返回資源的具體數據(304 Not Modified) ? If-Modified-Since
如果上一次的響應頭中沒有ETag,有Last-Modified,就會將Last-Modified的值作為請求頭的值
如果服務器發現資源的最后一次修改時間晚于If-Modified-Since,就會返回新的資源(200 OK)
否則,就不會返回資源的具體數據(304 Not Modified)
緩存
Last-Modified的缺陷
只能精確到秒級別,如果資源在1秒內被修改了,客戶端將無法獲取最新的資源數據
如果某些資源被修改了(最后一次修改時間發生了變化),但是內容并沒有任何變化
會導致相同數據重復傳輸,沒有使用到緩存
ETag可以辦到
只要資源的內容沒有變化,就不會重復傳輸資源數據
只要資源的內容發生了變化,就會返回最新的資源數據給客戶端