1、第一個問題
http相關一個最經典的問題:瀏覽器輸入URL後HTTP請求返回的完整過程javascript
ps:瀏覽器中的performance會記錄整個過程當中各個階段所要花費的時間。
- 第一步會作一個redirect(跳轉),瀏覽器可能記錄了這個地址以及永久跳轉成一個新的地址,因此第一步瀏覽器先回判斷需不須要這個redirect以及跳轉到哪裏。
- 第二部會看緩存(app cache),判斷這個頁面是否是已經緩存過了,若是有緩存就讀取緩存,沒有的話就要去服務器請求資源了。
- DNS查找(域名解析),去找到這個域名所對應的IP地址。
- 建立TCP鏈接,會涉及三次握手,有多是HTTPS會跟HTTP有所不一樣。
- request(發送請求)
- response(結束相應)
2、HTTP協議基礎及發展歷史
網絡協議分層
- 物理層主要做用是定義物理設備如何傳輸數據
- 數據鏈路層在通訊的實體間創建數據鏈路鏈接
- 網絡層爲數據在結點之間傳輸建立邏輯鏈路
- 傳輸層
- 向用戶提供可靠的端到端(End-to-End)服務
- 傳輸層向高層屏蔽了下層數據通訊的細節
- 應用層
- 爲應用軟件提供了不少服務
- 構建於TCP協議之上
- 屏蔽網絡傳輸相關細節
HTTP協議發展歷史
- HTTP/0.9
- 只有GET命令
- 沒有HEADER等描述數據的信息
- 服務器發送相應完畢後,就關閉TCP鏈接
- HTTP/1.0
- 增長了不少命令
- 增長status code和header
- 多字符集支持、多部分發送、權限、緩存等
- HTTP/1.1(目前)、HTTPS與HTTP1.1相似
- 持久鏈接,經過聲明能夠保持(不關閉TCP鏈接)
- pipeline(同一個鏈接裏發送多個請求)
- 增長了host(同一個服務器能夠跑多個服務)和其餘一些命令
- https 公鑰加密,私鑰解密,中間人沒有私鑰
- HTTP2
- 全部數據以二進制傳輸
- 同一個鏈接裏面發送多個請求再也不須要按照順序來(併發)
- 頭信息壓縮以及推送等提升效率的功能
HTTP的三次握手
HTTPS握手過程
URI、URL、URN
- URI
- 統一資源標示符
- 用來惟一標識互聯網上的信息資源
- 包括URL和URN
- URL
- URN
- 永久統一資源定位符
- 在資源移動以後還能被找到
- 目前沒有很是成熟的使用方案
HTTP報文
- HTTP方法
- 用來定義對資源的操做
- 經常使用的GET/POST等
- 從定義上講有各自的語義
- HTTP CODE
- 定義服務器對請求的處理結果
- 各個區間的CODE有各自的語義
- 好的HTTP服務能夠經過CODE判斷結果
3、HTTP各類特性總覽
CORS跨域請求的限制與解決
- 須要後端支持:'Access-Control-Allow-Origin':'*'
- 預請求:'Access-Control-Allow-Headers':'自定義的頭'
- 容許的方法:'Access-Control-Allow-Methods':'POST,PUT,DELETE'
- 在必定時間內不須要預請求:'Access-Control-Max-Age': '1000' 1000s內不用預請求
http緩存頭cache-control
- 可緩存性
- public 均可以進行緩存,下一次能夠讀緩存不須要再請求
- private 發起請求的瀏覽器才能夠請求
- no-cache 任何一個結點都不能夠,須要通過服務器的驗證
- 到期
- max-age=
- s-maxage= 代理服務器會讀取s-message代替max-age
- max-stale= 發起端設置的,即使max-age已通過期了,瀏覽器仍是讀取這個已通過期的緩存
- 從新驗證
- must-revalidate 在設置了max-age的緩存當中,若是已通過期了,必須去原服務端去發送這個請求從新獲取數據
- must-revalidate 用在緩存服務器上的
- 其餘
- no-store 永遠不能緩存
- no-transform 不容許隨意改變內容
- 刷新瀏覽器緩存經過hash碼
資源驗證
驗證頭:驗證緩存Last-Modified和Etag的使用
- Last-Modified
- 上次修改時間
- 配合If-Modified-Since或者If-Unmodified-Since使用
- 對比上次修改時間以驗證資源是否須要更新
- Etag
- 數據簽名
- 配合If-Match或者If-Non-Match使用
- 對比資源的簽名判斷是否使用緩存
cookie與session
- cookie
- 經過Set-Cookie設置
- 下次請求會自動帶上
- 鍵值對,能夠設置多個
- cookie屬性
- max-age和expires設置過時時間
- Secure只在https的時候發送
- HttpOnly沒法經過document.cookie訪問(可防止csrf攻擊)
HTTP長鏈接
- 一個tcp/ip鏈接最多容許6個併發請求
- Connection: keep-alive持久鏈接,單個請求完畢後不會關閉tcp/ip鏈接
- http2能夠在一個tcp/ip鏈接上併發請求(串行與並行的區別)
數據協商
- 分類
- 請求中經過Accept來進行聲明想要什麼樣的數據
- Accept 制定的數據類型
- Accept-Encoding 編碼方式,限制壓縮方式
- Accept-Language 語言
- User-Agent 瀏覽器相關信息
- 服務端返回的content
- Content-Type
- Content-Encoding
- Content-Language
Redirect
if (request.url === '/') {
response.writeHead(302, {
'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;
server {
listen 80;
server_name test.com;
location / {
proxy_cache my_cache;
proxy_pass http://127.0.0.1:8888;
proxy_set_header Host $host;
}
}
server {
listen 443 http2;
server_name test.com;
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;
}
}
複製代碼