天天看點

關于 HTTP 和 TCP 的 keep-alive

Connection 頭(header) 決定目前的事務完成後,是否會關閉網絡連接配接。如果該值是“keep-alive”,網絡連接配接就是持久的,不會關閉,使得對同一個伺服器的請求可以繼續在該連接配接上完成。

關于 HTTP 和 TCP 的 keep-alive

那麼 TCP 連接配接是否也有 keep-alive 的概念呢?

我想打開與遠端伺服器的套接字連接配接。

現在這個套接字連接配接是否會永遠保持打開狀态,或者是否存在與 HTTP 保持活動類似的逾時限制?

簡短的回答是不,它不會永遠保持打開狀态,它可能會在幾個小時後逾時。 是以是的,有一個逾時,它是通過 TCP Keep-Alive 強制執行的。

如果您想在您的機器上配置 Keep-Alive 逾時,請參閱下面的“更改 TCP 逾時”部分。

TCP 連接配接由兩個套接字組成,連接配接的每一端各一個。 當一側想要終止連接配接時,它發送一個 RST 資料包,另一側确認并關閉它們的套接字。

然而,在此之前,雙方将無限期地保持他們的插座打開。 這留下了一側可能有意或由于某些錯誤而關閉其插座的可能性,而沒有通過 RST 通知另一端。 為了檢測這種情況并關閉過時的連接配接,使用了 TCP Keep Alive 程序。

Changing TCP Timeouts

Per Socket

不幸的是,由于 TCP 連接配接是在作業系統級别管理的,Java 不支援在每個套接字級别上配置逾時,例如在 java.net.Socket 中。 我發現了一些嘗試使用 Java 本機接口 (JNI) 來建立調用本機代碼來配置這些選項的 Java 套接字,但似乎沒有一個得到廣泛的社群采用或支援。

相反,您可能被迫将您的配置作為一個整體應用于作業系統。 請注意,此配置将影響整個系統上運作的所有 TCP 連接配接。

Linux

目前配置的 TCP Keep Alive 值:

/proc/sys/net/ipv4/tcp_keepalive_time

/proc/sys/net/ipv4/tcp_keepalive_probes

/proc/sys/net/ipv4/tcp_keepalive_intvl

采用下列腳本修改:

關于 HTTP 和 TCP 的 keep-alive