TCP 保活定時器詳解:原理、配置與最佳實踐

一、TCP 保活定時器基礎原理

TCP 保活定時器(TCP Keepalive Timer)是 TCP 協議中用于檢測長時間無數據傳輸的連接是否仍然有效的機制。它通過在連接空閑一段時間后發送探測報文,確認對方主機是否仍然可達,從而避免在對端異常斷開時,本地連接一直處于僵死狀態。

1.1 保活機制的必要性

在網絡編程中,TCP 連接可能會遇到以下兩種主要問題:

  1. 無法偵測非正常斷開的連接:當網絡連接中斷(如網線被拔出)或對端主機崩潰時,TCP 協議本身并不能自動偵測到這種情況。此時,兩端的套接字可能會永遠保持打開狀態。
  2. 連接可能被中間設備中斷:網絡路徑中的路由器、防火墻等設備可能會主動斷開長時間沒有活動的連接。這些設備通常會有一個空閑連接的超時時間,超過這個時間后會關閉連接。

基于上述原因,TCP 需要一種機制來維持連接的活性,或者在連接失效時及時發現并清理。

1.2 保活定時器的工作流程

TCP 保活定時器的工作過程可以分為以下幾個關鍵步驟:

  1. 連接建立與初始化:當 TCP 連接建立后,保活定時器會被初始化,并設置保活時間(KeepAliveTime)、保活時間間隔(KeepAliveInterval)和保活探測次數(KeepAliveProbes)三個參數。
  2. 空閑時間檢測:當連接上沒有數據傳輸的時間達到保活時間閾值時,TCP 會向對方發送一個保活探測報文(KeepAlive Probe)。
  3. 響應處理:根據對方的響應情況,連接可能進入以下幾種狀態:
    • 正常響應:如果對方主機正常工作并收到探測報文,會返回一個 ACK 響應。此時,保活定時器會被重置,重新開始計時。
    • 無響應:如果對方主機崩潰或不可達,探測報文將沒有響應。此時,TCP 會在等待保活時間間隔后再次發送探測報文。
    • RST 響應:如果對方主機崩潰后重新啟動,會返回一個 RST 報文,表示連接重置。此時,本地連接會被關閉。
  1. 連接狀態判斷:如果在發送了指定次數(保活探測次數)的探測報文后仍未收到響應,TCP 會認為連接已經死亡,并將錯誤信息通知給應用層。

1.3 與其他機制的區別

TCP 保活機制需要與其他類似機制區分開來:

  1. 與 HTTP Keep-Alive 的區別
    • HTTP 的 Keep-Alive 目的是讓 TCP 連接保持更長時間,以便在多個 HTTP 請求中復用同一個連接,提高通信效率。
    • TCP 的 Keep-Alive 機制則是為了探測連接的對端是否存活,是一種檢測 TCP 連接狀況的保鮮機制。
  1. 與應用層心跳機制的區別
    • TCP 保活是傳輸層的機制,由操作系統內核實現,對應用層透明。
    • 應用層心跳是由應用程序自己實現的,通常通過在應用協議中定義特定的心跳包來實現。

二、TCP 保活定時器的關鍵參數

TCP 保活定時器涉及三個關鍵參數,這些參數在不同操作系統上有不同的默認值和配置方式:

2.1 保活時間(KeepAliveTime)

  • 定義:保活時間是指連接在沒有數據傳輸時,TCP 開始發送保活探測報文前的等待時間。
  • 默認值:不同操作系統有不同的默認值,通常為 7200 秒(2 小時)。
  • 作用:控制 TCP 連接在多長時間無活動后開始進行保活探測。設置過短會增加網絡流量,過長則可能導致連接長時間處于無效狀態。

2.2 保活時間間隔(KeepAliveInterval)

  • 定義:保活時間間隔是指兩次連續的保活探測報文之間的時間間隔。
  • 默認值:通常為 75 秒。
  • 作用:控制保活探測報文的發送頻率。設置過短可能導致在網絡不穩定時頻繁發送探測報文,過長則會延長檢測連接失效的時間。

2.3 保活探測次數(KeepAliveProbes)

  • 定義:保活探測次數是指 TCP 在認為連接失效前發送的保活探測報文的最大數量。
  • 默認值:通常為 9 次。
  • 作用:控制 TCP 在放棄前嘗試探測的次數。設置過少可能導致誤判,過多則會增加檢測時間。

2.4 連接失效總時間計算

連接從空閑到被判定為失效的總時間可以通過以下公式計算:

總時間 = 保活時間 + 保活時間間隔 × 保活探測次數

以默認值計算:7200 秒 + 75 秒 × 9 = 7200 秒 + 675 秒 = 7875 秒(約 2 小時 11 分鐘)。這一時間對于大多數現代應用來說過長,因此通常需要調整這些參數。

三、不同操作系統的 TCP 保活實現

不同操作系統對 TCP 保活機制的實現和默認參數有較大差異,這對開發人員在跨平臺開發時需要特別注意。

3.1 Linux 系統的 TCP 保活實現

Linux 系統中的 TCP 保活機制由以下幾個系統參數控制:

net.ipv4.tcp_keepalive_time   # 保活時間,默認7200秒
net.ipv4.tcp_keepalive_intvl  # 保活間隔,默認75秒
net.ipv4.tcp_keepalive_probes # 保活探測次數,默認9次

可以通過以下命令查看當前系統的設置:

$ sysctl -a | grep net.ipv4.tcp_keepalive
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75

可以使用以下命令臨時修改這些參數:

$ sysctl -w net.ipv4.tcp_keepalive_time=60 net.ipv4.tcp_keepalive_probes=3 net.ipv4.tcp_keepalive_intvl=10

要使修改永久生效,需要將這些設置添加到/etc/sysctl.conf文件中。

在 Linux 中,應用程序可以通過setsockopt系統調用設置套接字選項,覆蓋系統級的 TCP 保活設置:

int keepalive = 1; // 開啟保活功能
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
int keepidle = 60; // 保活時間60秒
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
int keepinterval = 10; // 保活間隔10秒
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepinterval, sizeof(keepinterval));
int keepcount = 3; // 保活探測次數3次
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepcount, sizeof(keepcount));

3.2 Windows 系統的 TCP 保活實現

Windows 系統的 TCP 保活機制由以下注冊表項控制:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ParametersKeepAliveTime      # 保活時間,默認7200000毫秒(2小時)KeepAliveInterval  # 保活間隔,默認1000毫秒(1秒)

注意:Windows 系統沒有提供修改保活探測次數的選項,該值被硬編碼為 10 次。

要修改 Windows 的 TCP 保活設置,需要:

  1. 打開注冊表編輯器(regedit)
  2. 導航到上述路徑
  3. 添加或修改 KeepAliveTime 和 KeepAliveInterval 的值(DWORD 類型,單位為毫秒)
  4. 重啟計算機使設置生效

在 Windows 中,應用程序可以通過setsockopt函數設置套接字選項:

int keepalive = 1;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, (char*)&keepalive, sizeof(keepalive));
DWORD keepalivetime = 60000; // 60秒
setsockopt(sock, SOL_SOCKET, TCP_KEEPALIVE, (char*)&keepalivetime, sizeof(keepalivetime));

3.3 macOS 系統的 TCP 保活實現

macOS 系統的 TCP 保活機制由以下參數控制:

net.inet.tcp.keepidle   # 保活時間,默認7200000毫秒(2小時)
net.inet.tcp.keepintvl  # 保活間隔,默認75000毫秒(75秒)
net.inet.tcp.keepcnt    # 保活探測次數,默認8次

可以通過以下命令查看當前設置:

$ sysctl -a | grep net.inet.tcp.keep
net.inet.tcp.keepidle = 7200000
net.inet.tcp.keepintvl = 75000
net.inet.tcp.keepcnt = 8

在較新版本的 macOS(如 macOS 13 及以上)中,需要創建一個 LaunchDaemon 來設置這些參數。創建文件/Library/LaunchDaemons/sysctl.plist,內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict><key>Label</key><string>sysctl</string><key>Program</key><string>/usr/sbin/sysctl</string><key>ProgramArguments</key><array><string>/usr/sbin/sysctl</string><string>net.inet.tcp.keepidle=60000</string><string>net.inet.tcp.keepintvl=5000</string><string>inet.inet.tcp.keepcnt=3</string></array><key>RunAtLoad</key><true/>
</dict>
</plist>

然后加載該配置:

$ sudo launchctl load /Library/LaunchDaemons/sysctl.plist

在 macOS 中,應用程序可以通過setsockopt函數設置套接字選項:

int keepalive = 1;
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
int keepidle = 60; // 60秒
setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
int keepintvl = 10; // 10秒
setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl));
int keepcnt = 3; // 3次
setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt));

3.4 主要操作系統 TCP 保活參數對比

下表總結了主要操作系統的 TCP 保活默認參數:

參數名稱

Linux

Windows

macOS

保活時間 (秒)

7200

7200

7200

保活間隔 (秒)

75

1

75

保活探測次數

9

10 (固定)

8

總檢測時間

約 2h11m

約 2h10m

約 2h5m

從表中可以看出,雖然各操作系統的默認保活時間相同,但保活間隔和探測次數存在差異,導致總檢測時間略有不同。

四、在開發中合理運用 TCP 保活定時器

4.1 啟用 TCP 保活的方法

在不同的編程語言和框架中,啟用 TCP 保活定時器的方法各有不同,但基本思路都是通過設置套接字選項來實現。

4.1.1 C/C++ 中啟用 TCP 保活

在 C/C++ 中,可以使用setsockopt函數來設置 TCP 保活選項:

int keepalive = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
// 設置保活時間(秒)
int keepidle = 60;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
// 設置保活間隔(秒)
int keepinterval = 10;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepinterval, sizeof(keepinterval));
// 設置保活探測次數
int keepcount = 3;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepcount, sizeof(keepcount));
4.1.2 Java 中啟用 TCP 保活

在 Java 中,可以通過Socket類的setKeepAlive方法啟用 TCP 保活:

import java.net.Socket;
Socket socket = new Socket();
socket.setKeepAlive(true); // 啟用TCP保活
// Java 11及以上版本支持設置具體參數
import jdk.net.ExtendedSocketOptions;
socket.setOption(ExtendedSocketOptions.TCP_KEEPIDLE, 60); // 保活時間60秒
socket.setOption(ExtendedSocketOptions.TCP_KEEPINTVL, 10); // 保活間隔10秒
socket.setOption(ExtendedSocketOptions.TCP_KEEPCNT, 3); // 保活探測次數3次

需要注意的是,Java 中設置 TCP 保活參數的能力依賴于操作系統和 Java 版本的支持。

4.1.3 Python 中啟用 TCP 保活

在 Python 中,可以通過socket模塊的setsockopt方法啟用 TCP 保活:

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
# 設置保活時間(秒)
s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 60)
# 設置保活間隔(秒)
s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 10)
# 設置保活探測次數
s.setsockopt(socket.SOL_TCP, socket.TCP_KEEPCNT, 3)
4.1.4 其他編程語言

其他編程語言如 Go、Node.js 等,也都提供了類似的套接字選項設置方法,具體可以參考相應語言的文檔。

4.2 應用層心跳機制與 TCP 保活的比較

雖然 TCP 保活機制提供了基本的連接檢測功能,但在某些情況下,應用層心跳機制可能是更好的選擇。下表比較了兩者的優缺點:

特性

TCP 保活機制

應用層心跳機制

實現位置

操作系統內核

應用程序代碼

對應用透明

靈活性

低,受限于系統參數

高,可以自定義協議

檢測精度

較低,無法區分網絡故障和對端崩潰

高,可以自定義檢測邏輯

資源消耗

低,由內核處理

較高,需要應用層處理

跨平臺一致性

差,各系統實現不同

好,應用程序統一控制

適用場景對比

  • 適合使用 TCP 保活的場景
    • 對性能要求極高,資源有限的系統
    • 需要統一管理所有連接的場景
    • 對檢測精度要求不高的場景
  • 適合使用應用層心跳的場景
    • 需要更精細控制檢測邏輯的場景
    • 需要區分網絡故障和對端崩潰的場景
    • 需要跨平臺一致性的場景
    • 應用層協議本身需要心跳機制的場景(如 IM、游戲等)

4.3 保活定時器的局限性

TCP 保活機制雖然有用,但也存在一些局限性:

  1. 無法區分網絡故障和對端崩潰:當保活探測失敗時,TCP 無法確定是對方主機崩潰,還是中間網絡路徑出現了問題。
  2. 可能導致誤判:在網絡短暫中斷的情況下,TCP 保活可能會錯誤地關閉一個實際上仍然有效的連接。
  3. 增加額外網絡流量:保活探測報文會增加網絡帶寬消耗,雖然每個探測報文很小,但在大量連接的情況下可能會累積成顯著的流量。
  4. 受限于操作系統實現:不同操作系統對 TCP 保活的實現和參數設置有很大差異,這可能導致在跨平臺應用中出現不一致的行為。

五、TCP 保活定時器的配置建議與最佳實踐

5.1 合理配置保活參數

根據不同的應用場景,TCP 保活參數的配置策略也應有所不同。以下是一些通用的配置建議:

5.1.1 通用配置建議

對于大多數現代網絡應用,推薦將 TCP 保活參數調整為以下值:

  • 保活時間(KeepAliveTime):30-60 秒
  • 保活間隔(KeepAliveInterval):10-20 秒
  • 保活探測次數(KeepAliveProbes):3-5 次

這樣的配置可以在 30-160 秒內檢測到連接失效,比默認的 2 小時檢測時間大大縮短。

5.1.2 不同場景下的配置策略

高可靠場景(如金融交易系統):

  • 保活時間:15-30 秒
  • 保活間隔:5-10 秒
  • 保活探測次數:5-7 次
  • 目標:快速檢測連接失效,確保交易安全

高并發場景(如 Web 服務器):

  • 保活時間:60-120 秒
  • 保活間隔:20-30 秒
  • 保活探測次數:3-5 次
  • 目標:平衡連接檢測速度和資源消耗

長連接場景(如物聯網設備):

  • 保活時間:300-600 秒
  • 保活間隔:60-120 秒
  • 保活探測次數:3-5 次
  • 目標:減少不必要的探測,節省帶寬和電量

跨 NAT 場景(如 P2P 應用):

  • 保活時間:60-120 秒
  • 保活間隔:30-60 秒
  • 保活探測次數:3-5 次
  • 目標:保持 NAT 映射表條目有效,防止連接被 NAT 設備刪除

5.2 配置保活的最佳實踐

根據多年的網絡編程經驗,以下是關于 TCP 保活定時器的最佳實踐:

  1. 默認情況下不啟用 TCP 保活:由于 TCP 保活存在局限性,建議在應用層實現自己的心跳機制,除非有特殊原因需要使用 TCP 層的保活。
  2. 根據應用場景調整參數:不同的應用場景對連接檢測的要求不同,應根據具體需求調整保活參數,而不是使用默認值。
  3. 優先考慮應用層心跳:應用層心跳機制比 TCP 保活更靈活、更可控,特別是在需要區分不同類型故障的場景中。
  4. 監控連接狀態:無論使用 TCP 保活還是應用層心跳,都應該監控連接的狀態變化,及時發現并處理異常連接。
  5. 測試不同網絡條件下的行為:在部署前,應該在各種網絡條件下測試應用的連接管理策略,確保其在網絡不穩定、延遲高或丟包率高的環境中仍能正常工作。
  6. 文檔化配置:詳細記錄應用使用的 TCP 保活配置參數及其原因,方便后續維護和調整。
  7. 避免過度探測:設置保活參數時,應避免過于頻繁的探測,以減少網絡流量和系統資源消耗。
  8. 考慮防火墻和 NAT 設備:某些防火墻和 NAT 設備可能會干擾 TCP 保活探測,應測試并調整參數以適應這些設備。

5.3 云環境中的特殊考慮

在云環境中使用 TCP 保活時,需要特別注意以下幾點:

  1. 云負載均衡器的超時設置:大多數云提供商的負載均衡器都有自己的空閑連接超時設置,通常為 60-90 秒。為了確保連接不被負載均衡器中斷,TCP 保活的探測周期應小于這個值。
  2. 云 NAT 網關的會話超時:如果使用了云 NAT 網關,需要了解其會話超時設置,并確保 TCP 保活的探測頻率足夠高,以保持 NAT 會話有效。
  3. 虛擬機的網絡代理:某些云提供商會在虛擬機前部署網絡代理或虛擬網絡設備,這些設備可能會影響 TCP 保活的行為,需要測試和調整。
  4. 區域間網絡延遲:跨區域的云服務調用可能會有較高的網絡延遲,需要適當增加保活間隔和探測次數,避免誤判。

六、典型應用場景分析

6.1 Web 服務器與客戶端的連接管理

在 Web 服務器環境中,TCP 保活定時器可以幫助服務器及時發現失效的客戶端連接,釋放系統資源。

配置建議

  • 保活時間:30-60 秒
  • 保活間隔:10-20 秒
  • 保活探測次數:3 次

實現方法

在 Nginx 服務器中,可以通過以下配置啟用 TCP 保活:

proxy_http_version 1.1;
proxy_set_header Connection "";
keepalive_timeout 60s;
keepalive_requests 100;

在 Apache 服務器中,可以通過以下配置啟用 TCP 保活:

KeepAlive On
KeepAliveTimeout 60
MaxKeepAliveRequests 100

6.2 數據庫連接池管理

數據庫連接池通常需要保持一定數量的空閑連接,TCP 保活可以幫助檢測這些連接是否仍然有效。

配置建議

  • 保活時間:60-120 秒
  • 保活間隔:20-30 秒
  • 保活探測次數:3-5 次

實現方法

在 PostgreSQL 中,可以通過以下參數配置 TCP 保活:

tcp_keepalives_idle = 60  # 保活時間(秒)
tcp_keepalives_interval = 20  # 保活間隔(秒)
tcp_keepalives_count = 3  # 保活探測次數

在 MySQL 中,可以通過以下參數配置 TCP 保活:

wait_timeout = 28800  # 服務器關閉非交互連接前的等待秒數
interactive_timeout = 28800  # 服務器關閉交互連接前的等待秒數

6.3 物聯網設備連接管理

物聯網設備通常通過長連接與服務器通信,TCP 保活可以幫助檢測設備是否離線或網絡連接是否中斷。

配置建議

  • 保活時間:300-600 秒
  • 保活間隔:60-120 秒
  • 保活探測次數:3-5 次

實現方法

在物聯網設備端,可以通過以下代碼啟用 TCP 保活:

// 啟用TCP保活
int keepalive = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
// 設置保活時間(秒)
int keepidle = 600;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
// 設置保活間隔(秒)
int keepinterval = 120;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepinterval, sizeof(keepinterval));
// 設置保活探測次數
int keepcount = 5;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepcount, sizeof(keepcount));

6.4 實時通信系統

實時通信系統(如即時通訊、在線游戲)通常需要保持長連接,TCP 保活可以幫助檢測連接狀態。

配置建議

  • 保活時間:30-60 秒
  • 保活間隔:10-20 秒
  • 保活探測次數:3 次

實現方法

在實時通信系統中,可以考慮同時使用 TCP 保活和應用層心跳:

// 啟用TCP保活
int keepalive = 1;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepalive, sizeof(keepalive));
// 設置較短的保活時間
int keepidle = 30;
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle));
// 應用層心跳每15秒發送一次
while (connected) {send_heartbeat();sleep(15);
}

七、總結與展望

7.1 TCP 保活定時器的價值與局限

TCP 保活定時器作為 TCP 協議的一部分,為長時間無數據傳輸的連接提供了基本的檢測機制,幫助應用程序及時發現失效的連接并進行處理。然而,由于其實現上的局限性,它并不能完全替代應用層的心跳機制。

TCP 保活的主要價值在于:

  • 提供了一種標準的、由操作系統內核實現的連接檢測機制
  • 對應用層透明,無需應用程序特別處理
  • 資源消耗較低,特別是與應用層心跳相比

TCP 保活的主要局限在于:

  • 各操作系統實現不一致,參數差異大
  • 無法區分網絡故障和對端崩潰
  • 檢測時間較長,默認設置下需要 2 小時以上才能檢測到連接失效
  • 可能導致誤判,在網絡短暫中斷時關閉有效連接

7.2 未來發展趨勢

隨著網絡技術的不斷發展,TCP 保活機制也在不斷演進:

  1. 更精細的控制:未來的操作系統可能會提供更多參數,允許更精細地控制 TCP 保活的行為。
  2. 與 QUIC 協議的結合:隨著 QUIC 協議的普及,未來可能會出現類似 TCP 保活的機制,但更適應基于 UDP 的傳輸協議。
  3. AI 驅動的連接管理:人工智能技術可能會被應用于連接管理,根據歷史數據和當前網絡狀況動態調整保活參數,優化連接質量和資源使用。
  4. 標準化的應用層心跳協議:可能會出現標準化的應用層心跳協議,提供跨平臺、跨語言的統一解決方案。

7.3 開發人員的行動建議

對于開發人員來說,針對 TCP 保活定時器,可以采取以下行動:

  1. 深入理解機制:全面掌握 TCP 保活的工作原理、參數設置和不同操作系統的實現差異,為合理使用打下基礎。
  2. 根據場景選擇策略:根據應用場景和需求,選擇合適的連接檢測策略,是使用 TCP 保活、應用層心跳,還是兩者結合。
  3. 測試與優化:在不同網絡條件下測試應用的連接管理策略,不斷優化參數設置,確保應用在各種環境中都能穩定工作。
  4. 監控與日志:實現完善的連接狀態監控和日志記錄,及時發現并解決連接問題。
  5. 關注技術發展:跟蹤 TCP 協議和網絡技術的最新發展,及時應用新的、更高效的連接管理方法。

TCP 保活定時器雖然是一個相對基礎的網絡技術,但在現代網絡應用中仍然扮演著重要角色。通過合理配置和使用,可以顯著提高應用的穩定性和可靠性,為用戶提供更好的體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/88753.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/88753.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/88753.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

瀏覽器工作原理27 [#]PWA:解決了web應用哪些問題

引用 《瀏覽器工作原理與實踐》 PWA&#xff0c;全稱是 Progressive Web App &#xff0c;翻譯過來就是漸進式網頁應用。根據字面意思&#xff0c;它就是“漸進式 Web 應用”。對于 Web 應用很好理解了&#xff0c;就是目前普通的 Web 頁面&#xff0c;所以 PWA 所支持的首先是…

Leetcode百題斬-圖論

再開下一個坑&#xff0c;圖論專題居然以前都刷過了&#xff0c;三道Medium也沒什么好說的&#xff0c;直接過 994. Rotting Oranges[Medium] 發現一個很神奇的事&#xff0c;這一題我再5年前的時候做&#xff0c;還是個Easy&#xff0c;現在已經漲到Medium了。看來隨著通貨膨…

將Python Tkinter程序轉換為手機可運行的Web應用 - 詳細教程

前言 作為一名Python開發者&#xff0c;你可能已經使用Tkinter創建了一些桌面GUI應用。但是如何讓這些應用也能在手機上運行呢&#xff1f;本教程將詳細介紹如何將基于Tkinter的Python程序轉換為手機可訪問的Web應用&#xff0c;讓你的應用隨時隨地可用&#xff01; 一、為什…

Markdown批量轉PDF工具:高效便捷的文檔轉換解決方案

Markdown批量轉PDF工具&#xff1a;高效便捷的文檔轉換解決方案 前言 在日常工作和學習中&#xff0c;我們經常需要將Markdown文檔轉換為PDF格式&#xff0c;無論是為了分享、打印還是歸檔。雖然有很多在線工具可以實現這一功能&#xff0c;但當面對大量文檔時&#xff0c;逐…

51c~嵌入式~PLC~歐姆龍~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/14017854 > PLC-- 歐姆龍 --專輯 一、歐姆龍PLC指令應用 歐姆龍PLC是一種功能完善的緊湊型PLC&#xff0c;能為業界領先的輸送分散控制等提供高附加值機器控制&#xff1b;它還具有通過各種高級內裝板進行升級的能…

機器人 URDF學習筆記

目錄 URDF&#xff08;Unified Robot Description Format&#xff09; ? URDF 描述的內容包括&#xff1a; URDF&#xff08;Unified Robot Description Format&#xff09; 意思是&#xff1a;統一機器人描述格式。 它是一種用 XML 編寫的格式&#xff0c;專門用于描述機器…

MySQL-主從復制分庫分表

5 MySQL-主從復制&分庫分表 5.1mysql 主從復制 5.1.1. 概述 主從復制是將主數據庫的DDL和DML操作通過二進制日志&#xff08;binlog文件&#xff09;傳送到從庫服務器&#xff0c;然后在從庫上對這些日志重新執行&#xff0c;從而使得主庫和從庫的數據保持同步。 MySQL…

7.6.平衡二叉樹(英文縮寫為AVL樹)

一.平衡二叉樹的定義&#xff1a; 1.平衡二叉樹簡稱平衡樹(AVL樹&#xff0c;該縮寫來源于平衡二叉樹的發明人的名字簡稱)&#xff1b; 2.結點的平衡因子左子樹高-右子樹高&#xff1b; 3.以上述圖片左下角的二叉樹為例&#xff0c;結點50的左子樹的高度為2&#xff0c;右子樹…

OpenCV CUDA模塊設備層-----將指向共享內存(shared memory)的指針封裝成一個 tuple函數smem_tuple()

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV的cv::cudev模塊中的一個用于 CUDA 編程的輔助函數&#xff0c;用于將指向共享內存&#xff08;shared memory&#xff09;的指針封裝成一…

paddlepaddle在RTX40系安裝注意事項

1 安裝簡介 1.1 安裝注意事項 顯卡型號&#xff1a;RTX4090 驅動版本&#xff1a;550.54.14 宿主機cuda版本&#xff1a;12.4 安裝方式&#xff1a;conda 注意cuda和cudnn的搭配 最初安裝是為了使用PaddleOCR&#xff0c;根據官網提示需要安裝cuda和cudnn。這里最關鍵的就是針…

車載以太網-組播

目錄 車載以太網中的組播:從原理到車載應用**一、組播的核心概念與車載網絡價值****二、車載以太網組播的關鍵協議與機制**1. **組播IP地址管理(IGMP協議)**2. **組播數據鏈路層實現(MAC地址映射)****三、車載以太網組播的典型應用場景**1. **自動駕駛與傳感器數據分發**2…

【雅思播客013】what do you do

【dialog】 A: Oh, look, there’s Veronica and her boyfriend.She’s always going on about him at the of?ce. Oh, great, they saw us. They’re coming this way. B: Oh, man... C: Jessica! Arthur! Hi! I’d like you to meet my boyfriend Greg, he’s the VP. of q…

Freebsd 14.2系統下 wifi網卡硬件驅動軟件配置調試大全

Freebsd 14.2系統下&#xff0c;網卡是AX200 先檢查網卡sysctl net.wlan.devices sysctl net.wlan.devices 能識別出已經安裝的 sysctl net.wlan.devices net.wlan.devices: iwlwifi0配置wlan0 # ifconfig wlan0 create wlandev iwlwifi0 # ifconfig wlan0 up # ifconfig …

Python打卡:Day39

知識點回顧 圖像數據的格式&#xff1a;灰度和彩色數據模型的定義顯存占用的4種地方 模型參數梯度參數優化器參數數據批量所占顯存神經元輸出中間狀態 batchisize和訓練的關系 浙大疏錦行

使用 GcExcel .NET 將 Excel 導出為 PDF

引言 在企業級應用開發中&#xff0c;經常需要將Excel數據導出為PDF格式以便于共享和打印。GrapeCity Documents for Excel&#xff08;簡稱GcExcel&#xff09;作為一款高性能的.NET Excel組件&#xff0c;提供了強大的PDF導出功能。本文將詳細介紹如何使用GcExcel .NET實現E…

每日算法刷題Day39 6.26:leetcode前綴和2道題,用時1h20min

8. 2055.蠟燭之間的盤子(中等,學習替換查詢區間) 2055. 蠟燭之間的盤子 - 力扣&#xff08;LeetCode&#xff09; 思想 1.給你一個長桌子&#xff0c;桌子上盤子和蠟燭排成一列。給你一個下標從 0 開始的字符串 s &#xff0c;它只包含字符 * 和 | &#xff0c;其中 * 表示一…

jrebel 下載,安裝,激活步驟

參考地址&#xff1a; [筆記] 最新版 - JRebel 插件激活與配置教程 : 高效開發的必備指南_jrebel激活-CSDN博客https://blog.csdn.net/LuChangQiu/article/details/145547828 1、下載 2、激活地址&#xff1a; http://42.193.18.168:8088 ### 撿個便宜 - 交朋友吧 ###https://…

uniapp使用plus調取藍牙/usb打印

安卓使用usb調取打印機 /*** 安卓usb調取打印機*param { string | bytes[] } html 傳入的打印內容*傳入一段文本或一個bytes數組* returns*/ export const printUsb (html) > {return new Promise((resolve, reject) > {if (!window.plus) return reject(new Error(&qu…

區塊鏈數據結構:區塊與鏈式結構編碼

目錄 區塊鏈數據結構:區塊與鏈式結構編碼引言:區塊鏈的骨架1. 區塊鏈數據結構解析1.1 區塊結構組成1.2 區塊鏈可視化結構2. 區塊核心組件詳解2.1 區塊頭字段說明2.2 Merkle樹結構2.3 工作量證明機制3. Python實現區塊鏈數據結構3.1 區塊類實現3.2 區塊鏈類實現3.3 區塊鏈演示…

阿里推出 R1-Omni:將強化學習與可驗證獎勵(RLVR)應用于全模態大語言模型

從視頻中識別情感涉及許多細微的挑戰。僅依賴視覺或音頻信號的模型&#xff0c;往往無法準確捕捉這兩種模態之間的復雜相互作用&#xff0c;從而導致對情感內容的誤解。一個關鍵難題在于可靠地結合視覺線索&#xff08;如面部表情或肢體語言&#xff09;與聽覺信號&#xff08;…