因爲以前太忙了,老是沒有時間把本地寫好的文章梳理整理後發出去。近期有時間了,才慢慢的整理後發出來(本地寫的大多數時候是爲了本身能看,哈哈哈)。html
文章首發於 HTTP 入門體檢。ios
不管是大系統仍是小項目,不管是移動端仍是PC端,不管是大數據仍是雲計算,從總體到我的,網絡協議一直都是繞不過去的坎,它在咱們職業生涯中有着舉足輕重的地位。技術浪潮一浪接一浪,不少時候咱們盲目追求新技術卻忘記了新技術的出現都是要依賴於繁瑣複雜且難啃的基層技術,新技術只是爲了更好更快更穩的開發,針對業務需求相對進行了封裝罷了,一層一層剝下來,它仍是原來的它。咱們先來入門一下 HTTP,OSI模型的應用層。git
網絡有七層協議層:應用層、表示層、會話層、(安全層 - SSL/TLS)、傳輸層、網絡層、數據鏈路層、物理層。因爲表示層跟會話層沒有獨立實現過,而是跟應用層一塊兒實現的github
應用層決定了向用戶提供應用服務時通訊的活動。(DNS、HTTP、HTTPS、RTMP、FTP);web
傳輸層對上層應用層,提供處於網絡鏈接中的兩臺計算機之間的數據傳輸。(TCP、UDP)。算法
網絡層用來處理在網絡上流動的數據包。數據包是網絡傳輸額最小單位。(IP)編程
鏈路層是用來鏈接網絡的硬件部分。包括控制操做系統、驅動、網卡等。瀏覽器
物理層主要是定義物理設備如何傳輸數據。緩存
當咱們購物時,會先去 DNS 或 HTTPDNS 查找 IP 地址。知道目標 IP 地址,瀏覽器就會打包請求,若是使用 HTTPS ,則採起加密傳輸。安全
一、應用層:瀏覽器經過 socket 編程,將其打包傳輸給下一層傳輸層; 二、傳輸層:這裏採用TCP協議(PS:它有兩個端口,一個是瀏覽器監聽端口,一個是服務器監聽端口,操做系統每每經過端口來判斷數據包應該往哪一個進程走)。TCP將應用層收到的數據包進行~分割~,並在報文上打上標記序號及端口號轉發給網絡層; 三、網絡層:接收到傳輸層的數據包,在該層有 本地IP地址 以及 目標IP地址,將IP地址封裝後轉發給鏈路層; 四、鏈路層:經過ARP協議,獲取本地MAC地址,發送給網關物理層(默認IP:192.168.1.1)。 5:物理層:因爲有MAC地址,IP 數據包能達到網關。如路由器,會根據路由表,來判斷目標 IP 怎麼走。
注
IP 地址:指明瞭節點被分配到的地址,可變。 MAC 地址:指網卡所屬的固定地址,基本不變。 IP 間的通訊依賴 MAC 地址。
ARP 協議:解析地址的協議,根據 IP地址 反查出對應的 MAC地址。
方法 | 描述 |
---|---|
GET | 獲取指定資源,通常來講 GET 請求只用於資源數據的請求。 |
POST | 傳輸實體主體,向指定資源提交數據,如表單提交、資源建立等。 |
PUT | 傳輸資源,向指定資源位置上傳最新內容,如資源更新等。 |
DELETE | 請求服務器刪除置頂的 URI 所標識的資源,簡單來講就是刪除資源。 |
PATCH | 跟 PUT 方法有些相似,都是更新資源。可是 PATCH 主要是更新部分資源, 而 PUT 則是總體更新;當資源不存在時,PATCH 會建立新資源,而 PUT只會 在已有的資源進行更新。 |
HEAD | 同 GET 方法,但 HEAD 經常使用於獲取報文首部,查看服務器性能。 |
OPTIONS | 該方法同 HEAD,可是 OPTIONS 用來詢問服務器返回該資源所支持的方法。 |
狀態碼大類 | 狀態碼小類 | 描述 |
---|---|---|
1xx | 信息性狀態碼,接收到請求而且繼續處理。 | |
2xx | 成功狀態碼。 | |
200 | 服務器已成功處理了請求。 | |
201 | 服務器已接收請求,但還沒有處理,客戶端能夠經過該狀態碼進行輪詢。 | |
203 | 服務器已成功處理了請求,但可能未受權。 | |
204 | 服務器成功處理了請求,但沒有返回任何內容,如刪除成功。 | |
206 | 服務器成功處理了部分 GET 請求,如媒體多端請求。 | |
3xx | 重定向狀態碼。 | |
301 | 永久性重定向。 | |
302 | 臨時性重定向。 | |
303 | 同302,但多了一個標準,就是明確要求客戶端採用 GET 方法。 | |
注:30一、30二、303 響應後,瀏覽器都會把 POST 改成 GET,並刪除請求主體,等到再次請求時才發送。 | ||
304 | 資源沒有發生變化,該狀態碼跟重定向沒有什麼關係。 | |
4xx | 客戶端錯誤狀態碼。 | |
400 | 請求錯誤,服務器不理解請求的語法,簡單來講就是錯誤的傳參致使的報錯。 | |
401 | 請求不經過身份驗證,如未登陸或令牌錯誤。 | |
403 | 請求經過身份驗證,可是未受權,如權限管理越級訪問。 | |
404 | 請求服務器不存在的資源。 | |
405 | 請求方法不經過,如該用 POST 方法的請求用了 PUT。 | |
406 | 請求的資源格式不正確,如請求 JSON 格式數據,服務器只有 XML 格式數據。 | |
409 | 請求發生衝突,常見於修改內容在服務器上是惟一的,如身份證ID。 | |
410 | 請求的資源曾經存在過,以下架的視頻。 | |
413 | 請求體超過服務器的限制,如上傳資源 10M,服務器限制 5M。 | |
414 | 請求 URI 過長。 | |
415 | 不支持媒體類型,如上傳 PNG 文件,而服務器規定 JPG。 | |
5xx | 服務端錯誤狀態碼。 | |
500 | 服務器發生錯誤,但緣由未明。 | |
502 | 網關錯誤,如請求需轉發到B服務器,而B服務器報錯時就會報網關錯誤。 | |
503 | 服務不可用,服務器重啓或維護之類不在狀態。 | |
504 | 網關超時,同502,只是B服務器久久不迴應。 |
q,表示權重值,默認值1.0,區間在0~1。如 Accept-Language:zh-CN,en-US;q=0.8,en;q=0.6
,表示瀏覽器優先支持 zh-CN 。
通用首部字段指的是請求報文以及響應報文都會使用到的首部。
常見緩存請求指令 | 說明 |
---|---|
no-cache | 強制向服務器再次驗證 |
no-store | 不緩存請求或響應的任何內容 |
max-age=(秒) | 響應的最大 Age 值 |
max-stale=[秒] | 接收已過時的響應 |
min-fresh=(秒) | 指望在指定時間內的響應仍有效 |
常見緩存響應指令 | 說明 |
---|---|
public | 可向任意方提供響應的緩存 |
private | 僅向特定用戶返回響應 |
no-cache | 緩存前必須先確認其有效性 |
no-store | 不緩存請求或響應的任何內容 |
max-age=(秒) | 響應的最大 Age 值 |
s-maxage=(秒) | 公共緩存服務器響應的最大 Age 值 |
must-revalidate | 可緩存但必須再向源服務器進行確認 |
Connection: Close
:斷開時將 Connection 設置爲Close;Connection: Keep-Alive
:鏈接保持持久化;Upgrade: TLS/1.0
Connection: Upgrade (必須指定爲Upgrade)
複製代碼
text/html
、image/jpeg
;ios-8895-5,utf-8;q=0.8
;gzip,deflate
;zh-cn,zh;q=0.7
;www.baidu.com
;// request body
GET /index.html
If-Range: "123456"
Range: bytes=5001-10000
// response body(匹配狀況下)
206 Partial Content
Content-Range: bytes 5001-10000/1000
// response body(不匹配狀況下)
200 OK
ETag: "45678"
複製代碼
W/
,如:ETag: W/"xxx-1234"
;Retry-After: 120
;Server: Apache/xxxx (Unix)
;實體首部字段是包含在請求報文和響應報文中的實體部分所使用的首部,用於補充內容的更新時間等與實體相關的信息,這裏主要列舉下響應報文補充字段。
zh-cn
;https://www.baidu.com/
,返回資源 https://www.baidu.com/index.html
;Content-Range: bytes 5001-10000/10000
,單位字節;Accept
;Cache-Control
有指定 max-age
指令時,會優先處理 max-age
;DENY
爲拒絕;SAMEORIGIN
:盡在同源域名下匹配時許可;0
爲將XSS過濾設置成無效狀態,1
則相反;X-Requested-With: XMLHttpRequest
;X-Do-Not-Track
,請求某個網頁應用程序中止跟蹤某個用戶。0
表示 DNT
被禁用,1
則相反;X-Csrf-Token:i8XNjC4b8KVok4uw5RftR38Wgp2BFwql
;在 HTTP 1.1 以前,每一個 HTTP 請求都要求打開一次 TCP 鏈接,而且使用一次以後就斷開這個 TCP 鏈接,每次這樣都會形成資源的浪費。
HTTP/1.1 keep-alive
:只要任意一端沒有明確提出斷開鏈接,則保持 TCP 鏈接狀態,即在一次 TCP 鏈接中能夠持續發送多份數據而不會斷開鏈接,這樣就能夠減小 TCP 鏈接創建的次數,意味着能夠減小 TIME_WAIT 狀態鏈接。可是,長時間的 TCP 鏈接容易致使系統資源無效佔用,因此正確地設置 keep-alive timeout 時間很是重要。
爲何須要持久鏈接?爲何 TCP 的創建耗費時間?這裏就須要說到 TCP 的三次握手跟四次揮手了。
在客戶端和服務器創建 HTTP 請求的發送和返回的過程當中,在這過程當中是須要建立 TCP Connection,由於 HTTP 只有請求和響應這個概念,而 TCP 起到了傳輸數據包的做用。在 HTTP 1.0 版本,TCP 傳輸完畢以後就關閉了,而在 HTTP 1.1 版本,則 TCP 上面是能夠有多個 HTTP 請求的。
seq(Sequence Number):序列號; ack(Acknowledgement Number):確認序號
SYN=1, seq=X
:客戶端發送一個 TCP 的 SYN 標誌位爲1的包,指明客戶端準備鏈接服務器的端口。而 seq,爲初始序列號X,X是隨機的,這樣爲了網絡安全。發送完畢以後客戶端就進入 SYN_SEND
狀態;SYN=1, ACK=1, seq=y, ack=x+1
:服務器返回確認包(SYN=1, ACK=1),同時服務器隨機生成 seq 序列號,並將確認序號 ack 設置爲客戶請求序號加1,即 ack=x+1。完畢以後,服務器進入 SYN_RCVD
狀態;ACK=1, ack=y+1, seq=x+1
:客戶端收到服務器的數據後,會檢查 ack 是否等於 x+1,ACK標誌位爲1。若是正確則會再次發送確認包(ACK=1),而且把服務器發來的 ack 序號在 seq 的基礎上加1,即 ack=y+1
,而後再設置 seq=x+1
。發送完畢後,客戶端和服務器都進入了 ESTABLISHED
狀態,TCP握手結束。關閉TCP鏈接,不管是客戶端仍是服務器,只要執行 close
操做,就能夠發起揮手行爲。之因此有4次,是由於 TCP 鏈接的拆除須要發送4個包。咱們在如下視圖默認爲客戶端向服務器發起 close
操做。其中seq
/ack
同上。
FIN=1, seq=x
:客戶端發送 FIN 包,表示客戶端已經沒有數據能夠發送了,可是仍然能夠接收數據,這時候客戶端進入 FIN+WAIT_1
狀態;ACK=1, ack=X+1
:服務器收到客戶端的 FIN 包,隨後反手就是一個確認包,表示服務器已經收到客戶端關閉鏈接的請求,可是還沒作到真正的關閉;FIN=1, seq=y
:服務器準備關閉鏈接時,再次向客戶端發送結束鏈接的響應。發送完畢以後,服務器進入 LAST_ACK
狀態,等待客戶端最後的確認包ACK
;ACK=1, ack=y+1
:客戶端收到服務器的結束響應,而後客戶端就發送最後的確認包 ACK
,服務器收到後就開始關閉鏈接,進入 CLOSED
狀態;客戶端等待 **2MSL(MSL(Maximum Segment Lifetime): 報文段最大生存時間)**後,再也沒有收到服務器的 ACK
,認爲服務器已經正常關閉了,隨後客戶端也關閉鏈接,進入CLOSED
狀態。不只僅 HTTP,任何未加密的協議都存在如下的不足:
-> HTTP 加密處理 + 認證 + 完整性保護 = HTTPS 在上面提到網絡協議層的時候,有一層是安全層,該層就是 SSL協議/TLS協議。HTTP 是直接與TCP通訊,而HTTPS,則演變成了先和 SSL 通訊,再由 SSL 和 TCP 通訊了。
注
SSL 還能夠配合其餘應用層協議,如SMTP,Telnet;
加密和解密共用一個密鑰稱爲對稱加密,而使用公開密鑰+私有密鑰則爲非對稱加密。
HTTPS 則採用對稱加密和非對稱加密二者並用的混合加密機制。由於不管是對稱加密仍是非對稱加密,都是沒法直接保證通訊的安全性,如沒法證實公開密鑰就是貨真價實的。所以須要數字證書認證機構。
注
多數瀏覽器開發商發佈版本會事先植入經常使用認證機關的公開密鑰。
Pre-master secret
的隨機字符串;Pre-master secret
密鑰加密;注
在應用層發送數據時會附加 MAC(Message Authentication Code)的報文摘要來檢查報文是否遭到篡改,從而保護報文的完整性。
安全性在網絡通訊獲得了保證,可是HTTPS也存在HTTPS 處理速度慢(SSL 通訊慢,並且消耗CUP和內存資源)以及證書認證貴 的缺點。
在這裏簡單的說下,相比之下,HTTP 1.1 和 HTTP 2有什麼優化。
注
HTTP 是一種不保存狀態,即無狀態協議,它不會對請求和響應作持久化處理。所以纔會有了Cookie、Session技術的引進。
Session的實現對Cookie有依賴關係,前者是保存在服務器,由於會佔用服務器CPU和內存資源,可是相對安全;相反的後者是保存在客戶端的,在響應報文內攜帶Set-Cookie首部字段,告知客戶端保存,並且安全性較弱。
有關網絡協議知識點太多了,在這裏也只是借用巨人的肩膀來簡單的理清網絡協議的大概思路。每個細節,每個原理真真正正要較真起來,均可以單獨寫一篇文章,之因此有這篇文章的存在,是由於後續的文章都須要或多或少的網絡協議知識,也是爲了之後方便本身記憶,不用處處查找資料。這裏的知識點可能會有所紕漏錯誤,也有可能在這裏說得不明不白模糊不清,這以後會慢慢優化補上。