衡阳派盒市场营销有限公司

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

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

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

字節(jié)一面:HTTP長連接和TCP長連接有區(qū)別?

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

大家好,我是小林。

之前有位讀者私信我,他在字節(jié)面試時,被問到這兩個問題:

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

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

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

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

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

如果認真讀過我網(wǎng)站上圖解網(wǎng)絡(luò)系列文章的同學(xué),應(yīng)該這個問題你們都會,因為我之前就寫過。

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

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

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

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

接下來,分別說說它們。

HTTP 的 Keep-Alive

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

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

請求-應(yīng)答

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

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

一個 HTTP 請求

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

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

HTTP 短連接

這樣實在太累人了,一次連接只能請求一次資源。

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

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

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

HTTP 長連接

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

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

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

Connection:Keep-Alive

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

Connection:Keep-Alive

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

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

Connection:close

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

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

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

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

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

右邊為 HTTP 流水線機制

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

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

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

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

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

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

HTTP 長連接超時

TCP 的 Keepalive

TCP 的 Keepalive 這東西其實就是TCP 的保活機制,它的工作原理我之前的文章寫過,這里就直接貼下以前的內(nèi)容。

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

如果對端程序是正常工作的。當(dāng) TCP 保活的探測報文發(fā)送給對端, 對端會正常響應(yīng),這樣TCP 保活時間會被重置,等待下一個 TCP 保活時間的到來。

如果對端主機崩潰,或?qū)Χ擞捎谄渌驅(qū)е聢笪牟豢蛇_。當(dāng) TCP 保活的探測報文發(fā)送給對端后,石沉大海,沒有響應(yīng),連續(xù)幾次,達到保活探測次數(shù)后,TCP 會報告該 TCP 連接已經(jīng)死亡。

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

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

TCP 保活機制

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

總結(jié)

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

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

歷史好文:

字節(jié)一面:TCP 三次握手,問的好細!

美團二面:TCP 四次揮手,可以變成三次嗎?

字節(jié)一面:服務(wù)端掛了,客戶端的 TCP 連接還在嗎?

字節(jié)一面:HTTPS 一定安全可靠嗎?

審核編輯 :李倩

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

    關(guān)注

    0

    文章

    511

    瀏覽量

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

    關(guān)注

    8

    文章

    1378

    瀏覽量

    79305
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    829

    瀏覽量

    26744
收藏 人收藏

    評論

    相關(guān)推薦

    調(diào)試TCP協(xié)議連接的常用工具

    在網(wǎng)絡(luò)通信中,TCP(傳輸控制協(xié)議)是種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。調(diào)試TCP連接
    的頭像 發(fā)表于 01-22 09:59 ?192次閱讀

    TCP協(xié)議與UDP協(xié)議的區(qū)別

    1. 連接TCP(傳輸控制協(xié)議) : 面向連接 :在數(shù)據(jù)傳輸之前,TCP需要建立連接,這
    的頭像 發(fā)表于 01-22 09:44 ?124次閱讀

    TCP三次握手與連接建立的關(guān)系

    在計算機網(wǎng)絡(luò)中,TCP(傳輸控制協(xié)議)是種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議。它負責(zé)在兩個主機之間建立、維護和終止連接,確保數(shù)
    的頭像 發(fā)表于 01-06 09:09 ?232次閱讀

    TCP三次握手與UDP的區(qū)別

    連接管理、可靠性、效率等方面有著顯著的區(qū)別。 1. TCP三次握手 TCP種面向連接的、可
    的頭像 發(fā)表于 01-03 17:35 ?439次閱讀

    HTTP 1.1 和 HTTP 2.0 的區(qū)別

    2015年正式成為互聯(lián)網(wǎng)標準。以下是HTTP/1.1和HTTP/2之間的些主要區(qū)別: 1. 多路復(fù)用(Multiplexing) HTTP
    的頭像 發(fā)表于 12-30 09:25 ?309次閱讀

    測徑儀 測測儀是如何應(yīng)用在卷煙生產(chǎn)中的?

    關(guān)鍵字:卷煙測徑儀,卷煙測儀,煙草測徑儀,煙草測儀,煙草機械測徑儀,卷煙設(shè)備,煙草設(shè)備, 測徑儀和測儀在卷煙生產(chǎn)中發(fā)揮著至關(guān)重要的作用,它們能夠精確測量卷煙的物理尺寸,確保產(chǎn)品質(zhì)量的
    發(fā)表于 11-13 13:58

    電纜連接ADS8410/13

    電子發(fā)燒友網(wǎng)站提供《用電纜連接ADS8410/13.pdf》資料免費下載
    發(fā)表于 10-22 09:42 ?0次下載
    用<b class='flag-5'>長</b>電纜<b class='flag-5'>連接</b>ADS8410/13

    TPA311X系列芯片的SYNC如果是做成系統(tǒng)的是否需要連接連接于不連接有什么優(yōu)缺點?

    TPA311X系列芯片的SYNC如果是做成系統(tǒng)的是否需要連接連接于不連接有什么優(yōu)缺點?如下圖所示
    發(fā)表于 10-14 06:49

    TCP協(xié)議是什么

    ,應(yīng)用層之下,為各種應(yīng)用提供可靠的、面向連接的、基于字節(jié)流的傳輸服務(wù)。本文將詳細解析TCP協(xié)議的定義、工作原理、主要特點及其在各種應(yīng)用場景中的重要作用。 定義與基本原理 TCP協(xié)議是
    的頭像 發(fā)表于 10-09 13:54 ?861次閱讀

    網(wǎng)線不夠可以接嗎

    網(wǎng)線不夠是可以接的。當(dāng)網(wǎng)線長度不足以覆蓋所需連接的距離時,可以通過幾種方法來延長網(wǎng)線。 網(wǎng)線連接器(耦合器):使用網(wǎng)線連接器(也稱為耦合器或中繼器)可以將兩根網(wǎng)線
    的頭像 發(fā)表于 09-12 09:33 ?2267次閱讀

    工業(yè)相機測儀的組成部分

    處理,以保障工業(yè)相機采集數(shù)據(jù)的準確性。 (四)軟件部分 圖像處理技術(shù)是利用計算機來處理、分析和理解視覺信息的項技術(shù)。圖像處理技術(shù)的數(shù)學(xué)模型主要有正交模型、統(tǒng)計模型、預(yù)測模型等。型材測系統(tǒng)是在正交模型
    發(fā)表于 08-27 17:45

    tcp和udp的區(qū)別和聯(lián)系

    揮著重要作用。然而,它們在設(shè)計、功能和性能方面存在顯著差異。 二、TCP與UDP的定義 傳輸控制協(xié)議(TCPTCP種面向連接的、可靠
    的頭像 發(fā)表于 08-16 11:06 ?678次閱讀

    在ESP和Android手機之間保持穩(wěn)定的tcp連接時遇到的問題求解

    。 從安卓設(shè)備連接到AP都很好。 ESP 充當(dāng)服務(wù)器。它從 P10 plus 獲取連接,P10 plus 通過 TCP 發(fā)送字節(jié)數(shù)組。然后 esp 處理信息,并發(fā)回
    發(fā)表于 07-11 06:42

    請問esp32之間的藍牙連接與esp32與手機的藍牙連接有什么區(qū)別

    請問esp32之間的藍牙連接與esp32與手機的藍牙連接有什么區(qū)別?為什么我測試的多個藍牙例程中esp32之間都可以正常通信,esp32與手機卻無法建立連接,是否有什么需要注意的地方。
    發(fā)表于 06-06 08:15

    mqtt協(xié)議和tcp協(xié)議區(qū)別

    帶寬和高延遲的網(wǎng)絡(luò)環(huán)境,尤其在物聯(lián)網(wǎng)環(huán)境中表現(xiàn)優(yōu)秀。而TCP協(xié)議是面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,主要用于互聯(lián)網(wǎng)和局域網(wǎng)中的數(shù)據(jù)傳輸。 2. 連接方式:MQTT協(xié)議基于
    的頭像 發(fā)表于 04-01 09:15 ?1757次閱讀
    百家乐官网和21点| 大发888网页游戏平台| 百家乐现金网平台排行| 玩百家乐官网请高手指点| 百家乐官网自动下注| 大洼县| 新澳博娱乐城| 大发888游戏平台hg| 威尼斯人娱乐网代理| 龙博百家乐的玩法技巧和规则| 百家乐百家乐论坛| 真人百家乐皇冠网| 百家乐美女真人| 做生意风水摆件| 百家乐游戏高手| 百家乐玩法与规则| 百家乐概率怎么算| 百家乐最低下注| 网上百家乐官方网站| 网上百家乐好玩吗| 百家乐9人桌布| 世嘉百家乐的玩法技巧和规则| 大集汇百家乐的玩法技巧和规则| 百家乐强弱走势图| 励骏会百家乐的玩法技巧和规则| 百家乐国际赌场娱乐网规则| 百家乐娱乐城| 大发888真人娱乐场网址官网| 大发888玩哪个能赢钱| 百家乐大轮转| 老虎机价格| bet365国际娱乐| 黑山县| 百家乐官网赌术大揭秘| 明溪百家乐官网的玩法技巧和规则 | 棋牌游戏平台排行榜| 鄂州市| 评测百家乐官网博彩网站| 网上玩百家乐官网会出签吗| 永利百家乐娱乐| 百家乐tt娱乐场开户注册|