3月25日 周一 HTTP緩存
·加速資源
更好地利用緩存資源椅贱,可以提高網(wǎng)站的性能和響應(yīng)速度懂算。為了優(yōu)化緩存,過(guò)期時(shí)間設(shè)置得盡量長(zhǎng)是一種很好的策略庇麦。對(duì)于定期或者頻繁更新的資源计技,這么做是比較穩(wěn)妥的,但對(duì)于那些長(zhǎng)期不更新的資源會(huì)有點(diǎn)問(wèn)題山橄。這些固定的資源在一定時(shí)間內(nèi)受益于這種長(zhǎng)期保存的緩存策略酸役,但一要更新就會(huì)很困難,特指網(wǎng)頁(yè)上引入的一些js/css文件驾胆,當(dāng)它們變動(dòng)時(shí)需要盡快更新線上資源。
revving技術(shù):不頻繁更新的文件會(huì)使用特定的命名方式:在URL后(通常是文件名后)加上版本號(hào)贱呐。加上版本號(hào)后的資源就被視作一個(gè)完全新的獨(dú)立資源丧诺,同時(shí)擁有一年甚至更長(zhǎng)的緩存過(guò)期時(shí)長(zhǎng)。弊端:所有引用這個(gè)資源的地方都需要更新鏈接奄薇。web開(kāi)發(fā)者通常會(huì)采用自動(dòng)化構(gòu)建工具在實(shí)際工作中完成這些瑣碎的工作驳阎。當(dāng)?shù)皖l更新的資源(js/css)變動(dòng)了,只用在高頻變動(dòng)的資源文件(html)里做入口的改動(dòng)馁蒂。好處:同時(shí)更新兩個(gè)緩存資源不會(huì)造成部分緩存先更新而引起新舊文件內(nèi)容不一致呵晚。對(duì)于互相有依賴關(guān)系的css和js文件,避免這種不一致性是非常重要的沫屡。
·緩存驗(yàn)證
觸發(fā)緩存驗(yàn)證:用戶點(diǎn)擊刷新按鈕時(shí)饵隙;緩存的響應(yīng)頭信息里含有“Cache-control:must-revalidate”的定義;在瀏覽器偏好設(shè)置里設(shè)置Advanced->Cache為強(qiáng)制緩存驗(yàn)證沮脖。
在緩存的文檔過(guò)期后金矛,需要進(jìn)行緩存驗(yàn)證或者重新獲取資源芯急。只有在服務(wù)器返回強(qiáng)校驗(yàn)器或者弱校驗(yàn)器時(shí)才會(huì)進(jìn)行驗(yàn)證。
RTags:
緩存的一種強(qiáng)校驗(yàn)器驶俊,響應(yīng)頭是一個(gè)對(duì)用戶代理(User Agent)不透明的值娶耍。對(duì)于像瀏覽器這樣的HTTP UA,不知道ETag代表什么饼酿,不能預(yù)測(cè)它的值是多少榕酒。如果資源請(qǐng)求的響應(yīng)頭里含有ETag违诗,客戶端可以在后續(xù)的請(qǐng)求的頭上帶上If-None-Match來(lái)驗(yàn)證緩存烈涮。
Last-Modified響應(yīng)頭可以作為一種弱校驗(yàn)器。弱:只能精確到一秒账磺。如果響應(yīng)頭里含有這個(gè)信息购披,客戶端可以在后續(xù)的請(qǐng)求頭上帶上If-Modified-Since來(lái)驗(yàn)證緩存杖挣。
當(dāng)向服務(wù)端發(fā)起緩存校驗(yàn)的請(qǐng)求時(shí),服務(wù)端后返回200 ok表示返回正常的結(jié)果或者304 Not Modified(不返回body)表示瀏覽器可以使用本地緩存文件刚陡。304響應(yīng)頭也可以同時(shí)更新緩存文件的過(guò)期時(shí)間惩妇。
3月26日 周二 HTTP緩存、HTTP cookies
·帶Vary的響應(yīng)
Vary HTTP響應(yīng)頭決定了對(duì)于后續(xù)的請(qǐng)求頭筐乳,如何判斷是請(qǐng)求一個(gè)新的資源還是使用緩存的文件歌殃。
當(dāng)緩存服務(wù)器收到一個(gè)請(qǐng)求,只有當(dāng)前的請(qǐng)求和原始(緩存)的請(qǐng)求頭跟緩存的響應(yīng)頭里的Vary都匹配蝙云,才能使用緩存的響應(yīng)氓皱。
使用vary頭有利于內(nèi)容服務(wù)的動(dòng)態(tài)多樣性。
Vary: User-Agent
緩存服務(wù)器需要通過(guò)UA(用戶代理)判斷是否使用緩存的頁(yè)面勃刨。如果需要區(qū)分移動(dòng)端和桌面端的展示內(nèi)容波材,利用這種方式就能避免在不同的終端展示錯(cuò)誤的布局。并且可以幫助搜索引擎更好地發(fā)現(xiàn)頁(yè)面的移動(dòng)版本身隐。
·HTTP Cookie
又稱Web Cookie廷区、瀏覽器Cookie。是服務(wù)器發(fā)送到用戶瀏覽器并保存在本地的一小塊數(shù)據(jù)贾铝,它會(huì)在瀏覽器下次向同一服務(wù)器再發(fā)起請(qǐng)求時(shí)被攜帶并發(fā)送到服務(wù)器上隙轻。通常,它用于告知服務(wù)端兩個(gè)請(qǐng)求是否來(lái)自同一瀏覽器垢揩,如保持用戶的登錄狀態(tài)玖绿,Cookie使基于無(wú)狀態(tài)的HTTP協(xié)議記錄穩(wěn)定的狀態(tài)信息成為了可能。
Cookies主要的作用:
a.會(huì)話狀態(tài)管理(如用戶登錄狀態(tài)叁巨、購(gòu)物車斑匪、游戲分?jǐn)?shù)等其它需要記錄的信息)
b.個(gè)性化設(shè)置(如用戶自定義設(shè)置、主題等)
c.瀏覽器行為跟蹤(如跟蹤分析用戶行為)
為何Cookie不用戶客戶端數(shù)據(jù)存儲(chǔ)俘种?
因?yàn)榉?wù)器指定Cookie后秤标,瀏覽器的每次請(qǐng)求都會(huì)攜帶Cookie數(shù)據(jù)绝淡,會(huì)帶來(lái)額外的性能開(kāi)銷(尤其是移動(dòng)環(huán)境下)。新的瀏覽器API已經(jīng)允許開(kāi)發(fā)者直接將數(shù)據(jù)存儲(chǔ)在本地苍姜。
·創(chuàng)建Cookie
當(dāng)服務(wù)器收到HTTP請(qǐng)求時(shí)牢酵,服務(wù)器可以在響應(yīng)頭里面添加一個(gè)Set-Cookie選項(xiàng)。瀏覽器收到響應(yīng)后通常會(huì)保存下Cookie衙猪,之后對(duì)該服務(wù)器每一次請(qǐng)求中都通過(guò)Cookie請(qǐng)求頭將Cookie信息發(fā)送給服務(wù)端馍乙。Cookie的過(guò)期時(shí)間、域垫释、路徑丝格、有效期、使用網(wǎng)站都可以指定棵譬。
Set-Cookie: <cookie名>=<cookie值> -------------服務(wù)器端Set-Cookie響應(yīng)頭部
·會(huì)話期Cookie
僅在會(huì)話期內(nèi)有效显蝌,瀏覽器關(guān)閉后它會(huì)自動(dòng)刪除。因此會(huì)話期它不需要指定過(guò)期時(shí)間(Expires)或有效期(Max-age)订咸。但是有些瀏覽器提供了會(huì)話恢復(fù)功能曼尊,即保存下會(huì)話期Cookie。
·持久性Cookie
可以指定一個(gè)Expires或Max-Age脏嚷。
Set-Cookie:id=<...>;Expires:<...> ————過(guò)期時(shí)間設(shè)定的日期和時(shí)間只與客戶端相關(guān)
·Cookie的Secure和HTTPOnly標(biāo)記
標(biāo)記為Secure的Cookie只應(yīng)通過(guò)被HTTP協(xié)議加密過(guò)的請(qǐng)求發(fā)送給服務(wù)端骆撇。但敏感信息不應(yīng)通過(guò)Cookie傳輸,Cookie有與其固有的不安全性父叙,如果包含服務(wù)端Session信息的Cookie不想被客戶端JS腳本調(diào)用神郊,就應(yīng)設(shè)置為HTTPOnly標(biāo)記。
·Cookie的作用域
作用域——即Cookie應(yīng)該發(fā)送給哪些URL趾唱。
Domain標(biāo)識(shí)指定了哪些主機(jī)可以接受Cookie涌乳。默認(rèn)為當(dāng)前文檔的主機(jī)(不包含子域名)。但指定了甜癞,則一般包含子域名爷怀。
Path標(biāo)識(shí)指定了主機(jī)下的哪些路徑可以接受Cookie(該URL路徑必須存在于請(qǐng)求URL中)。以“/”為路徑分隔符带欢,子路徑也會(huì)被匹配。
·JS通過(guò)Document.cookies訪問(wèn)Cookie
document.cookie="..."? ----------通過(guò)該屬性可創(chuàng)建新的Cookie烤惊,也可通過(guò)該屬性訪問(wèn)非HTTPOnly標(biāo)記的Cookie乔煞。
·安全
當(dāng)機(jī)器處于不安全環(huán)境時(shí),切記不能通過(guò)HTTP Cookie存儲(chǔ)柒室、傳輸敏感信息渡贾。
會(huì)話劫持和XSS:在Web應(yīng)用中,Cookie常用來(lái)標(biāo)記用戶和授權(quán)對(duì)話雄右。因此如果Web應(yīng)用的Cookie被竊取空骚,可能導(dǎo)致授權(quán)用戶的會(huì)話受到攻擊纺讲。常用的竊取Cookie方法有利用社會(huì)工程學(xué)攻擊和利用應(yīng)用程序漏洞進(jìn)行XSS攻擊。HTTPOnly類型的Cookie由于阻止了JS對(duì)其的訪問(wèn)性能而能在一定程度上緩解此類攻擊囤屹。
跨站請(qǐng)求偽造(CSRF):例如在不安全聊天室或論壇上的一張圖片熬甚,實(shí)際上是一個(gè)給你銀行服務(wù)器發(fā)送提現(xiàn)的請(qǐng)求。因?yàn)槿绻阒耙训顷懥算y行賬戶并且Cookie仍然有效(還沒(méi)有其他驗(yàn)證步驟)肋坚,錢就會(huì)被轉(zhuǎn)走乡括。阻止辦法:對(duì)用戶輸入進(jìn)行過(guò)濾、任何敏感操作都需要確認(rèn)智厌、用于敏感信息的Cookie只能擁有較短的生命周期等诲泌。
·追蹤和隱私
第三方Cookie:每個(gè)Cookie都有與之相關(guān)聯(lián)的域(Domain),如果Cookie的域和頁(yè)面的域相同铣鹏,那么我們稱這個(gè)Cookie為第一方Cookie(first-party cookie)敷扫,如果不同,則稱之為第三方Cookie(third-party cookie)诚卸。一個(gè)頁(yè)面包含圖片或存放在其他域上的資源(如圖片廣告)葵第,第一方的Cookie也只會(huì)發(fā)送給設(shè)置它們的服務(wù)器。通過(guò)第三方組件發(fā)送的第三方Cookie主要用于廣告和網(wǎng)絡(luò)追蹤惨险。
禁止追蹤:Do-Not-Track
僵尸Cookie:即刪不掉的Cookie羹幸,刪除后甚至?xí)詣?dòng)重建。
3月27日 周三 HTTP訪問(wèn)控制(CORS)
跨域資源共享(CORS)是一種機(jī)制辫愉,它使用額外的HTTP頭來(lái)告訴瀏覽器栅受,讓運(yùn)行在一個(gè)origin(domain)上的Web應(yīng)用被準(zhǔn)許訪問(wèn)來(lái)自不同源服務(wù)器上的指定的資源。當(dāng)一個(gè)資源從與該資源本身所在服務(wù)器不同的域恭朗、協(xié)議或端口請(qǐng)求一個(gè)資源時(shí)屏镊,資源會(huì)發(fā)起一個(gè)跨域HTTP請(qǐng)求。
·跨域共享標(biāo)準(zhǔn)允許下列場(chǎng)景中使用跨域HTTP請(qǐng)求:
a.由XMLHttpRequest或Fetch發(fā)起的跨域HTTP請(qǐng)求
b.Web字體(CSS中通過(guò)@font-face)
c.WebGL貼圖
d.使用drawImage將Images/video畫(huà)面繪制到canvas
e.樣式表(使用CSSOM)
·功能概述
跨域資源共享標(biāo)準(zhǔn)新增了一組HTTP首部字段痰腮,允許服務(wù)器聲明哪些源站通過(guò)瀏覽器有權(quán)限訪問(wèn)哪些資源而芥。規(guī)范要求,對(duì)那些可能對(duì)服務(wù)器數(shù)據(jù)類型產(chǎn)生副作用的HTTP請(qǐng)求方法(特別是GET以外的HTTP請(qǐng)求或者搭配某些MIME類型的POST請(qǐng)求)膀值,瀏覽器必須首先使用OPTIONS方法發(fā)起一個(gè)預(yù)檢請(qǐng)求棍丐,從而獲知服務(wù)端是否允許該跨域請(qǐng)求。服務(wù)器確認(rèn)允許之后沧踏,才發(fā)起實(shí)際的HTTP請(qǐng)求歌逢。在預(yù)檢請(qǐng)求返回中,服務(wù)端也可以通知客戶端翘狱,是否需要攜帶身份憑證(包括Cookies和HTTP認(rèn)證相關(guān)數(shù)據(jù))秘案。
3月28日 周四 HTTP訪問(wèn)控制(CORS)
·三個(gè)訪問(wèn)控制示例
(未記錄發(fā)送請(qǐng)求的條件)
1.簡(jiǎn)單請(qǐng)求
不會(huì)觸發(fā)CORS預(yù)檢請(qǐng)求的請(qǐng)求。(如使用了GET、HEAD阱高、POST方法赚导;請(qǐng)求中任意XMLHTTPRequestUpload對(duì)象均沒(méi)有注冊(cè)任何事件監(jiān)聽(tīng)器;XMLHTTPRequestUpload對(duì)象可以使用XMLHTTPRequest.upload屬性訪問(wèn)赤惊;請(qǐng)求中沒(méi)有ReadableStream對(duì)象...)
HTTP請(qǐng)求首部:Origin:<請(qǐng)求來(lái)源>
HTTP響應(yīng)首部:Access-Control-Allow_Origin: <該資源允許哪些外域訪問(wèn)>
2.預(yù)檢請(qǐng)求
需預(yù)檢的請(qǐng)求必須首先使用OPTIONS方法(HTTP/1.1 用以從服務(wù)器獲取更多信息吼旧,不會(huì)對(duì)服務(wù)器資源產(chǎn)生影響)發(fā)起一個(gè)預(yù)檢請(qǐng)求到服務(wù)器,以獲知服務(wù)器是否允許該實(shí)際請(qǐng)求荐捻。預(yù)檢請(qǐng)求的使用可以避免跨域請(qǐng)求對(duì)服務(wù)器用戶數(shù)據(jù)產(chǎn)生的未預(yù)期的影響黍少。(如請(qǐng)求包含自定義的請(qǐng)求首部字段;請(qǐng)求的Content-Type不屬于application/x-www-form-urlencoded处面、multipart/form-data厂置、text/plain...)
預(yù)檢請(qǐng)求:
//告知服務(wù)器實(shí)際請(qǐng)求將使用POST方法
Access-Control-Request-Method: POST?
//告知服務(wù)器實(shí)際請(qǐng)求將攜帶兩個(gè)自定義首部字段X-PINGOTHER, Content-Type,服務(wù)器據(jù)此決定魂角,該實(shí)際請(qǐng)求是否被允許
Access-Control-Request-Headers: X-PINGOTHER, Content-Type
預(yù)檢請(qǐng)求響應(yīng):
//服務(wù)器允許客戶端使用POST昵济,GET,OPTIONS方法發(fā)起請(qǐng)求野揪,該字段僅限于在需要訪問(wèn)控制中的場(chǎng)景中使用
Access-Control-Allow-Methods: POST, GET, OPTIONS
//服務(wù)器允許請(qǐng)求中攜帶字段...
Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
//該響應(yīng)的有效時(shí)間為86400秒(24小時(shí))访忿,在有效時(shí)間內(nèi),瀏覽器無(wú)須為同一請(qǐng)求再次發(fā)起預(yù)檢請(qǐng)求斯稳。瀏覽器自身維護(hù)了一個(gè)最大有效時(shí)間海铆,如果該首部字段的值超過(guò)了最大有效時(shí)間,將不會(huì)生效挣惰。
Access-Control-Max-Age: 86400
3.附帶身份憑證的請(qǐng)求
Fetch和CORS可以基于HTTP cookies和HTTP認(rèn)證信息發(fā)送身份憑證卧斟。
//實(shí)現(xiàn)向服務(wù)器發(fā)送Cookies。如果服務(wù)器端的響應(yīng)中未攜帶Access-Control-Allow-Credentials: true憎茂,瀏覽器將不會(huì)把響應(yīng)內(nèi)容返回給請(qǐng)求的發(fā)送者珍语。
invocation.withCredentials = true;?
?對(duì)于附帶身份憑證的請(qǐng)求,服務(wù)器不得設(shè)置Access-Control-Allow-Origin 的值為“*”(該資源可以被任意外域訪問(wèn))因?yàn)檎?qǐng)求的首部中攜帶了Cookie信息竖幔,如果設(shè)置了請(qǐng)求將會(huì)失敗板乙。
3月29日 周五 HTTP訪問(wèn)控制(CORS),HTTP的發(fā)展
HTTP響應(yīng)首部字段
origin參數(shù)的值指定了允許訪問(wèn)該資源的外域URI拳氢。對(duì)于不需要攜帶身份憑證的請(qǐng)求募逞,服務(wù)器可以指定該字段的值為通配符,表示允許來(lái)自所有域的請(qǐng)求馋评。如果服務(wù)端制定了具體的域名而非*凡辱,那么響應(yīng)首部中的Vary字段的值必須包括Origin,這將告訴客戶端:服務(wù)端對(duì)不同的源站返回不同的內(nèi)容栗恩。
Access-Control-Allow-Origin: <origin>|*
在跨域訪問(wèn)時(shí),XMLHTTPRequest對(duì)象的getResponseHeader()方法只能拿到一些最基本的響應(yīng)頭(Cache-Control、Content-Language磕秤、Content-Type乳乌、Expires、Last-Modified市咆、Pragma)汉操,如要訪問(wèn)其他頭,則需要服務(wù)器設(shè)置本響應(yīng)頭蒙兰。
Access-Control-Expose-Headers:<...>
指定了preflight(預(yù)檢)請(qǐng)求的結(jié)果能夠被緩存多久
Access-Control-Max-Age: <delta-seconds>
指定了當(dāng)瀏覽器的credentials設(shè)置為true時(shí)是否允許瀏覽器讀取response內(nèi)容磷瘤。當(dāng)用在對(duì)preflight請(qǐng)求的響應(yīng)中它指定了實(shí)際的請(qǐng)求是否可以使用credentials。
Access-Control-Allow-Credentials: true
用于預(yù)檢請(qǐng)求的響應(yīng)搜变,指明了實(shí)際請(qǐng)求所允許使用的HTTP方法
Access-Control-Allow-Methods: <method>[,<method>]*
用于預(yù)檢請(qǐng)求的響應(yīng)采缚,指明了實(shí)際請(qǐng)求中允許攜帶的首部字段
Access-Control-Allow-Headers: <field-name>[,<field-name]*
HTTP請(qǐng)求首部字段
預(yù)檢請(qǐng)求或?qū)嶋H請(qǐng)求的源站,參數(shù)為源站URI,不包含任何路徑信息挠他,只是服務(wù)器名稱
Origin:<origin>
用于預(yù)檢請(qǐng)求扳抽,將實(shí)際請(qǐng)求所使用的HTTP方法告訴服務(wù)器
Access-Control-Request-Method: <method>
用于預(yù)檢請(qǐng)求,將實(shí)際請(qǐng)求所攜帶的首部字段告訴服務(wù)器殖侵。
Access-Control-Request-Headers: <field-name>[,<field-name>]*
HTTP/2在HTTP/1.1幾處基本的不同
HTTP/2是二進(jìn)制協(xié)議而不是文本協(xié)議贸呢。不再可讀,也不可無(wú)障礙的手動(dòng)創(chuàng)建拢军,改善的優(yōu)化技術(shù)現(xiàn)在可被實(shí)施楞陷。
這是一個(gè)復(fù)用協(xié)議。并行的請(qǐng)求能在同一個(gè)鏈接在處理茉唉,移除了HTTP/1.x中順序和阻塞的約束固蛾。
壓縮了headers。因?yàn)閔eaders在一系列請(qǐng)求中常常是相似的赌渣,其移除了重復(fù)和傳輸重復(fù)數(shù)據(jù)的成本魏铅。
其允許服務(wù)器在客戶端緩存中填充數(shù)據(jù),通過(guò)一個(gè)叫服務(wù)器推送的機(jī)制來(lái)提前請(qǐng)求坚芜。
3月30日 周六 HTTP消息
HTTP消息是服務(wù)器和客戶端之間交換數(shù)據(jù)的方式览芳。有兩種類型的消息︰ 請(qǐng)求--由客戶端發(fā)送用來(lái)觸發(fā)一個(gè)服務(wù)器上的動(dòng)作;響應(yīng)--來(lái)自服務(wù)器的應(yīng)答鸿竖。
HTTP請(qǐng)求和響應(yīng)具有相似的結(jié)構(gòu):
起始行:描述要執(zhí)行的請(qǐng)求沧竟、對(duì)應(yīng)的狀態(tài)(成功或失敗)缚忧∥虮茫總是單行。
可選的HTTP頭集合:指明請(qǐng)求或描述消息正文闪水。
空行:指示所有關(guān)于請(qǐng)求的元數(shù)據(jù)已經(jīng)發(fā)送完畢糕非。
可選的包含請(qǐng)求相關(guān)數(shù)據(jù)的正文或響應(yīng)相關(guān)的文檔:正文的大小有起始行的HTTP頭來(lái)指定。
HTTP請(qǐng)求
起始行
a.一個(gè)HTTP方法:如GET/PUT/POST/HEAD/OPTIONS,描述要執(zhí)行的動(dòng)作朽肥。GET表示要獲取資源禁筏,POST表示向服務(wù)器推送數(shù)據(jù)。
b.請(qǐng)求目標(biāo):通常是一個(gè)URL或者是協(xié)議衡招、端口和域名的絕對(duì)路徑
c.HTTP版本
Headers
Body:不是所有請(qǐng)求都有一個(gè)body篱昔,例如獲取資源的請(qǐng)求GET,HEAD,DELETE,OPTIONS不需要,有些請(qǐng)求將數(shù)據(jù)發(fā)送到服務(wù)器以便更新數(shù)據(jù):常見(jiàn)POST請(qǐng)求(包含HTML表單數(shù)據(jù))始腾。
HTTP響應(yīng)
狀態(tài)行(起始行)
a.協(xié)議版本
b.狀態(tài)碼:常見(jiàn)200州刽,404,302
c.狀態(tài)文本:一個(gè)簡(jiǎn)短純粹的信息浪箭,通過(guò)狀態(tài)碼的文本描述幫助人們理解該HTTP信息穗椅。
Headers
Body:不是所有響應(yīng)都有body,如具有狀態(tài)碼的響應(yīng)山林,通常不會(huì)有body房待。
HTTP/2幀
HTTP/1.x報(bào)文性能缺陷:
a.Header不像body,不會(huì)被壓縮驼抹。
b.兩個(gè)報(bào)文之間的header通常非常相似桑孩,但它們?nèi)匀辉谶B接中重復(fù)傳輸。
c.無(wú)法復(fù)用框冀。當(dāng)在同一個(gè)服務(wù)器打開(kāi)幾個(gè)連接時(shí):TCP熱連接比冷連接更加有效流椒。
HTTP/2新的引入:
將HTTP/1.x消息分成幀并嵌入到流中。數(shù)據(jù)幀和報(bào)頭幀分離明也,從而允許報(bào)頭壓縮宣虾。將多個(gè)流組合,這是一個(gè)被稱為多路復(fù)用的過(guò)程温数,它允許更有效的底層TCP連接绣硝。
HTTP/2 幀機(jī)制是在 HTTP/1.x 語(yǔ)法和底層傳輸協(xié)議之間增加了一個(gè)新的中間層,而沒(méi)有從根本上修改它撑刺,即它是建立在經(jīng)過(guò)驗(yàn)證的機(jī)制之上鹉胖。
3月31日 周日 典型的HTTP會(huì)話
會(huì)話三階段(如HTTP此類CS協(xié)議)
客戶端建立一條TCP連接(如果傳輸層不是 TCP,也可以是其他適合的連接)够傍。
客戶端發(fā)送請(qǐng)求并等待應(yīng)答甫菠。
服務(wù)器處理請(qǐng)求并送回應(yīng)答,回應(yīng)包括一個(gè)狀態(tài)碼和對(duì)應(yīng)的數(shù)據(jù)冕屯。
從 HTTP/1.1 開(kāi)始寂诱,連接在完成第三階段后不再關(guān)閉,客戶端可以再次發(fā)起新的請(qǐng)求安聘。這意味著第二步和第三步可以連續(xù)進(jìn)行數(shù)次痰洒。
建立連接
連接由客戶端發(fā)起建立瓢棒,在HTTP中打開(kāi)連接意味著在底層傳輸層啟動(dòng)連接,通常是 TCP丘喻。
使用TCP時(shí)音羞,HTTP服務(wù)器默認(rèn)端口號(hào)是80。
?CS模型不允許服務(wù)器在沒(méi)有顯示請(qǐng)求時(shí)發(fā)送數(shù)據(jù)給客戶端仓犬,為了解決這一問(wèn)題,有若干技術(shù):例如舍肠,使用XMLHTTPRequest 或 Fetch API 周期性地請(qǐng)求服務(wù)器搀继,使用HTML WebSockets API等。
發(fā)送客戶端請(qǐng)求
a.請(qǐng)求方法及請(qǐng)求參數(shù)
b.HTTP首部翠语,為服務(wù)器提供關(guān)于所需數(shù)據(jù)的信息叽躯,或是一些改變請(qǐng)求行為的數(shù)據(jù)(如當(dāng)數(shù)據(jù)已經(jīng)被緩存,就不再應(yīng)答)肌括。以空行結(jié)束点骑。
c.可選數(shù)據(jù)塊,主要被POST方法使用
服務(wù)器響應(yīng)結(jié)構(gòu)
a.狀態(tài)行
b.HTTP首部谍夭,為客戶端提供關(guān)于所發(fā)送數(shù)據(jù)的一些信息(如類型黑滴,數(shù)據(jù)大小,使用的壓縮算法紧索,緩存指示)袁辈。以空行結(jié)束。
c.數(shù)據(jù)塊珠漂,包含了相應(yīng)的數(shù)據(jù)(如果有的話)晚缩。
響應(yīng)狀態(tài)碼
200:OK
301:Moved Permanently,請(qǐng)求資源的URI已被改變媳危。
404:Not Found
?URL:Uniform/Universal Resource Locator 荞彼,統(tǒng)一資源定位符,子類待笑。
? ? URI:Uniform Resource Identifier 的縮寫(xiě)鸣皂,統(tǒng)一資源標(biāo)識(shí)符,代表一種標(biāo)準(zhǔn),父類。
二者的區(qū)別在于滋觉,URI 表示請(qǐng)求服務(wù)器的路徑签夭,定義這么一個(gè)資源。而 URL 同時(shí)說(shuō)明要如何訪問(wèn)這個(gè)資源椎侠。