<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 keep-alive、TCP Keep-Alive、心跳檢測(cè),傻傻分不清?

          共 2670字,需瀏覽 6分鐘

           ·

          2021-06-02 12:10

          聊技術(shù),不止于技術(shù)

          大家都知道HTTP 1.0和HTTP 1.1的區(qū)別在于連接復(fù)用,表現(xiàn)在協(xié)議里就是HTTP 1.1的請(qǐng)求頭中會(huì)多一個(gè) Connection: keep-alive,但是具體如何進(jìn)行連接復(fù)用的可能很多同學(xué)并不是很清楚,今天我就通過(guò)抓包來(lái)具體解析HTTP 1.1協(xié)議,跟大家一起來(lái)看看連接復(fù)用到底是怎么一回事,跟隨這個(gè)過(guò)程,同樣也回答下HTTP keep-alive、TCP Keep-Alive以及心跳檢測(cè)之間的區(qū)別。

          1

          先來(lái)說(shuō)說(shuō)HTTP keep-alive

          首先問(wèn)大家一個(gè)問(wèn)題:瀏覽器刷新頁(yè)面,可能會(huì)同時(shí)有多個(gè)請(qǐng)求發(fā)往后端服務(wù)器,每一個(gè)請(qǐng)求都會(huì)使用一個(gè)連接嗎?
          如果是使用HTTP 1.1協(xié)議的話,答案是否定的,因?yàn)檫B接會(huì)復(fù)用,不同的請(qǐng)求可以使用同一個(gè)連接,那具體一點(diǎn)呢?
          其實(shí)Chrome瀏覽器對(duì)于同一個(gè)后端服務(wù)器最多有6個(gè)連接的限制。也就是說(shuō),無(wú)論你刷新的頁(yè)面同時(shí)有多少個(gè)AJAX請(qǐng)求,Chrome只會(huì)限制這些請(qǐng)求最多通過(guò)6個(gè)TCP連接來(lái)完成。
          舉個(gè)例子,一個(gè)頁(yè)面有10個(gè)AJAX請(qǐng)求,你此時(shí)刷新頁(yè)面,瀏覽器會(huì)限制這10個(gè)請(qǐng)求通過(guò)6個(gè)TCP連接完成,這樣就會(huì)有4個(gè)請(qǐng)求復(fù)用之前的連接。這其實(shí)就是HTTP 1.1中的keep-alive概念,也就是說(shuō)TCP連接的復(fù)用,就是HTTP的keep-alive。
          那什么時(shí)候后4個(gè)請(qǐng)求能夠復(fù)用之前的連接呢?答案是之間的連接完成了一次完整的Request/Response,這樣TCP連接中就沒(méi)有臟數(shù)據(jù),后面的請(qǐng)求自然能夠復(fù)用此連接了。
          下面我們就來(lái)看看HTTP keep-alive的實(shí)際抓包例子(IP地址末位37為瀏覽器端,40為服務(wù)器端):
          上圖中序號(hào)為382和序號(hào)為451的兩個(gè)請(qǐng)求,就復(fù)用了一個(gè)連接,在序號(hào)為451的請(qǐng)求包中,標(biāo)記了該連接中的上一個(gè)請(qǐng)求是382,并且從抓的包中也能夠看出下一個(gè)請(qǐng)求是在上一個(gè)請(qǐng)求完成完整的Request/Response之后才發(fā)出的。這里也能夠看出HTTP 1.1協(xié)議是半雙工的,同一時(shí)刻,數(shù)據(jù)只在一個(gè)方向上收或發(fā)。
          上面就是HTTP keep-alive中的連接復(fù)用的實(shí)際情況。

          2

          TCP Keep-Alive是什么?

          與HTTP keep-alive有什么區(qū)別和聯(lián)系

          TCP Keep-Alive是TCP的保活功能,用來(lái)探測(cè)連接對(duì)端是否存在,屬于傳輸層的概念,主要用來(lái)檢測(cè)并關(guān)閉異常連接。
          它與HTTP keep-alive沒(méi)有任何聯(lián)系,這兩個(gè)完全是不同的概念。上面講到的多個(gè)HTTP請(qǐng)求能夠復(fù)用同一個(gè)連接就是HTTP keep-alive的概念,屬于應(yīng)用層的概念。
          所以它們兩個(gè)完全是不同的概念。

          3

          瀏覽器和服務(wù)端之間的連接會(huì)一直保持嗎?

          什么時(shí)候會(huì)關(guān)閉?

          如果瀏覽器和服務(wù)端之間的連接如果一直保持會(huì)怎么樣,答案是浪費(fèi)資源,不僅僅會(huì)浪費(fèi)服務(wù)端的資源,同樣也會(huì)浪費(fèi)客戶端的資源,所以它們會(huì)在以下幾種情況下關(guān)閉:
          (1) 當(dāng)Chrome瀏覽器關(guān)閉的時(shí)候,連接將會(huì)關(guān)閉,這屬于客戶端主動(dòng)關(guān)閉連接的情況。
          (2)當(dāng)客戶端長(zhǎng)時(shí)間未操作,具體表現(xiàn)為連接長(zhǎng)時(shí)間未傳輸數(shù)據(jù)的時(shí)候,服務(wù)端也會(huì)關(guān)閉連接,這屬于服務(wù)端主動(dòng)關(guān)閉的情況。
          那么多長(zhǎng)時(shí)間連接未傳輸數(shù)據(jù),服務(wù)端就會(huì)關(guān)閉連接呢?這依賴于服務(wù)端的設(shè)置,如果服務(wù)端是Tomcat,keepAliveTimeout參數(shù)便是控制連接超時(shí)關(guān)閉的參數(shù),當(dāng)該參數(shù)設(shè)置為60s時(shí),超過(guò)60s連接未傳輸數(shù)據(jù),也就是說(shuō)你超過(guò)60s未點(diǎn)擊操作瀏覽器,服務(wù)端便會(huì)將連接關(guān)閉。
          來(lái)看一個(gè)實(shí)際的例子:
          上圖中序號(hào)為2641的包是瀏覽器最后一次回復(fù)數(shù)據(jù)到服務(wù)端的包,大概是在20s的時(shí)刻,過(guò)了大概60s沒(méi)有傳輸數(shù)據(jù),所以在80s時(shí)刻的時(shí)候,服務(wù)端主動(dòng)發(fā)送了fin包,斷開(kāi)了連接,對(duì)應(yīng)的序號(hào)為6506,剩下的就是TCP四次揮手的包了。
          (3)Chrome瀏覽器會(huì)通過(guò)TCP keep-alive來(lái)檢測(cè)連接,如果檢測(cè)連接失效,也就是服務(wù)端無(wú)響應(yīng),也會(huì)主動(dòng)關(guān)閉連接。
          我們也來(lái)看一個(gè)實(shí)際的例子。
          首先在服務(wù)端所在機(jī)器執(zhí)行以下命令,模擬客戶端和服務(wù)端斷網(wǎng),即服務(wù)端無(wú)響應(yīng)的情況:
          iptables -A INPUT -p tcp -s 192.x.x.37 -j DROPiptables -A OUTPUT -p tcp -d 192.x.x.37 -j DROP
          然后來(lái)看實(shí)際的抓包:
          上圖中可以看到,客戶端在發(fā)送了多次TCP Keep-Alive檢測(cè)包后(具體發(fā)送多少次,每次間隔時(shí)間多少依賴于具體的系統(tǒng)配置),服務(wù)端都沒(méi)有響應(yīng),則發(fā)送RST包斷開(kāi)了連接。
          上面就是連接關(guān)閉的幾種情況,除了客戶端關(guān)閉瀏覽器,還有服務(wù)端的超時(shí)檢測(cè)機(jī)制,以及客戶端的連接檢測(cè)機(jī)制,這些機(jī)制都能夠保證連接的有效性,防止無(wú)效連接過(guò)多從而占用系統(tǒng)資源。

          4

          TCP Keep-Alive與心跳檢測(cè)有什么關(guān)系?

          通過(guò)上面的實(shí)例,有同學(xué)可能發(fā)現(xiàn)TCP Keep-Alive和某些應(yīng)用層協(xié)議的心跳檢測(cè)很相似,確實(shí)如此。
          TCP Keep-Alive的功能完全可以通過(guò)應(yīng)用層的心跳檢測(cè)功能來(lái)實(shí)現(xiàn),并且能夠更加靈活,因?yàn)門(mén)CP Keep-Alive功能還要依賴操作系統(tǒng)的設(shè)置,而應(yīng)用層協(xié)議完全可以自己實(shí)現(xiàn)。它們本質(zhì)上都是做了連接有效性檢測(cè)的事。
          所以它們只是做的事情相同,本身并沒(méi)有什么關(guān)系。



          寫(xiě)在最后

          今天通過(guò)實(shí)際抓包,解析了HTTP 1.1中keep-alive的協(xié)議概念。順便回答了HTTP keep-alive、TCP Keep-Alive及心跳檢測(cè)之間的一些問(wèn)題。
          HTTP keep-alive是應(yīng)用層的概念,表示不同的HTTP請(qǐng)求可以復(fù)用之前的連接。
          TCP Keep-Alive是傳輸層的概念,屬于TCP保活的功能,通過(guò)發(fā)送Keep-Alive包判斷對(duì)端是否存在。
          心跳檢測(cè)也是應(yīng)用層的概念,用來(lái)檢測(cè)連接有效性。
          通常TCP Keep-Alive與心跳檢測(cè)只需要一個(gè)就可以了,畢竟它們做的事都是一樣的。
          希望今天的內(nèi)容對(duì)大家有所幫助。

          推薦閱讀:
          《Apache RocketMQ只用了7個(gè)類就實(shí)現(xiàn)了Nameserver,你知道是如何做到的嗎?》



          聊技術(shù),不止于技術(shù)。

          在這里我會(huì)分享技術(shù)文章、管理知識(shí)以及個(gè)人的思想感悟,歡迎點(diǎn)擊關(guān)注。
          公眾號(hào)對(duì)話框回復(fù)【SACC】,獲取大會(huì)精彩演講PPT。
          瀏覽 113
          點(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>
                  精品国产Av无码久久久影音先锋 | 欧美一性一乱一交一视爱豆传媒 | 国产亚卅欧美快速 | 天天色天天干天天 | 欧美在线91 豆花 |