<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          http長(zhǎng)連接和短連接機(jī)制

          共 2199字,需瀏覽 5分鐘

           ·

          2021-04-22 17:10


          點(diǎn)擊上方藍(lán)色“邁莫coding”,選擇“設(shè)為星標(biāo)”


           

          今天咱們聊一聊http的連接機(jī)制【長(zhǎng)連接、短連接】。為什么在http1.0后支持長(zhǎng)連接機(jī)制,它究竟解決了什么困惑?它又帶來(lái)了什么問(wèn)題?又是通過(guò)什么方式解決的?通過(guò)這篇文章,這些疑惑通通消滅掉~~~


          計(jì)網(wǎng)以往文章

           

           


          短連接

           

          客戶(hù)端與服務(wù)端進(jìn)行交互時(shí),首先會(huì)進(jìn)行tcp三次握手建立通信連接,建立成功后才會(huì)進(jìn)行數(shù)據(jù)傳輸。當(dāng)服務(wù)端返回響應(yīng)報(bào)文后會(huì)斷開(kāi)連接,這種連接方式被稱(chēng)為短連接。

           

          短連接也可以理解為每次進(jìn)行http請(qǐng)求時(shí)都會(huì)創(chuàng)建tcp連接,傳輸完成后斷開(kāi)連接。但短連接沒(méi)有弊端嗎?

           

          舉個(gè)例子,現(xiàn)在要加載某個(gè)網(wǎng)站,網(wǎng)站需要加載js、css、html、數(shù)據(jù)請(qǐng)求等等,會(huì)向服務(wù)端發(fā)送多個(gè)http請(qǐng)求,此時(shí)如果使用短連接的話,每個(gè)請(qǐng)求都會(huì)重復(fù)建立三次握手、四次揮手,加載時(shí)間大大延遲,影響性能。為了改進(jìn)這一缺點(diǎn),引進(jìn)了"長(zhǎng)連接"特性。

           

          下圖就是以短連接方式進(jìn)行http請(qǐng)求,從圖中可以看出,每次http請(qǐng)求都會(huì)建立tcp三次握手,服務(wù)端響應(yīng)后進(jìn)行tcp四次揮手?jǐn)嚅_(kāi)連接。

           


          長(zhǎng)連接

           

          http針對(duì)短連接暴露出來(lái)的問(wèn)題,提出了一種解決方案:長(zhǎng)連接

           

          長(zhǎng)連接:tcp三次握手建立起通信后,可以在一次tcp連接上傳輸多個(gè)http請(qǐng)求,這樣減少了tcp建立和關(guān)閉的消耗和延遲。

           

          下圖表示短連接和長(zhǎng)連接的對(duì)比圖:

           

           

          從圖中可知,使用短連接進(jìn)行通信時(shí),在每次http請(qǐng)求完成后都會(huì)經(jīng)歷四次握手?jǐn)嚅_(kāi)連接;而長(zhǎng)連接在建立起tcp通信時(shí),在一次tcp傳輸上可以進(jìn)行多個(gè)http請(qǐng)求。就以圖中http請(qǐng)求次數(shù)為例,使用短連接通信需要經(jīng)歷三次tcp建立和關(guān)閉,使用長(zhǎng)連接通信只需經(jīng)歷一次tcp建立和關(guān)閉。相比之下,使用長(zhǎng)連接大大減少了tcp的建立和關(guān)閉所帶來(lái)的時(shí)間延遲和資源消耗問(wèn)題。

           

          剛剛說(shuō)了長(zhǎng)連接的優(yōu)勢(shì),那么問(wèn)題來(lái)了,http使用長(zhǎng)連接的話,它如何進(jìn)行設(shè)置操作?


          http連接機(jī)制

           

          由于長(zhǎng)連接對(duì)性能的改善效果非常顯著,所以在 HTTP/1.1中的連接都會(huì)默認(rèn)啟用長(zhǎng)連接。不需要用什么特殊的頭字段指定,只要向服務(wù)器發(fā)送了第一次請(qǐng)求,后續(xù)的請(qǐng)求都會(huì)重復(fù)利用第一次打開(kāi)的 TCP 連接,也就是長(zhǎng)連接,在這個(gè)連接上收發(fā)數(shù)據(jù)。

           

          當(dāng)然,我們也可以在請(qǐng)求頭里明確地要求使用長(zhǎng)連接機(jī)制,使用的字段是Connection,值是“keep-alive”。

           

          不過(guò)不管客戶(hù)端是否顯式要求長(zhǎng)連接,如果服務(wù)器支持長(zhǎng)連接,它總會(huì)在響應(yīng)報(bào)文里放一個(gè)“Connection: keep-alive”字段,告訴客戶(hù)端:“我是支持長(zhǎng)連接的,接下來(lái)就用這個(gè) TCP 一直收發(fā)數(shù)據(jù)吧”。

           

          如果對(duì)http頭報(bào)文不熟悉的話,可以看一下我之前寫(xiě)的文章<<揭開(kāi)http報(bào)文的神秘面紗>>,這里面有解釋Connection頭字段屬性以及取值含義。

           

          隊(duì)頭阻塞

           

          看完了短連接和長(zhǎng)連接,接下來(lái)就要說(shuō)到著名的“隊(duì)頭阻塞”(Head-of-line blocking,也叫“隊(duì)首阻塞”)了。

           

          “隊(duì)頭阻塞”與短連接和長(zhǎng)連接無(wú)關(guān),而是由 HTTP 基本的“請(qǐng)求 - 應(yīng)答”模型所導(dǎo)致的。

           

          因?yàn)?HTTP 規(guī)定報(bào)文必須是“一發(fā)一收”,這就形成了一個(gè)先進(jìn)先出的“串行”隊(duì)列。隊(duì)列里的請(qǐng)求沒(méi)有輕重緩急的優(yōu)先級(jí),只有入隊(duì)的先后順序,排在最前面的請(qǐng)求被最優(yōu)先處理。

           

          如果隊(duì)首的請(qǐng)求因?yàn)樘幚淼奶⒄`了時(shí)間,那么隊(duì)列里后面的所有請(qǐng)求也不得不跟著一起等待,結(jié)果就是其他的請(qǐng)求承擔(dān)了不應(yīng)有的時(shí)間成本。

           


          性能優(yōu)化

           

          針對(duì)http的"隊(duì)頭阻塞"問(wèn)題,到底如何進(jìn)行優(yōu)化呢?

           

          • 并發(fā)連接:可以對(duì)一個(gè)域名并發(fā)發(fā)送多個(gè)連接,一個(gè)隊(duì)頭阻塞,將其后面的請(qǐng)求掛載到其他隊(duì)列上,以此緩減"隊(duì)頭阻塞問(wèn)題"。用數(shù)量解決質(zhì)量問(wèn)題


          總結(jié)

           

          • 早期的 HTTP 協(xié)議使用短連接,收到響應(yīng)后就立即關(guān)閉連接,效率很低

           

          • HTTP/1.1 默認(rèn)啟用長(zhǎng)連接,在一個(gè)連接上收發(fā)多個(gè)請(qǐng)求響應(yīng),提高了傳輸效率

           

          • 服務(wù)器會(huì)發(fā)送“Connection: keep-alive”字段表示啟用了長(zhǎng)連接

           

          • 報(bào)文頭里如果有“Connection: close”就意味著長(zhǎng)連接即將關(guān)閉

           

           


          分割線




          往期推薦


          揭開(kāi)http報(bào)文的神秘面紗

          http到底有什么魔性,備受青睞

          elasticsearch入門(mén)篇

          你真的知道怎么實(shí)現(xiàn)一個(gè)延遲隊(duì)列嗎?

          深度剖析Golang sync.Once源碼

          【七天從零實(shí)現(xiàn)ORM框架】Day07:支持事務(wù)




          文章也會(huì)持續(xù)更新,可以微信搜索「 邁莫coding 」第一時(shí)間閱讀。每天分享優(yōu)質(zhì)文章、大廠經(jīng)驗(yàn)、大廠面經(jīng),助力面試,是每個(gè)程序員值得關(guān)注的平臺(tái)。




          1. 你點(diǎn)的每個(gè)贊,我都認(rèn)真當(dāng)成了喜歡



          瀏覽 89
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天摸天天添 | 天天日天天舔天天操 | 国产综合3| 大香蕉久久伊人网 | 国产乱╳╳aⅴ毛片 |