<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                TCP協議的`KeepAlive`機制與`HeartBeat`心跳包 * HeartBeat心跳包 很多應用層協議都有HeartBeat機制,通常是客戶端每隔一小段時間向服務器發送一個數據包,通知服務器自己仍然在線,并傳輸一些可能必要的數據。使用心跳包的典型協議是IM,比如QQ/MSN/飛信等協議。 心跳包之所以叫心跳包是因為:它像心跳一樣每隔固定時間發一次,以此來告訴服務器,這個客戶端還活著。事實上這是為了保持長連接,至于這個包的內容,是沒有什么特別規定的,不過一般都是很小的包,或者只包含包頭的一個空包。 在TCP的機制里面,本身是存在有心跳包的機制的,也就是TCP的選項:SO\_KEEPALIVE。系統默認是設置的2小時的心跳頻率。但是它檢查不到機器斷電、網線拔出、防火墻這些斷線。而且邏輯層處理斷線可能也不是那么好處理。一般,如果只是用于保活還是可以的。 心跳包一般來說都是在邏輯層發送空的echo包來實現的。下一個定時器,在一定時間間隔下發送一個空包給客戶端,然后客戶端反饋一個同樣的空包回來,服務器如果在一定時間內收不到客戶端發送過來的反饋包,那就只有認定說掉線了。 其實,要判定掉線,只需要send或者recv一下,如果結果為零,則為掉線。但是,在長連接下,有可能很長一段時間都沒有數據往來。 理論上說,這個連接是一直保持連接的,但是實際情況中,如果中間節點出現什么故障是難以知道的。更要命的是,有的節點(防火墻)會自動把一定時間之內沒有數據交互的連接給斷掉。在這個時候,就需要我們的心跳包了,用于維持長連接,保活。 在獲知了斷線之后,服務器邏輯可能需要做一些事情,比如斷線后的數據清理呀,重新連接呀……當然,這個自然是要由邏輯層根據需求去做了。 總的來說,心跳包主要也就是用于長連接的保活和斷線處理。一般的應用下,判定時間在30-40秒比較不錯。如果實在要求高,那就在6-9秒。 * TCP協議的`KeepAlive`機制 TCP的IP傳輸層的兩個主要協議是UDP和TCP,其中UDP是無連接的、面向packet的,而TCP協議是有連接、面向流的協議。 TCP的`KeepAlive`機制,首先它貌似默認是不打開的,要用`setsockopt`將`SOL_SOCKET.SO_KEEPALIVE`設置為1才是打開,并且可以設置三個參數`tcp_keepalive_time/tcp_keepalive_probes/tcp_keepalive_intvl`,分別表示連接閑置多久開始發`keepalive`的ack包、發幾個ack包不回復才當對方死了、兩個ack包之間間隔多. 在測試的時候用`Ubuntu Server 10.04`下面默認值是7200秒(2個小時,要不要這么蛋疼啊!)、9次、75秒。 于是連接就了有一個超時時間窗口,如果連接之間沒有通信,這個時間窗口會逐漸減小,當它減小到零的時候,TCP協議會向對方發一個帶有ACK標志的空數據包(KeepAlive探針),對方在收到ACK包以后,如果連接一切正常,應該回復一個ACK;如果連接出現錯誤了(例如對方重啟了,連接狀態丟失),則應當回復一個RST;如果對方沒有回復,服務器每隔intvl的時間再發ACK,如果連續probes個包都被無視了,說明連接被斷開了。 在http早期,每個http請求都要求打開一個tpc socket連接,并且使用一次之后就斷開這個tcp連接。 使用`keep-alive`可以改善這種狀態,即在一次TCP連接中可以持續發送多份數據而不會斷開連接。通過使用`keep-alive`機制,可以減少tcp連接建立次數,也意味著可以減少`TIME_WAIT`狀態連接,以此提高性能和提高httpd服務器的吞吐率(更少的tcp連接意味著更少的系統內核調用,socket的`accept()`和`close()`調用)。 但是,`keep-alive`并不是免費的午餐,長時間的tcp連接容易導致系統資源無效占用。配置不當的`keep-alive`,有時比重復利用連接帶來的損失還更大。所以,正確地設置`keep-alive timeout`時間非常重要。 使用`http keep-alvie`,可以減少服務端`TIME_WAIT`數量(因為由服務端httpd守護進程主動關閉連接)。道理很簡單,相較而言,啟用`keep-alive`,建立的tcp連接更少了,自然要被關閉的tcp連接也相應更少了。 使用啟用`keepalive`的不同。另外,`http keepalive`是客戶端瀏覽器與服務端httpd守護進程協作的結果,所以,我們另外安排篇幅介紹不同瀏覽器的各種情況對`keep-alive`的利用。 [![](https://github.com/KeKe-Li/data-structures-questions/raw/master/src/images/106.jpg)](https://github.com/KeKe-Li/data-structures-questions/blob/master/src/images/106.jpg)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看