網上筆記參考:html
https://juejin.im/post/5b34e6ba51882574d20bbdd4#heading-8前端
http://dy.163.com/v2/article/detail/DJU2L7E50516W1GE.htmlnode
https://blog.csdn.net/zhanghuali0210/article/details/82080096web
https://www.cnblogs.com/ycxqdkf/articles/10397122.htmlchrome
緩存(cache-control):json
可緩存性(哪裏能夠緩存):public/任何地方,private/瀏覽器,no-cache/(能夠緩存可是每次都要驗證,驗證後告訴你用緩存仍是從新請求)後端
到期(緩存可用多久): max-age,s-maxage(代理服務器使用),max-stale(在該值的時間內可使用過時緩存)跨域
從新驗證:must-revalidate,proxy-revalidate瀏覽器
No-store:(本地和服務器都不能存緩存)緩存
No-transform: 不能對緩存進行改動(如: 壓縮,轉換)
查看資源是走緩存仍是從新請求:
走緩存的條件: 1.響應頭設置了cache-control 2.緩存在有效期max-age之內 3. 若是超過max-age有效期或者設置了no-cache時,就要經過last-modified和Etag驗證纔可用緩存。4.沒有設置no-store
緩存驗證:1.Last-modified(響應頭設置Last-modified即上次修改時間,請求頭會帶上if-modified-since供服務端與最新修改時間比對是否相等。)2.Etag(數據簽名: 內容一旦修改就會修改簽名)
同源
跨域實現: 1.jsonP(原理:script和img的src能夠跨域,前端定義回調函數,後端拼接,並把數據做爲參數傳入回調函數一塊兒返回給前端調用), 2.access-origin.. ,3. Proxy ...
跨域是瀏覽器的限制!(有請求和返回,只是瀏覽器會根據響應頭中設置判斷是否容許跨域!)
CORS預請求驗證: 它的Request Method是OPTIONS。經過OPTIONS請求得到服務端的容許,而後再發送實際的請求。
限制:
默認容許方法: Get,post,head。 其餘方法(put,delete等)瀏覽器須要預請求(method:option)驗證。
默認容許的Content-Type:
text/plain、multipart/form-data,applicaton/x-www-form-urlencoded。 其餘type須要瀏覽器預請求。。。
默認容許請求頭:https://fetch.spec.whatwg.org裏面有介紹容許的頭部。 其餘請求頭須要瀏覽器預請求。。。
XMLHttpRequestUpload對象均沒有註冊任何事件監聽器
請求中沒有使用ReadableStream對象
解決辦法:根據CORS標準定義,服務端須要在瀏覽器的跨域請求響應中包含指定消息頭,瀏覽器根據響應消息頭知道是否能夠訪問跨域資源。以下:
http客戶端: 瀏覽器,curl等(安裝curl,並curl -v www.baidu.com)
啓動一個node服務: 1.安裝node 2.node server.js
URI URL URN
URI(統一資源標識符)包含URL和URN
URN永久統一資源定位符,目的是讓資源移動後還能被找到,目前尚未成熟的使用方案。
HTTP發展歷史
HTTP/0.9
該版本只有一個命令GET;沒有HEADER等描述數據的信息; 服務器發送完畢,就關閉TCP鏈接。
HTTP/1.0
該版本增長了不少命令;增長status code 和header;多字符集支持、多部分發送、權限、緩存等。
HTTP/1.1
該版本增長了持久鏈接、Pipeline,增長host和其餘一些命令。持久鏈接會在HTTP特性中介紹;若是沒有pipeline,那麼Web服務器就須要串行處理請求,而有了pipeline,Web服務器就並行處理請求;而增長host實現了一臺物理設備能夠運行多個web服務。
HTTP/2.0
全部數據以二進制傳輸,以前版本使用字符串進行傳輸;同一個鏈接 裏面發送多個請求再也不須要按照順序來;頭信息壓縮以及推送等提升效率的功能。
http發展歷史: http/0.9 http/1.0 http/1.1 http/2.0將來(二進制數據傳輸,並行請求,服務端推送)
Tcp connection(一次tcp鏈接中可有屢次http請求。三次握手)
wireshark抓包工具,學習並使用一下
三次握手分析!
web開發只須要學習應用層和傳輸層(頂多接觸TCP),其餘三層瞭解便可:
從輸入URL到http傳輸完成流程圖:
根據上圖知道哪一個階段用時多,針對該階段(好比是緩存階段)進行優化。
http報文:請求(請求首行,請求header, 請求body),響應(響應)
請求報文和響應報文分爲起始行、首部(header)和主體(body),請求報文的首部包括三部分,分別是HTTP方法、資源目錄和協議,而響應報文的首部包括協議版本、狀態碼和狀態碼對應的意思,好比200狀態的意思是ok。須要注意的是:HTTP header和HTTP body之間以一行分隔。
請求首行: (1.http方法Get,post(新增),put(修改),delete 2.path 3.http version)
響應首行: (1.http version 2.http code 3.http code的含義)
http code:用於定義服務器對請求的處理結果,各個區間的code有不用的語義。1xx 表示信息響應類,表示接收到請求而且繼續處理;2xx 表示成功;3xx 表示重定向;4xx 表示客戶端出錯;5xx 表示服務器出錯。
Cookie
定義:cookie是由服務端響應頭的set-cookie設置的,返回給客戶端後,此後瀏覽器每次請求都會帶上
過時時間:默認是瀏覽器關閉後,也能經過max-age和expires設置
secure只在https的時候發送
設置httpOnly後,js便沒法經過document.cookie訪問cookie(經常使用安全策略)
cookie不能跨域設置。
a.test.com和 b.test.com屬於不一樣域名,但都是test.com的子域,所以能經過在頂級域名設置domain來實現cookie共享。
HostAdmin App: 相似於DNS的域名:IP映射工具(chrome插件):
TCP長連接:
長鏈接
咱們知道一個HTTP須要建立一個TCP鏈接,完成以後就關閉TCP鏈接,這個成本比較高(由於建立一個TCP鏈接須要經過三次握手),因此在HTTP/1.1開始支持長鏈接,請求頭標識是Connection:keep-alive。以下圖所示,同一個Connection ID表示同一個鏈接。須要注意的是同一個鏈接只能是同域請求。
長鏈接就是一個tcp連接中能夠發多個http請求,
即一個connection id表明一個tcp連接。長鏈接設置: 響應頭設置爲'Connection': 'keep-alive'
短鏈接設置:'Connection': 'close'
設置長鏈接後,一個tcp鏈接中能夠同時發多個http請求,便可以並行。
tcp鏈接個數的限制: 如谷歌是限制爲最多6個,即6個connection id(就是tcp 連接id),6個用完後不會建立新的tcp鏈接,只能等哪一個tcp鏈接完了再進入哪一個老的tcp鏈接。