TCP/HTTP協(xié)議

HTTP 發(fā)展史

http1.0中飞袋,每請求一個http請求都需要建立一次tcp連接怯疤,而tcp的三次握手四次揮手相對比較耗時讹语,且會帶來1.5+2=3.5個RTT

因此在http1.1中售担,引入了長鏈接的概念,當(dāng)在請求頭部設(shè)置了Connection:keep-alive時辫愉,表示一個http請求完成不會斷開連接栅受,而是接著發(fā)送下一下http連接,然而http請求是按照順序請求的,如果一個http延遲了屏镊,隊列后面的所有請求都會延遲依疼,這就是隊頭阻塞問題斩披。http1.1同時規(guī)定一個域名同時可以有6個tcp連接崇棠,這6個tcp連接中的http請求是可以并行的,但是每個tcp是一個慢啟動的過程,tcp發(fā)送數(shù)據(jù)的過程類似于地鐵啟動,比較耗時(慢啟動是tcp為了減少網(wǎng)絡(luò)擁塞的一種策略)蔚出,并且6個tcp連接直接會對帶寬進(jìn)行競爭,導(dǎo)致tcp會動態(tài)的減慢接收數(shù)據(jù)的速度虫腋,而不會管資源是否是關(guān)鍵資源骄酗。并且http1.1還支持了虛擬主機(jī)(Host字段)和客戶端Cookie,虛擬主機(jī)有不同的域名悦冀,但只想同一個Ip地址趋翻,這樣瀏覽器和同一個服務(wù)器就不止可以有6個tcp連接了。

因此在http2.0中盒蟆,引入了多路復(fù)用踏烙,只需要一個tcp連接,多路復(fù)用解決了隊頭阻塞和多個tcp的慢啟動以及競爭問題历等。多路復(fù)用的實現(xiàn)是:在網(wǎng)絡(luò)層級中增加了二進(jìn)制分幀層讨惩,不同的請求包會被加上編號,同時可以發(fā)送不同請求的包寒屯,客戶端和服務(wù)端會根據(jù)編號來拼湊出一個完整的包荐捻。并且http2.0中支持給請求設(shè)置優(yōu)先級(這樣服務(wù)器就會優(yōu)先處理這些請求并返回)、服務(wù)器推送(服務(wù)器在接收到html請求后寡夹,會附帶將html中引用的js燈發(fā)送給瀏覽器)和頭部壓縮功能处面。但是http2.0依然是基于tcp協(xié)議的,tcp依然存在數(shù)據(jù)包級別的隊頭阻塞問題菩掏,即在數(shù)據(jù)傳輸?shù)倪^程中如果丟包了魂角,那么整個tcp連接會處于一個暫停狀態(tài),等待數(shù)據(jù)包的重傳智绸,這是tcp只所以是可靠協(xié)議的原因野揪。

HTTP 方法
  • head:請求資源的頭部信息,可以在下載一個大文件前先獲取其大小在決定是否要下載以節(jié)約帶寬传于。
  • patch:用于對資源進(jìn)行部分修改囱挑。
  • get
  • post
  • put
  • delete
如何保證頁面文件能被完整地送達(dá)瀏覽器呢?
  • 互聯(lián)網(wǎng)中的數(shù)據(jù)是通過數(shù)據(jù)包來傳輸?shù)恼恿铮瑪?shù)據(jù)包在傳輸過程中容易丟失或出錯平挑。
  • IP 負(fù)責(zé)把數(shù)據(jù)包送達(dá)目的主機(jī)。
  • UDP 負(fù)責(zé)把數(shù)據(jù)包送達(dá)具體應(yīng)用。
  • TCP 保證了數(shù)據(jù)完整地傳輸通熄,它的連接可分為三個階段:建立連接唆涝、傳輸數(shù)據(jù)和斷開連接。

HTTP是基于TCP的協(xié)議唇辨,因此建立HTTP連接的第一步是建立TCP連接廊酣,而建立TCP連接的第一步是獲取ip和port,所以第一步就是dns解析赏枚,根據(jù)域名拿到ip和port亡驰。然而,同一個域名下饿幅,最多只可以建立6個TCP連接(HTTP1.1凡辱,而http2同個域名只能維持一個長連接。)栗恩。所以拿到ip和Port后并不是直接連接連接透乾。域名也會有重定向的問題,如果瀏覽器返回相應(yīng)報文中磕秤,狀態(tài)碼是301或302乳乌,并有一個Location字段,表示該域名需要重定向到另一個地址市咆,該操作是服務(wù)器設(shè)置的汉操。

Content-Type 是 HTTP 頭中一個非常重要的字段, 它告訴瀏覽器服務(wù)器返回的響應(yīng)體數(shù)據(jù)是什么類型

HTTP是一個無狀態(tài)協(xié)議床绪,那么登錄狀態(tài)是如何保持的客情?

cookie方式

  • 瀏覽器發(fā)送用戶信息到服務(wù)器
  • 服務(wù)器校驗用戶合法后,生成一段表示用戶的字符串癞己,并寫入到響應(yīng)頭的Set-Cookie字段中
  • 瀏覽器解析響應(yīng)頭膀斋,將cookie信息保存到本地
  • 當(dāng)瀏覽器再次發(fā)送請求時,會讀取本地存儲的cookie中痹雅,并將其寫入請求頭的Cookie字段中
  • 服務(wù)器收到請求后仰担,解析請求頭,獲取Cookie字段中的信息绩社,然后查詢后臺摔蓝,判斷該用戶為已登錄狀態(tài),然后返回對應(yīng)數(shù)據(jù)
    token方式
  • 前端發(fā)送用戶信息到服務(wù)器
  • 服務(wù)器校驗用戶合法后愉耙,會根據(jù)密鑰贮尉、過期時間和一些加密算法生成token
  • 前端將token保存下來
  • 當(dāng)前端再次發(fā)送請求時,會攜帶上token值
  • 服務(wù)器收到請求后朴沿,若還有有效期則返回數(shù)據(jù)猜谚,若過期會返回響應(yīng)狀態(tài)碼败砂,前端根據(jù)狀態(tài)碼做一些處理,如跳轉(zhuǎn)到登錄頁魏铅,要求用戶重新登錄

瀏覽器的URL導(dǎo)航流程昌犹?
渲染流程?

JavaScript -> Style -> Layout(布局览芳,回流) -> Paint(繪制) -> Composite(合成)

當(dāng)從服務(wù)器接收HTML頁面的第一批數(shù)據(jù)時斜姥,DOM解析器就開始工作了,在解析過程中沧竟,如果遇到了JS腳本铸敏,如下所示:

<html>
    <body>
        極客時間
        <script>
        document.write("--foo")
        </script>
    </body>
</html>

那么DOM解析器會先執(zhí)行JavaScript腳本,執(zhí)行完成之后屯仗,再繼續(xù)往下解析搞坝。

那么第二種情況復(fù)雜點(diǎn)了,我們內(nèi)聯(lián)的腳本替換成js外部文件魁袜,如下所示:

<html>
    <body>
        極客時間
        <script type="text/javascript" src="foo.js"></script>
    </body>
</html>

這種情況下,當(dāng)解析到JavaScript的時候敦第,會先暫停DOM解析峰弹,并下載foo.js文件,下載完成之后執(zhí)行該段JS文件芜果,然后再繼續(xù)往下解析DOM鞠呈。這就是JavaScript文件為什么會阻塞DOM渲染。

我們再看第三種情況右钾,還是看下面代碼:

<html>
    <head>
        <style type="text/css" src = "theme.css" />
    </head>
    <body>
        <p>極客時間</p>
        <script>
            let e = document.getElementsByTagName('p')[0]
            e.style.color = 'blue'
        </script>
    </body>
</html>

當(dāng)我在JavaScript中訪問了某個元素的樣式蚁吝,那么這時候就需要等待這個樣式被下載完成才能繼續(xù)往下執(zhí)行,所以在這種情況下舀射,CSS也會阻塞DOM的解析窘茁。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脆烟,隨后出現(xiàn)的幾起案子山林,更是在濱河造成了極大的恐慌,老刑警劉巖邢羔,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驼抹,死亡現(xiàn)場離奇詭異,居然都是意外死亡拜鹤,警方通過查閱死者的電腦和手機(jī)框冀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敏簿,“玉大人明也,你說我怎么就攤上這事。” “怎么了诡右?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵安岂,是天一觀的道長。 經(jīng)常有香客問我帆吻,道長域那,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任猜煮,我火速辦了婚禮次员,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘王带。我一直安慰自己淑蔚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布愕撰。 她就那樣靜靜地躺著刹衫,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搞挣。 梳的紋絲不亂的頭發(fā)上带迟,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音囱桨,去河邊找鬼仓犬。 笑死,一個胖子當(dāng)著我的面吹牛舍肠,可吹牛的內(nèi)容都是我干的搀继。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼翠语,長吁一口氣:“原來是場噩夢啊……” “哼叽躯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啡专,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤险毁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后们童,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畔况,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年慧库,在試婚紗的時候發(fā)現(xiàn)自己被綠了跷跪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡齐板,死狀恐怖吵瞻,靈堂內(nèi)的尸體忽然破棺而出葛菇,到底是詐尸還是另有隱情,我是刑警寧澤橡羞,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布眯停,位于F島的核電站,受9級特大地震影響卿泽,放射性物質(zhì)發(fā)生泄漏莺债。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一签夭、第九天 我趴在偏房一處隱蔽的房頂上張望齐邦。 院中可真熱鬧,春花似錦第租、人聲如沸措拇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丐吓。三九已至,卻和暖如春趟据,著一層夾襖步出監(jiān)牢的瞬間汰蜘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工之宿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人苛坚。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓比被,卻偏偏與公主長得像,于是被迫代替她去往敵國和親泼舱。 傳聞我的和親對象是個殘疾皇子等缀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容