http協(xié)議
五層模型介紹
- 物理層:主要作用是定義物理設(shè)備如何傳輸數(shù)據(jù)夹供,網(wǎng)線,光纖
- 數(shù)據(jù)鏈路層:在通信實體間建立數(shù)據(jù)鏈路鏈接
- 網(wǎng)絡(luò)層:為數(shù)據(jù)在節(jié)點之間傳輸創(chuàng)建邏輯鏈路
- 傳輸層:主要有兩個協(xié)議 TCPIP 和 UDP 哀军,它向用戶提供了可靠的端到端的服務(wù)沉眶。
- 建立起了自己電腦到百度服務(wù)器的鏈接,它們兩端如何去傳輸數(shù)據(jù)杉适,它的傳輸數(shù)據(jù)的方式 谎倔,都是在這層定義,傳輸層向高層屏蔽了下層數(shù)據(jù)通信的細節(jié)
- 應(yīng)用層: 為應(yīng)用軟件提供了服務(wù) http / ftp 是構(gòu)建于TCP 協(xié)議之上猿推,屏蔽了網(wǎng)絡(luò)傳輸相關(guān)細節(jié)
解析:
- 經(jīng)典五層模型:
- 1.物理層:一些硬件之類
- 2.數(shù)據(jù)鏈路層:0101之類的
- 3.網(wǎng)絡(luò)層:
- 4.傳輸層:為用戶提供end-to-end服務(wù),向高層屏蔽了下層數(shù)據(jù)通信的細節(jié)
- 5.應(yīng)用層(http):構(gòu)建于TCP之上
HTTP協(xié)議的發(fā)展歷史
第一個版本 HTTP / 0.9
- 只有一個命令 GET
- 沒有HEADER 等描述數(shù)據(jù)的信息
- 服務(wù)器發(fā)送完畢就關(guān)閉
第二個版本 HTTP / 1.0
- 增加了很多命令
- 增加了status code 和 header
- 多字符集支持片习、多部分發(fā)送、權(quán)限蹬叭、緩存 等等
- 1藕咏,增加命令比如POST、PUT秽五、Header
- 2孽查,增加status code和header內(nèi)容,
- (1)status code用來描述服務(wù)端處理某一個請求之后筝蚕,它的一個狀態(tài)卦碾,
- (2)header铺坞,對應(yīng)的是起宽,不管是發(fā)送還是請求的相關(guān)的一些數(shù)據(jù)洲胖,它的描述以及我們對這部分數(shù)據(jù)如何進行操作的一個方法。
第三個版本 HTTP / 1.1
- 持久鏈接
- pipleine
- 增加了 host 和其他一些命令 (在同一個物理服務(wù)器可以同時跑很多服務(wù))
第四個版本 HTTP / 2.0
- 所以數(shù)據(jù)都是以二進制傳輸
- 同一個鏈接里面發(fā)送多個請求不在需要按照順序來
- 頭信息壓縮以及推送等提高效率的功能
- 1坯沪,弄清楚一個概念绿映,HTTP請求與TCP請求不是一個概念,在同一個TCP請求可以發(fā)送多個HTTP請求腐晾,以前的協(xié)議版本不能這么做叉弦,但是現(xiàn)在HTTP1.1.1里面可以這么做,而且在HTTP2里面是會更大的去優(yōu)化相關(guān)的一些東西藻糖,來提高HTTP傳輸效率以及服務(wù)器的性能淹冰。
- 2,這邊TCP連接對應(yīng)多個HTTP請求巨柒,而一個HTTP請求肯定在某一個TCP連接里面去定義發(fā)送的樱拴。
HTTP三次握手
為了防止服務(wù)端開始無用的鏈接,網(wǎng)絡(luò)傳輸是有延時的洋满,傳輸過程中防止丟包晶乔,造成重復(fù)創(chuàng)建鏈接,資源浪費牺勾,所以設(shè)置三次握手正罢。為了規(guī)避網(wǎng)絡(luò)傳輸延時。
1.客戶端發(fā)起一個我要連接的數(shù)據(jù)包請求給服務(wù)器驻民,里面會有一個SYN的標志位翻具,標志這是一個創(chuàng)建請求的數(shù)據(jù)包
2.服務(wù)端接收到數(shù)據(jù)包后知道有一個客戶要和它建立鏈接了,然后會開啟一個TCP socket 端口回还,開啟之后返回數(shù)據(jù)給客戶端裆泳,數(shù)據(jù)包含 SYN標志位,ACK= X+1懦趋,Seq=Y
3.客戶端拿到數(shù)據(jù)包后意味著服務(wù)器端允許創(chuàng)建TCP連接晾虑,然后發(fā)送數(shù)據(jù)包 ACK = Y+1,Seq=Z
http只有請求和響應(yīng)這個概念仅叫,沒有鏈接這個概念
在http1.0的時候帜篇,在http request的時候,在里面發(fā)起三次握手诫咱,創(chuàng)建TCP鏈接笙隙,然后再發(fā)起請求,請求結(jié)束后則關(guān)閉TCP鏈接
在http1.1的時候坎缭,可以通過申明這個鏈接竟痰,可以保持在那里签钩,后面就不需要三次握手開銷
在http2.0可以請求并發(fā),只需要一個TCP鏈接
第一次握手坏快,用戶向服務(wù)端發(fā)送請求铅檩,SYN=標志位=創(chuàng)建請求的數(shù)據(jù)包,Seq=X為數(shù)字,一般為1莽鸿。
第二次握手昧旨,服務(wù)端返回請求
第三次握手,客戶端再次傳回服務(wù)端
URI,URL和URN
- URI:統(tǒng)一資源標志符,用來標識互聯(lián)網(wǎng)上的信息資源祥得,包括URL和URN
- URL:統(tǒng)一資源定位器
- URN:永久統(tǒng)一資源定位符兔沃,在資源移動后還能被找到
urn作用在于搬動了資源后仍然可以直接找到,相當于面向?qū)ο竺?br> 框架一般都會出現(xiàn)這個概念级及,方便多次調(diào)用的東西都可以理解為urn乒疏,-。
個人理解
完整的URL地址:http://user:pass@host.com:80/path?query=string#hash
- http:// 協(xié)議
- user:pass@ 代表訪問資源的身份使用用戶名和密碼
- host.com 用來定位資源的服務(wù)器在互聯(lián)網(wǎng)中的位置(可以是IP 也可以是 域名)
- :80 端口饮焦,每臺物理服務(wù)器可以跑很多軟件的web服務(wù)怕吴,端口就是監(jiān)聽物理服務(wù)器上面某個具體的web服務(wù)
- /path 路由,web 服務(wù)器里面的內(nèi)容可以通過路由進行定位
- ?query=string 搜索參數(shù)
-
hash 查找文檔的某個片段
HTTP報文格式
HTTP方法
用來定義對于資源的操作
常用有GET追驴、POST
從定義上講有各自的語義
HTTP CODE
定義服務(wù)器對請求的處理結(jié)果
各個區(qū)間的CODE有各自的語義
好的HTTP服務(wù)可以通過CODE判斷結(jié)果
method :
GET:獲取數(shù)據(jù)
POST:創(chuàng)建數(shù)據(jù)
PUT:更新數(shù)據(jù)
DELETE : 刪除數(shù)據(jù)
- http方法:用來定義對于資源的操作
- http code :定義服務(wù)器對請求的處理結(jié)果
- 100-199代表操作要持續(xù)進行
- 200-299代表成功
- 300-399需要重定向
- 400-499代表請求有問題
- 500-599服務(wù)器錯誤
CORS跨域請求的限制和解決
- jsonp實現(xiàn)的原理:瀏覽器允許在某些標簽里面寫路徑加載械哟,是允許跨域的。
- JSONP是服務(wù)器與客戶端跨源通信的常用方法殿雪,它的基本思想是暇咆,網(wǎng)頁通過添加一個<script>元素,向服務(wù)器請求數(shù)據(jù)丙曙,這種做法不受同源政策限制(亦或者img/src等其他類似訪問link的標簽)爸业。
- 跨域概念:一般的,只要網(wǎng)站的 協(xié)議名protocol亏镰、 主機host扯旷、 端口號port 這三個中的任意一個不同,網(wǎng)站間的數(shù)據(jù)請求與傳輸便構(gòu)成了跨域調(diào)用索抓。而這是不允許的钧忽,想象一下假如允許的話,那么你登陸銀行網(wǎng)站逼肯,又不小心登陸了一個黑客網(wǎng)站耸黑,黑客網(wǎng)站就可以讀取銀行的cookie進而冒充客戶為所欲為。
- 跨域原理:請求發(fā)送成功篮幢,服務(wù)器也接受到了大刊,內(nèi)容也已經(jīng)返回了,但瀏覽器在解析了返回的內(nèi)容之后三椿,發(fā)現(xiàn)這是不允許的缺菌,所以攔截掉了內(nèi)容葫辐。
- 瀏覽器如果接收到的服務(wù)器返回的響應(yīng)頭中包含 Access-Control-Allow-Origin 則視為允許跨域,該屬性設(shè)置為 * 則允許所有網(wǎng)站跨域伴郁,但是并不安全耿战,所以我們往往設(shè)置為我們允許的網(wǎng)站(類似白名單的作用),如截圖中僅允許 http://127.0.0.1:8888 的請求跨域訪問蛾绎。但該值僅允許設(shè)置為一個昆箕,如果需要設(shè)置多個鸦列,常用做法是在代碼中進行判斷租冠,動態(tài)設(shè)置該值即可。
- 跨域原理:請求發(fā)送成功薯嗤,服務(wù)器也接受到了顽爹,內(nèi)容也已經(jīng)返回了,瀏覽器在解析了返回的內(nèi)容之后骆姐,發(fā)現(xiàn)這是不允許的镜粤,所以攔截掉了內(nèi)容,并在命令行報錯玻褪,其實是瀏覽器提供的功能,如果在curl里面是沒有跨域概念的肉渴。
- 1,通過 Access-Control-Allow-Origin 響應(yīng)頭 來實現(xiàn)跨域請求
- 2带射,通過JSONP來實現(xiàn)跨域請求
CORS跨域請求的限制及預(yù)請求限制
在跨域的時候
1.默認允許的方法只有GET同规、HEAD、POST 窟社,其余 PUT 券勺、DELETE 都是默認不允許的,瀏覽器會預(yù)請求去驗證的灿里。
2.默認允許的 Content-Type 有 text/plain关炼、multipart/form-data、application/x-www-form-urlencoded 其余Content-Type 都需要 預(yù)請求驗證
3.其他限制:請求頭限制匣吊、XMLHttpRequestUpload 對象均沒有注冊任何事件監(jiān)聽器儒拂、請求中沒有使用 ReadableStream 對象
Cache-Control的含義和使用
客戶端從服務(wù)器請求數(shù)據(jù)經(jīng)歷如下基本步驟:
1、如果請求命中本地緩存則從本地緩存中獲取一個對應(yīng)資源的"copy"色鸳;
2社痛、檢查這個"copy"是否fresh,是則直接返回,否則繼續(xù)向服務(wù)器轉(zhuǎn)發(fā)請求缕碎。
3褥影、服務(wù)器接收到請求,然后判斷資源是否變更咏雌,是則返回新內(nèi)容凡怎,否則返回304校焦,未變更。
4统倒、客戶端更新本地緩存寨典。
no-cache的作用是:強制客戶端跳過步驟2,直接向服務(wù)器發(fā)送請求房匆。也就是說每次請求都必須向服務(wù)器發(fā)送耸成。
must-revalidate:作用與no-cache相同,但更嚴格浴鸿,強制意味更明顯井氢。但這只是理論上的描述,根據(jù)我在ff6上的測試岳链,它幾乎不起作用:只要請求的頻率加快到一定程度花竞,服務(wù)器就接收不到請求。
no-store:緩存將不存儲response,包括header和body掸哑。測試結(jié)果表明约急,除每次請求都必發(fā)送到服務(wù)器外,響應(yīng)代碼均是200苗分,且request并沒有發(fā)送"If-Modified-Since"和"If-None-Match"頭厌蔽,這意味著緩存的確沒有存儲response。
以上三者都是要求客戶端每次請求都必須到服務(wù)器進行revalidate摔癣,此功能還可以通過max-age實現(xiàn): Cache-Control:max-age=100
有max-age奴饮,服務(wù)端內(nèi)容更新后,希望客戶端能獲取新的靜態(tài)資源
解決:加上hash碼供填,內(nèi)容不變拐云,hash碼不變,內(nèi)容變了近她,hash碼變了叉瘩,請求的url變化,就可以獲取更新的文件
重新驗證:
must-revalidate:緩存過期后粘捎,必須去原服務(wù)端發(fā)送這個請求薇缅,重新獲取這部分數(shù)據(jù),驗證是否真的過期
procy-revalidate:和上面的差不多攒磨,用在緩存服務(wù)器
其他:
no-store: 不能緩存泳桦,只能每次從服務(wù)器拿
no-transform:不壓縮、轉(zhuǎn)換返回內(nèi)容
這些聲明都沒有強制效應(yīng)
可緩存性:
public:http返回的內(nèi)容經(jīng)過的任何路徑都可以對返回內(nèi)容進行緩存
private:發(fā)起請求的瀏覽器才可以緩存
no-cache:可以在發(fā)起端進行緩存娩缰,要服務(wù)器驗證才可以使用緩存
到期:
max-age=seconds 到期多少秒灸撰,再次請求
s-maxage=seconds 代替max-age 在代理服務(wù)器內(nèi)生效
max-stale=seconds 返回的資源有這個屬性,即便緩存已經(jīng)過期,在這個時間內(nèi)還可以繼續(xù)使用已經(jīng)過期的緩存
靜態(tài)資源解決方案:把實際打包完成的js文件上的文件名上加上一串hash碼浮毯,如果內(nèi)容沒有變化完疫,hash碼不會變化,如果內(nèi)容有變化,則hash碼也會變化。這樣可以達到更新緩存的目的
no-cache:本地可以用使用緩存说搅,但需要服務(wù)器驗證后才能使用
no-store:本地和代理服務(wù)器都不能存儲緩存,都需要從服務(wù)器端重新請求
no-transform:告訴代理服務(wù)器不能隨便改變返回的內(nèi)容
must-revalidate:當緩存到期后串述,不能直接使用本地緩存數(shù)據(jù)而需要重新驗證
proxy-revalidate:緩存服務(wù)器上,必須去原服務(wù)器重新請求一遍,不能使用本地緩存
到期:
max-age=<seconds> 服務(wù)器緩存到期時間
s-maxage=<seconds> 代理服務(wù)器緩存的到期時間
max-stale=<seconds> 到期后,即便緩存過期锹淌,只要在max-stale時間內(nèi),依然有緩存
其他
1莉掂,no-store 本地和代理服務(wù)器都不可以存緩存
2葛圃,no-transform 代理服務(wù)器不要去改動返回內(nèi)容
no-store(本地和代理服務(wù)器都不可以緩存),no-transform(主要用在代理服務(wù)器憎妙,不允許改動服務(wù)器返回的內(nèi)容)
可緩存性,因為數(shù)據(jù)傳輸過程中可能存在多個代理服務(wù)器曲楚,則數(shù)據(jù)緩存中的public表示路徑上所有(包括代理服務(wù)器)都可以對數(shù)據(jù)進行緩存厘唾;而private則代表只有發(fā)起請求的瀏覽器才能進行緩存;no-cache表任何不能緩存
Cache-Control是客戶端的緩存龙誊。雖然服務(wù)端的文件變了但是url沒有變抚垃,所以客戶端依舊使用緩存的文件。前端常見的解決策略是趟大,生成文件的hash碼鹤树。
緩存頭Cache-Control:
一、可緩存性(哪些地方可以緩存):public(任何地方都可以)逊朽, private(發(fā)起請求的瀏覽器可以進行緩存), no-cache(任何地方都不可以)
二:時間限制:max-age = <seconds>, s-max-age = <seconds>(專用在代理服務(wù)器中)罕伯,max-stale = <seconds>(發(fā)起請求端設(shè)置的)
三:重新驗證:must-revalidate(時間過期必須去原服務(wù)端重新獲取數(shù)據(jù)),proxy-revalidate(和must-revalidate類似,用于緩存服務(wù)器中)
緩存驗證Last-Modified和Etag的使用
- 設(shè)置了etag叽讳、last-modified后追他,瀏覽器在第二次發(fā)起請求后就會把if-none-match和if-modified-since帶上
HTTP驗證頭:
1,Last-Modified 上次修改時間
配合If-Modified-Since使用
對比上次修改時間以驗證資源是否需要更新
2岛蚤,Etag
數(shù)據(jù)簽名邑狸,對響應(yīng)內(nèi)容產(chǎn)生一個唯一的字符串。
配合If-Non-Match使用
對比資源的簽名判斷是否使用緩存
304 :
如果客戶端發(fā)送了一個帶條件的GET 請求且該請求已被允許涤妒,而文檔的內(nèi)容(自上次訪問以來或者根據(jù)請求的條件)并沒有改變单雾,則服務(wù)器應(yīng)當返回這個304狀態(tài)碼。簡單的表達就是:客戶端已經(jīng)執(zhí)行了GET,但文件未變化硅堆。
[站外圖片上傳中...(image-69e60e-1537155939039)]etag,數(shù)據(jù)簽名.數(shù)據(jù)修改蜂奸,資源的數(shù)據(jù)簽名就會修改.例如hash兩個屬性:if-match,if-non-match里面放的etag值,對比服務(wù)端和客戶端判斷是否使用緩存
Cache-control:nocache 可以在發(fā)起端緩存但要在服務(wù)端進行驗證是否可以緩存;last-modified:上次修改時間;if-modified-since,in-unmodified-since:服務(wù)器讀取這兩個值硬萍,看資源是否重新修改扩所,服務(wù)器告訴客戶端是否可以用緩存的資源
Cache-Control: nocache,每次瀏覽器發(fā)起對一個已經(jīng)設(shè)置了Cache-Control資源的請求時,都會要到服務(wù)器端進行資源的驗證朴乖。驗證之后確定資源可以使用緩存祖屏,確定該資源可以使用緩存,才會讀取本地緩存
cookie
domain
訪問域設(shè)定
cookie只能一個域訪問
a.com的cookie b.com不能訪問
domain讓a.test.com能訪問test.com的cookie
不能跨域設(shè)置cookie买羞,只能一級通過domain設(shè)置二級等
max-age:有效期多長
expires:到期的具體時間
服務(wù)端返回數(shù)據(jù)時通過set-Cookie設(shè)置到瀏覽器內(nèi)袁勺,瀏覽器保存cookie后,在同域的訪問內(nèi)下次請求會自動帶上
max-age 和 expires 設(shè)置過期時間
Secure 只在https的時候發(fā)送
httpOnly無法通過js訪問,瀏覽器中還是有的畜普。
cookie時效
如果沒有設(shè)置時間期丰,瀏覽器關(guān)閉失效。
'Set-cookie': ['id=123; max-age=30', 'name=lin'] : id=123->30s后失效
設(shè)置test.com以及test.com的所有二級域名享受到cookie
HTTP長連接
Connection:keep-alive(長)吃挑、close(短)
http2:信道復(fù)用 tcp并發(fā)發(fā)送http請求
http請求是在tcp上發(fā)送的钝荡,一個tcp可以發(fā)送多個http,http1.1是阻塞的
現(xiàn)在保持長鏈接比較多
應(yīng)為多次建立tcp鏈接可能比長鏈接的開銷更大
長鏈接可以設(shè)置timeout
同個tcp內(nèi)是有先后順序的
瀏覽器可以并發(fā)6個tcp
session
用cookie保存sesion將用戶登陸key保存到cookie舶衬,每次用戶請求時讀取cookie值埠通,定位用戶信息
session:定位到用戶
數(shù)據(jù)協(xié)商
服務(wù)端返回
X-Content-Type-Options : nosniff
服務(wù)端不接受contnettype的數(shù)據(jù)類型或沒設(shè)置type,不主動預(yù)測類型
瀏覽器端會自動加上逛犹,也可以在ajax時設(shè)置
Accept:瀏覽器能展示的數(shù)據(jù)格式
Accept-Encoding:能接受的數(shù)據(jù)壓縮格式
Accept-Language:希望接受的語言
User-Agent:系統(tǒng)名 內(nèi)核 瀏覽器版本
數(shù)據(jù)協(xié)商:
根據(jù)客戶端發(fā)來的要求端辱,服務(wù)端返回對應(yīng)的數(shù)據(jù)
Accept 屬性
Accept(什么數(shù)據(jù)類型) Accept-Encoding(編碼方式,壓縮) Accept-Language(使用的語言) User-Agent(處于哪種系統(tǒng)環(huán)境)
Content屬性
Content-Type Content-Encoding Content-Language
redirect
通過url去訪問資源虽画,資源不在原來的位置舞蔽,服務(wù)器要告訴瀏覽器,請求的資源在哪里码撰,瀏覽器再重新請求
Lacation:新url
302:臨時跳轉(zhuǎn) 每一次都要通過服務(wù)器跳轉(zhuǎn)
301:永久跳轉(zhuǎn) 第二次訪問后渗柿,就不需要再通過服務(wù)器去跳轉(zhuǎn),是通過瀏覽器跳轉(zhuǎn)的灸拍,被緩存了新url