經過閱讀該文章,你能夠學到算法
- HTTP的傳輸原理
- HTTP的首部
- HTTPS的原理
使用TCP做爲傳輸層:chrome
一個典型的HTTP請求過程以下圖所示:
瀏覽器
標準的HTTP協議共有GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE
。緩存
從字面上理解GET
、POST
,一個是獲取,一個是發送,因此通常狀況下咱們在想讀取一個服務器資源的時候咱們會用GET
請求,當須要修改服務器數據的時候,用POST
提交操做。
咱們來看一個典型的GET
協議,服務器
在http1.0中一個http在傳輸完成以後就會斷開tcp連接,受到tcp慢啓動的特色,每次創建http都會消耗大量的時間,因此各個瀏覽器定義了一個不標準的協議叫keep-alive,固然在http1.1中已經默認開啓keep-alive,標識該請求在結束以後不會被斷開,也就是下一個請求能夠不用進行DNS查詢,TCP三次握手,直接利用上一個通道進行傳輸。
cookie
上面的keep-alive對請求中的鏈路作了優化,在瀏覽器還有一個很是重要的字段,Cache-control,該消息頭被用於在http 請求和響應中經過指定指令來實現緩存機制。
在response中服務器能夠經過max-age=x指定該資源的過時時間,標識在x秒以後一樣的請求直接走客戶端緩存邏輯。
網絡
cache-control:no-cache
去強制強求服務器資源。
當客戶端的cache-control過時了怎麼辦,是否必須向服務器請求資源呢?
HTTP的設計者們固然沒有那麼傻,這個時候就要用到協商緩存了。session
在服務端第一次返回資源的時候,若是帶上一個last-modified參數,也就是告知客戶端,這個資源在這個時間我更新過了,下次你記得給我帶過來,我驗證一下在這個時間以後是否有被更新過,若是沒有,那就返回304,你客戶端直接取本地緩存便可,若是有更新,那會返回200,而且附上最新的last-modified值。
tcp
用Last-Modified有個問題,好比說我在一秒鐘更新了屢次資源,那這個資源只要第一次被緩存了,1秒鐘更新再屢次請求的時候仍是會返回304。另外有些文件會被定時touch,這個時候文件內容可能沒有變化,可是也會返回200。針對以上問題,出現了Etag,在第一次Response的時候,服務端會返回一個Etag,通常Etag是根據文件散列計算出來的,因此只要文件內容沒變,該Etag也惟一,這樣客戶端下次請求的時候帶上上次服務器返回的Etag給服務器校驗,若是兩次同樣,服務器就會返回304。
post
用戶狀態追蹤器,通常在瀏覽一個網站的時候,該網站都會經過set-cookie植入一個sessionId在咱們的cookie中來標識用戶身份。由於cookie會自動附帶在同域或者子域的請求上,經過cookie,廣告聯盟能夠在任何站點嵌入一個iframe頁,植入廣告,這就是爲何咱們在上網的時候常常看到在某度、某東搜索的信息,固然咱們能夠打開瀏覽器的隱私模式來避免信息被盜取與濫用。
在互聯網出現以前,若是遠在天邊的兩我的想要聯繫只能經過寫信。讓咱們看一下在中國的A要寄一封信給美國的B要通過哪些步驟。
A->中國郵局->郵遞員A.....->郵遞員Z->美國郵局->B
能夠看到中間通過了不少鏈路,在每一個環節均可以被任意偷窺甚至篡改,那麼信件到了B極可能就不是A的信了。
一樣在HTTP傳輸的過程當中,咱們能夠把運營商類比爲郵局,路由類比爲郵遞員,由於HTTP在網絡上是明文傳輸,能夠被任何偷窺修改,典型的運營商劫持就是經過這種手段去操做的。
爲了偷窺的問題,A跟B事先約定了一個辦法,A給了B一個密碼本,每一個單詞字母都用對應的密碼錶示,每次A按照密碼本寫信,B收到後再經過密碼本解密,這樣在傳輸的過程當中只要保證密碼本不落入他人手裏,其餘人就無法看得懂這封信了,這就是對稱加密。這樣看起來不錯,可是有個很是嚴重的問題,A的密碼本怎麼給到B,若是仍是經過郵寄的方式,這樣密碼本被copy了,後面的全部的加密也是白瞎。
爲了解決這種問題,B放出了一個公開的密碼本,說全部跟我通訊的人都按照這個密碼本的方式去加密,可是由於不是一一映射的關係,因此A加完密後連A本身都沒法解密,可是B本身有密鑰,經過該密鑰能夠解密信件。
這樣看起來解決了被偷窺的問題了,可是有一天B收到了一峯信件,發現用本身的密鑰解密後看不懂信件的內容,跟A溝通後,發現信件被篡改了。
爲了解決這個問題,A每次寄信的時候都會按上本身的指紋,B收到信後首先肯定這個指紋是否是A,而後再決定是否去解密,這樣問題差很少就解決了。