http2.0所有資料以二進位制進行傳輸,
同乙個連線裡面傳送多個請求不再按順序來
頭資訊壓縮以及等提高效率的功能,頭壓縮減少頻寬,請求html同時提前推送js,css資源。
http1.1之後,傳送乙個http請求,會建立乙個tcp連線,該鏈結在請求返回後不會關閉,下次傳送其他http請求,會繼續使用該鏈結。
抓包工具:wireshark (傳輸層, 網路層都可以抓), charles
tcp三次握手
seq = 0
seq = 0 ack =1
seq = 1 ack = 1
第一次握手,傳送syn報文,傳達資訊:「你好,我想建立連線」;
第三次握手,回傳ack報文,傳到資訊:「好的,我知道了,那我們連線」。然後就建立連線了。
uri, url, urn uri包括 url, urn
uri uniform resource idetifier /統一資源標誌符,唯一標識網際網路上的資源
url uniform resource locator /統一資源定位符
ftp協議也可以獲取網路資源
urn 永久資源定位符 使用較少
在命令列中發起http請求 curl -v www.baidu.com
關於跨域:瀏覽器傳送請求後,即使跨域。服務端也會返回資訊,只是此時瀏覽器沒有檢測到access-control-allow-origin已設定允許跨域的網域名稱,直接忽略返回內容,並報錯
link, image, script標籤無跨域限制
跨域限制:
x-test-cors設定後, access-control-allow-origin不允許跨域
get , header, post 預設允許跨域, 其他請求方法瀏覽器會進行預請求驗證
什麼是預請求:
access-control-allow-headers: 'x-test-cors' 設定允許跨域的請求頭
瀏覽器請求頭設定x-test-cors:''的值後,傳送正式請求之前,瀏覽器會先傳送乙個options請求,用來驗證當前設定的請求頭是否被允許跨域使用
其他的預請求驗證還有:
access-control-allow-method:' post, put, delete'
access-control-max-age: '1000' 預請求儲存的最長有效時間 單位s 1000s之內不用再進行預請求驗證
cache-control
可快取性:
public 是指在http請求返回的內容所經過的任何路徑中都可以將其快取
private 不允許**伺服器快取(中間經過的路徑)
no-cache 可以使用快取,但是每次都要驗證
到期max-age 單位秒
s-maxage 會覆蓋max-age,只在**伺服器生效
max-stale (瀏覽器中很少用)
重新驗證(瀏覽器中用的比較少)
must-revalidater
proxy-revalidater 使用在快取伺服器中
其他:no-store 瀏覽器和**伺服器都不可以使用快取
no-transform 使用在快取伺服器中,禁止轉換返回內容
例項:cache-control: 'max-age = 200, public' 多個用逗號隔開
max-age後,如果時間沒有到期,即使伺服器資源進行了修改,瀏覽器端還是會使用本地的快取。
解決上面問題的方法:資源url路徑加內容計算出來的hash值
cache設定 no-cache時, 每次都會進行快取驗證
驗證頭:
last-modified 上次修改時間 , 配合if-modified-since和if-unmodified-since(使用較少)使用
上面的是對比最後修改時間,判斷資源有沒有被修改
etag 資料簽名 根據內容生成的hash值 對比瀏覽器端和服務端的etag是否一致
例項:設定no-cache後才可以使用etag和last-modified
服務端設定
cache-control: 'max-age = 200000,no-cache',
etag:'777',
last-modified:'123'
瀏覽器第一次請求時接收到上面的請求頭資訊,瀏覽器在下次傳送請求時,會帶上下面兩個值
if-modified-since: 123,
if-modified-match: 777
此時服務端的邏輯設定為:
const etag = request.headers['if-modified-match'];
if(etag === '777'){
response.writeheader(304,{
cache-control: 'max-age = 200000,no-cache',
etag:'777',
last-modified:'123'
response.end('')
對於if-modified-since對比的是最後的修改時間,服務端在修改資源後,可以在資料庫儲存該資源最後的修改時間
cookie
通過set-cookie設定
下次請求會自動帶上
鍵值對形式,可以設定很多個
cookie屬性
max-age,expires設定cookie過期時間
max-age代表cookie有效時間有多長
expires是指cookie到期的時間點
secure只在https的時候傳送
httponly無法通過document.cookie訪問
例項:response.writeheader(304,{
'cache-control': 'max-age = 200000,no-cache',
』set-cookie': 'id=123'
子網域名稱獲取主網域名稱設定的cookie
服務端:
const host = request.headers.host;
if(host === 'a.test.com'){
'cache-control': 'max-age = 200000,no-cache',
』set-cookie': 'id=123;max-age=200'
chrome工具 host admin 對映網域名稱和ip
設定所有子網域名稱都可以訪問主網域名稱的cookie
只需要設定cookie中的domain = test.com
』set-cookie': 'id=123;max-age=200;domain=test.com'
session
cookie不等於session
http長連線
chrome最大併發 6個 最多一次6個不同的tcp連線
connect:'keep-alive' | 'close'
http2有通道復用, 所有的請求復用乙個tcp連線 (同網域名稱)
資料協商
分類:請求 返回
請求:accept 指定想要的資料型別
accept-encoding
accept-language
user-agent 瀏覽器相關資訊 系統版本 瀏覽器核心 渲染引擎的版本 chrome版本號 等等
返回content
content-type : 資料的格式
content-encoding 資料壓縮的方式
content-language 是否按照請求設定的語言返回
node中使用zlib包壓縮資料
res.end(zlib.gzipsync(html))
redirect
指定302
response.writeheader(302,{
'loaction' : '/new'
指定301
response.writeheader(301,{ //將路徑永久重定向,由瀏覽器重定向請求
'loaction' : '/new'
設定請求頭:vary 當請求頭是同乙個值時,才會使用快取(針對**快取)
cache-control:"s-maxage=200"
vary: "x-test-cache"
x-test-cache的值相同時,才可以使用快取
加密私鑰
公鑰 放在網際網路上的加密過的字串,所有人都可以拿到,用來對傳輸的資訊加密
公鑰和私鑰在握手的時候傳輸
https握手過程
https預設使用443埠
nginx配置https http重定向到http
HTTP2 0相較HTTP1 0有哪些公升級
一 http發展史 1 1.網際網路 網際網路的發源,始於1969年美國的阿帕網 arpanet 中文直譯 高階研究專案 網路 其開始是為了建立一種用於軍隊通訊的網路。另一種推動網際網路發展的是nsf網,它最初是由美國國家科學 會資助建設的,目的是連線全美的5個超級計算機中心,供100多所美國大學共...
http2 0 相對於 http1 1的優勢
1.http2.0完全是多路復用的,只需乙個連線就可實現並行 可以將不同的請求夾雜在一起,只需乙個連線就能載入乙個頁面。2.可以讓伺服器將響應主動推動到客戶端快取中 3.壓縮報頭,降低了開銷 http1.1不支援頭部壓縮,所以產生了spdy和http2.0協議,spdy使用的是通用的deflate演...
HTTP 2 0 的那些事
spdy協議是google提出的基於傳輸控制協議 tcp 的應用層協議,通過壓縮 多路復用和優先順序來縮短載入時間。該協議是一種更加快速的內容傳輸協議,於2009 年年中發布。也可以把spdy看作是http 2的前身。spdy並不是首字母縮略字,而僅僅是 speedy 的縮寫。spdy現為googl...