十.網絡協議學習筆記 HTTP

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版本

報文格式

image.jpeg

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

image.jpeg
image.jpeg

請求方法

? 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可以辦到
只要資源的內容沒有變化,就不會重復傳輸資源數據
只要資源的內容發生了變化,就會返回最新的資源數據給客戶端


20180207100306608.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容