0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HTTP的Keep-Alive和TCP的Keepalive有什么區(qū)別?

小林coding ? 來源:小林coding ? 作者:小林coding ? 2022-12-02 14:02 ? 次閱讀

第一個(gè)問題:MySQL 的 NULL 值是怎么存放的?

第二個(gè)問題:HTTP 長(zhǎng)連接和 TCP 長(zhǎng)連接有什么區(qū)別?

第一個(gè)問題,主要是考核你是否清楚 MySQL 一條記錄是怎么存儲(chǔ)的,我在前幾天已經(jīng)寫了一篇文章講解了,還沒看過的同學(xué),可以去看這篇:字節(jié)一面:MySQL 的 NULL 值是怎么存放的?

第二問題,其實(shí)是在問 HTTP 的 Keep-Alive 和 TCP 的 Keepalive 有什么區(qū)別?

這是個(gè)好問題,應(yīng)該有不少人都會(huì)搞混,因?yàn)檫@兩個(gè)東西看上去太像了,很容易誤以為是同一個(gè)東西。

如果認(rèn)真讀過我網(wǎng)站上圖解網(wǎng)絡(luò)系列文章的同學(xué),應(yīng)該這個(gè)問題你們都會(huì),因?yàn)槲抑熬蛯戇^。

不過,應(yīng)該也有不少同學(xué),看過后忘記了,這次就帶大家重新復(fù)習(xí)一波。

事實(shí)上,這兩個(gè)完全是兩樣不同東西,實(shí)現(xiàn)的層面也不同:

HTTP 的 Keep-Alive,是由應(yīng)用層(用戶態(tài)) 實(shí)現(xiàn)的,稱為 HTTP 長(zhǎng)連接;

TCP 的 Keepalive,是由 TCP 層(內(nèi)核態(tài)) 實(shí)現(xiàn)的,稱為 TCP 保活機(jī)制;

接下來,分別說說它們。

HTTP 的 Keep-Alive

HTTP 協(xié)議采用的是「請(qǐng)求-應(yīng)答」的模式,也就是客戶端發(fā)起了請(qǐng)求,服務(wù)端才會(huì)返回響應(yīng),一來一回這樣子。

3e26a8d2-7205-11ed-8abf-dac502259ad0.png

請(qǐng)求-應(yīng)答

由于 HTTP 是基于 TCP 傳輸協(xié)議實(shí)現(xiàn)的,客戶端與服務(wù)端要進(jìn)行 HTTP 通信前,需要先建立 TCP 連接,然后客戶端發(fā)送 HTTP 請(qǐng)求,服務(wù)端收到后就返回響應(yīng),至此「請(qǐng)求-應(yīng)答」的模式就完成了,隨后就會(huì)釋放 TCP 連接。

3e32a4fc-7205-11ed-8abf-dac502259ad0.png

一個(gè) HTTP 請(qǐng)求

如果每次請(qǐng)求都要經(jīng)歷這樣的過程:建立 TCP -> 請(qǐng)求資源 -> 響應(yīng)資源 -> 釋放連接,那么此方式就是 HTTP 短連接,如下圖:

3e48c390-7205-11ed-8abf-dac502259ad0.png

HTTP 短連接

這樣實(shí)在太累人了,一次連接只能請(qǐng)求一次資源。

能不能在第一個(gè) HTTP 請(qǐng)求完后,先不斷開 TCP 連接,讓后續(xù)的 HTTP 請(qǐng)求繼續(xù)使用此連接?

當(dāng)然可以,HTTP 的 Keep-Alive 就是實(shí)現(xiàn)了這個(gè)功能,可以使用同一個(gè) TCP 連接來發(fā)送和接收多個(gè) HTTP 請(qǐng)求/應(yīng)答,避免了連接建立和釋放的開銷,這個(gè)方法稱為 HTTP 長(zhǎng)連接。

3e70a324-7205-11ed-8abf-dac502259ad0.png

HTTP 長(zhǎng)連接

HTTP 長(zhǎng)連接的特點(diǎn)是,只要任意一端沒有明確提出斷開連接,則保持 TCP 連接狀態(tài)。

怎么才能使用 HTTP 的 Keep-Alive 功能?

在 HTTP 1.0 中默認(rèn)是關(guān)閉的,如果瀏覽器要開啟 Keep-Alive,它必須在請(qǐng)求的包頭中添加:

Connection:Keep-Alive

然后當(dāng)服務(wù)器收到請(qǐng)求,作出回應(yīng)的時(shí)候,它也添加一個(gè)頭在響應(yīng)中:

Connection:Keep-Alive

這樣做,連接就不會(huì)中斷,而是保持連接。當(dāng)客戶端發(fā)送另一個(gè)請(qǐng)求時(shí),它會(huì)使用同一個(gè)連接。這一直繼續(xù)到客戶端或服務(wù)器端提出斷開連接。

從 HTTP 1.1 開始, 就默認(rèn)是開啟了 Keep-Alive,如果要關(guān)閉 Keep-Alive,需要在 HTTP 請(qǐng)求的包頭里添加:

Connection:close

現(xiàn)在大多數(shù)瀏覽器都默認(rèn)是使用 HTTP/1.1,所以 Keep-Alive 都是默認(rèn)打開的。一旦客戶端和服務(wù)端達(dá)成協(xié)議,那么長(zhǎng)連接就建立好了。

HTTP 長(zhǎng)連接不僅僅減少了 TCP 連接資源的開銷,而且這給 HTTP 流水線技術(shù)提供了可實(shí)現(xiàn)的基礎(chǔ)。

所謂的 HTTP 流水線,是客戶端可以先一次性發(fā)送多個(gè)請(qǐng)求,而在發(fā)送過程中不需先等待服務(wù)器的回應(yīng),可以減少整體的響應(yīng)時(shí)間。

舉例來說,客戶端需要請(qǐng)求兩個(gè)資源。以前的做法是,在同一個(gè) TCP 連接里面,先發(fā)送 A 請(qǐng)求,然后等待服務(wù)器做出回應(yīng),收到后再發(fā)出 B 請(qǐng)求。HTTP 流水線機(jī)制則允許客戶端同時(shí)發(fā)出 A 請(qǐng)求和 B 請(qǐng)求。

3e8df00a-7205-11ed-8abf-dac502259ad0.png

右邊為 HTTP 流水線機(jī)制

但是服務(wù)器還是按照順序響應(yīng),先回應(yīng) A 請(qǐng)求,完成后再回應(yīng) B 請(qǐng)求。

而且要等服務(wù)器響應(yīng)完客戶端第一批發(fā)送的請(qǐng)求后,客戶端才能發(fā)出下一批的請(qǐng)求,也就說如果服務(wù)器響應(yīng)的過程發(fā)生了阻塞,那么客戶端就無法發(fā)出下一批的請(qǐng)求,此時(shí)就造成了「隊(duì)頭阻塞」的問題。

可能有的同學(xué)會(huì)問,如果使用了 HTTP 長(zhǎng)連接,如果客戶端完成一個(gè) HTTP 請(qǐng)求后,就不再發(fā)起新的請(qǐng)求,此時(shí)這個(gè) TCP 連接一直占用著不是挺浪費(fèi)資源的嗎?

對(duì)沒錯(cuò),所以為了避免資源浪費(fèi)的情況,web 服務(wù)軟件一般都會(huì)提供 keepalive_timeout 參數(shù),用來指定 HTTP 長(zhǎng)連接的超時(shí)時(shí)間。

比如設(shè)置了 HTTP 長(zhǎng)連接的超時(shí)時(shí)間是 60 秒,web 服務(wù)軟件就會(huì)啟動(dòng)一個(gè)定時(shí)器,如果客戶端在完后一個(gè) HTTP 請(qǐng)求后,在 60 秒內(nèi)都沒有再發(fā)起新的請(qǐng)求,定時(shí)器的時(shí)間一到,就會(huì)觸發(fā)回調(diào)函數(shù)來釋放該連接。

3eb55dac-7205-11ed-8abf-dac502259ad0.png

HTTP 長(zhǎng)連接超時(shí)

TCP 的 Keepalive

TCP 的 Keepalive 這東西其實(shí)就是 TCP 的?;顧C(jī)制,它的工作原理我之前的文章寫過,這里就直接貼下以前的內(nèi)容。

如果兩端的 TCP 連接一直沒有數(shù)據(jù)交互,達(dá)到了觸發(fā) TCP 保活機(jī)制的條件,那么內(nèi)核里的 TCP 協(xié)議棧就會(huì)發(fā)送探測(cè)報(bào)文。

如果對(duì)端程序是正常工作的。當(dāng) TCP ?;畹奶綔y(cè)報(bào)文發(fā)送給對(duì)端, 對(duì)端會(huì)正常響應(yīng),這樣 TCP 保活時(shí)間會(huì)被重置,等待下一個(gè) TCP ?;顣r(shí)間的到來。

如果對(duì)端主機(jī)崩潰,或?qū)Χ擞捎谄渌驅(qū)е聢?bào)文不可達(dá)。當(dāng) TCP ?;畹奶綔y(cè)報(bào)文發(fā)送給對(duì)端后,石沉大海,沒有響應(yīng),連續(xù)幾次,達(dá)到?;钐綔y(cè)次數(shù)后,TCP 會(huì)報(bào)告該 TCP 連接已經(jīng)死亡

所以,TCP ?;顧C(jī)制可以在雙方?jīng)]有數(shù)據(jù)交互的情況,通過探測(cè)報(bào)文,來確定對(duì)方的 TCP 連接是否存活,這個(gè)工作是在內(nèi)核完成的。

3ed5f9d6-7205-11ed-8abf-dac502259ad0.png

TCP ?;顧C(jī)制

注意,應(yīng)用程序若想使用 TCP ?;顧C(jī)制需要通過 socket 接口設(shè)置 SO_KEEPALIVE 選項(xiàng)才能夠生效,如果沒有設(shè)置,那么就無法使用 TCP ?;顧C(jī)制。

總結(jié)

HTTP 的 Keep-Alive 也叫 HTTP 長(zhǎng)連接,該功能是由「應(yīng)用程序」實(shí)現(xiàn)的,可以使得用同一個(gè) TCP 連接來發(fā)送和接收多個(gè) HTTP 請(qǐng)求/應(yīng)答,減少了 HTTP 短連接帶來的多次 TCP 連接建立和釋放的開銷。

TCP 的 Keepalive 也叫 TCP ?;顧C(jī)制,該功能是由「內(nèi)核」實(shí)現(xiàn)的,當(dāng)客戶端和服務(wù)端長(zhǎng)達(dá)一定時(shí)間沒有進(jìn)行數(shù)據(jù)交互時(shí),內(nèi)核為了確保該連接是否還有效,就會(huì)發(fā)送探測(cè)報(bào)文,來檢測(cè)對(duì)方是否還在線,然后來決定是否要關(guān)閉該連接。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3218

    瀏覽量

    113676
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    478

    瀏覽量

    30759
  • TCP
    TCP
    +關(guān)注

    關(guān)注

    8

    文章

    1324

    瀏覽量

    78755

原文標(biāo)題:字節(jié)一面:HTTP 長(zhǎng)連接和 TCP 長(zhǎng)連接有區(qū)別?

文章出處:【微信號(hào):小林coding,微信公眾號(hào):小林coding】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    W5500 keep-alive的用途與用法

    決方法:Sn_KPALVTR寄存器配置了socketn 的keep-alive包傳輸時(shí)間間隔。只在TCP模式下生效,單位時(shí)間為5秒。Keep-alive包會(huì)在Sn-SR 寄存器變?yōu)镾OCK_ESTABLISHED
    發(fā)表于 08-04 09:44

    未使用keep-alive設(shè)置關(guān)閉的套接字

    to the socket.As a workaround, I tried to lower the keep-alive timeout with TCP_OPTION_KEEP_ALIVE
    發(fā)表于 09-14 15:42

    labview的tcp通訊

    我用labview做tcp通訊的客戶端,請(qǐng)問各位如何發(fā)送keep-alive,從而保證不會(huì)斷開?
    發(fā)表于 03-20 10:50

    淺析socket keep alive

    服務(wù)器端和客戶端的Socket都設(shè)定了keepalive屬性。服務(wù)器端設(shè)定了探測(cè)次數(shù)等參數(shù),客戶端、服務(wù)器只是打開了keepalive機(jī)能服務(wù)器端起了一個(gè)監(jiān)視線程,利用select來檢測(cè)socket是否被關(guān)閉。。。
    發(fā)表于 07-12 07:56

    vue中的keep-alive那些不得不知的知識(shí)點(diǎn)?

    vue中的keep-alive
    發(fā)表于 11-06 06:08

    UIP和lwip什么區(qū)別

    UIP和lwip什么區(qū)別,uIP是專門為8位和16位控制器設(shè)計(jì)的一個(gè)非常小的TCP/IP棧。完全用C編寫,因此可移植到各種不同的結(jié)構(gòu)和操作系統(tǒng)上,一個(gè)編譯過的棧可以在幾KB ROM或幾百字節(jié)RAM
    發(fā)表于 08-09 09:09

    esp_http_client流在一段時(shí)間后失去連接怎么解決?

    to disable the tcp timeout.keep_alive_enable = true,.keep_alive_idle = 10,.keep_alive_inter
    發(fā)表于 04-13 06:00

    如何通過AT命令向ESP8266-01發(fā)出HTTP或HTTPS請(qǐng)求?

    Connection: keep-alive 變化 3: 代碼:全選AT+CIPMUX=0 AT+CIPSTART=\"TCP\",\"
    發(fā)表于 05-19 08:33

    modbus TCP和modbus RTU什么區(qū)別?

    modbus TCP和modbus RTU什么區(qū)別
    發(fā)表于 10-09 06:20

    求助,使用Labview的tcp通訊怎么保證不斷開?

    我用labview做tcp通訊的客戶端,請(qǐng)問各位如何發(fā)送keep-alive,從而保證不會(huì)斷開?顯示全部
    發(fā)表于 10-23 06:57

    tcphttp區(qū)別在哪里

    我一直以為HttpTcp是兩種不同的,但是地位對(duì)等的協(xié)議,雖然知道TCP是傳輸層,而http是應(yīng)用層今天學(xué)習(xí)了下,知道了 http是要基于
    發(fā)表于 12-08 12:32 ?2.6w次閱讀
    <b class='flag-5'>tcp</b>和<b class='flag-5'>http</b>的<b class='flag-5'>區(qū)別</b>在哪里

    webgis和gis什么區(qū)別

    沒有本質(zhì)的區(qū)別,都是TCP/IP,WebGIS使用更多的是HTTP協(xié)議,如MapService,WMS,WFS and so on都是基于http通信,當(dāng)然soap和rest本質(zhì)也是
    發(fā)表于 01-14 08:44 ?1.1w次閱讀

    httptcp/ip、http https之間的關(guān)系和區(qū)別

    httptcp/ip、http和https之間的關(guān)系和區(qū)別
    的頭像 發(fā)表于 01-10 14:30 ?7304次閱讀

    RTOS和 TSOS什么區(qū)別

    RTOS和TSOS什么區(qū)別?
    的頭像 發(fā)表于 03-12 11:22 ?4399次閱讀

    RDMA和TCP/IP什么區(qū)別

    在分布式存儲(chǔ)網(wǎng)絡(luò)中,我們使用的協(xié)議RoCE、Infiniband(IB)和TCP/IP。其中RoCE和IB屬于RDMA (RemoteDirect Memory Access)技術(shù),他和傳統(tǒng)的TCP/IP
    的頭像 發(fā)表于 11-30 09:19 ?1340次閱讀
    RDMA和<b class='flag-5'>TCP</b>/IP<b class='flag-5'>有</b><b class='flag-5'>什么區(qū)別</b>