HTTP協議知識總結

1、第一個問題

http相關一個最經典的問題:瀏覽器輸入URL後HTTP請求返回的完整過程javascript

瀏覽器輸入URL後HTTP請求返回的完整過程
ps:瀏覽器中的performance會記錄整個過程當中各個階段所要花費的時間。

  1. 第一步會作一個redirect(跳轉),瀏覽器可能記錄了這個地址以及永久跳轉成一個新的地址,因此第一步瀏覽器先回判斷需不須要這個redirect以及跳轉到哪裏。
  2. 第二部會看緩存(app cache),判斷這個頁面是否是已經緩存過了,若是有緩存就讀取緩存,沒有的話就要去服務器請求資源了。
  3. DNS查找(域名解析),去找到這個域名所對應的IP地址。
  4. 建立TCP鏈接,會涉及三次握手,有多是HTTPS會跟HTTP有所不一樣。
  5. request(發送請求)
  6. response(結束相應)

2、HTTP協議基礎及發展歷史

網絡協議分層

經典五層模型

  1. 物理層主要做用是定義物理設備如何傳輸數據
  2. 數據鏈路層在通訊的實體間創建數據鏈路鏈接
  3. 網絡層爲數據在結點之間傳輸建立邏輯鏈路
  4. 傳輸層
    • 向用戶提供可靠的端到端(End-to-End)服務
    • 傳輸層向高層屏蔽了下層數據通訊的細節
  5. 應用層
    • 爲應用軟件提供了不少服務
    • 構建於TCP協議之上
    • 屏蔽網絡傳輸相關細節

HTTP協議發展歷史

  1. HTTP/0.9
    • 只有GET命令
    • 沒有HEADER等描述數據的信息
    • 服務器發送相應完畢後,就關閉TCP鏈接
  2. HTTP/1.0
    • 增長了不少命令
    • 增長status code和header
    • 多字符集支持、多部分發送、權限、緩存等
  3. HTTP/1.1(目前)、HTTPS與HTTP1.1相似
    • 持久鏈接,經過聲明能夠保持(不關閉TCP鏈接)
    • pipeline(同一個鏈接裏發送多個請求)
    • 增長了host(同一個服務器能夠跑多個服務)和其餘一些命令
    • https 公鑰加密,私鑰解密,中間人沒有私鑰
  4. HTTP2
    • 全部數據以二進制傳輸
    • 同一個鏈接裏面發送多個請求再也不須要按照順序來(併發)
    • 頭信息壓縮以及推送等提升效率的功能

HTTP的三次握手

TCP鏈接

三次握手順序

  • 三次握手的做用:能夠避免服務端開啓一些無用的鏈接

HTTPS握手過程

URI、URL、URN

  1. URI
    • 統一資源標示符
    • 用來惟一標識互聯網上的信息資源
    • 包括URL和URN
  2. URL
  3. URN
    • 永久統一資源定位符
    • 在資源移動以後還能被找到
    • 目前沒有很是成熟的使用方案

HTTP報文

HTTP報文

  1. HTTP方法
    • 用來定義對資源的操做
    • 經常使用的GET/POST等
    • 從定義上講有各自的語義
  2. HTTP CODE
    • 定義服務器對請求的處理結果
    • 各個區間的CODE有各自的語義
    • 好的HTTP服務能夠經過CODE判斷結果

3、HTTP各類特性總覽

CORS跨域請求的限制與解決

  1. 須要後端支持:'Access-Control-Allow-Origin':'*'
  2. 預請求:'Access-Control-Allow-Headers':'自定義的頭'
  3. 容許的方法:'Access-Control-Allow-Methods':'POST,PUT,DELETE'
  4. 在必定時間內不須要預請求:'Access-Control-Max-Age': '1000' 1000s內不用預請求

http緩存頭cache-control

  1. 可緩存性
    • public 均可以進行緩存,下一次能夠讀緩存不須要再請求
    • private 發起請求的瀏覽器才能夠請求
    • no-cache 任何一個結點都不能夠,須要通過服務器的驗證
  2. 到期
    • max-age=
    • s-maxage= 代理服務器會讀取s-message代替max-age
    • max-stale= 發起端設置的,即使max-age已通過期了,瀏覽器仍是讀取這個已通過期的緩存
  3. 從新驗證
    • must-revalidate 在設置了max-age的緩存當中,若是已通過期了,必須去原服務端去發送這個請求從新獲取數據
    • must-revalidate 用在緩存服務器上的
  4. 其餘
    • no-store 永遠不能緩存
    • no-transform 不容許隨意改變內容
  5. 刷新瀏覽器緩存經過hash碼

資源驗證

驗證緩存
驗證頭:驗證緩存Last-Modified和Etag的使用

  1. Last-Modified
    • 上次修改時間
    • 配合If-Modified-Since或者If-Unmodified-Since使用
    • 對比上次修改時間以驗證資源是否須要更新
  2. Etag
    • 數據簽名
    • 配合If-Match或者If-Non-Match使用
    • 對比資源的簽名判斷是否使用緩存

cookie與session

  1. cookie
    • 經過Set-Cookie設置
    • 下次請求會自動帶上
    • 鍵值對,能夠設置多個
  2. cookie屬性
    • max-age和expires設置過時時間
    • Secure只在https的時候發送
    • HttpOnly沒法經過document.cookie訪問(可防止csrf攻擊)

HTTP長鏈接

  1. 一個tcp/ip鏈接最多容許6個併發請求
  2. Connection: keep-alive持久鏈接,單個請求完畢後不會關閉tcp/ip鏈接
  3. http2能夠在一個tcp/ip鏈接上併發請求(串行與並行的區別)

數據協商

  1. 分類
    • 請求
      1. Accept
      2. Content
    • 返回
  2. 請求中經過Accept來進行聲明想要什麼樣的數據
    • Accept 制定的數據類型
    • Accept-Encoding 編碼方式,限制壓縮方式
    • Accept-Language 語言
    • User-Agent 瀏覽器相關信息
  3. 服務端返回的content
    • Content-Type
    • Content-Encoding
    • Content-Language

Redirect

if (request.url === '/') {
    response.writeHead(302, {  // or 301 永久變成了新的路徑
      'Location': '/new'
    })
    response.end()
  }
  if (request.url === '/new') {
    response.writeHead(200, {
      'Content-Type': 'text/html',
    })
    response.end('<div>this is content</div>')
  }
複製代碼

一個簡單的https的nginx配置

proxy_cache_path cache levels=1:2 keys_zone=my_cache:10m; #nginx代理緩存

server {
  listen       80;
  # listen [::]:80 default_server;
  server_name  test.com;

  # return 302 https://$server_name$request_uri;

  location / {
    proxy_cache my_cache;
    proxy_pass http://127.0.0.1:8888;
    proxy_set_header Host $host;
  }
}

server {
  listen       443 http2; # http2
  server_name  test.com;

  # http2_push_preload on; # http2

  ssl on;
  ssl_certificate_key  ../certs/localhost-privkey.pem;
  ssl_certificate      ../certs/localhost-cert.pem;

  location / {
    proxy_cache my_cache;
    proxy_pass http://127.0.0.1:8888;
    proxy_set_header Host $host;
  }
}
複製代碼
相關文章
相關標籤/搜索