上層網路裝置斷線,ubuntu下tcp established 狀態連線總是等待15分鐘才關閉,為什麼?
- 背景: 客戶端:ubuntu 下 tcp socket 長連線;每 30 秒發一次心跳;發出的訊息都需要服務端 ACK(ACK 自身除外),未收到 ACK 則關閉連線;部署在客戶現場,出口公網電信; 服務端:ubuntu 下 tcp socket 長連線自定義服務端;收到任何訊息都需要發 ACK(ACK 自身除外);60 秒內未收到任何訊息(含心跳),則關閉連線;部署在阿里雲;
- 問題: 客戶現場出口網路裝置不穩定,經常閃斷;導致客戶端 socket 處於 tcp established 狀態下傳送 send 訊息不報錯,但收不到 ACK,於是主動關閉連線 close。在主動呼叫關閉 close 連線後,socket 一直存在,且為 established 狀態,直到 15 分鐘左右才會消失。每次都是如此,原因何在?
分析: 1)established 狀態下,上層網路裝置斷網,socket 一般不會立刻感知(觸發 close); 2)那麼, 可能是 established 狀態下,重傳或超時機制導致的;
核實: 檢視客戶現場 ubuntu 主機 tcp 相關引數:sysctl -a |grep tcp root@Anjie:~# sysctl -a |grep tcp ..... net.ipv4.tcp_retries1 = 3 net.ipv4.tcp_retries2 = 15 net.ipv4.tcp_rfc1337 = 0 net.ipv4.tcp_rmem = 4096 87380 6291456 net.ipv4.tcp_sack = 1 net.ipv4.tcp_slow_start_after_idle = 1 net.ipv4.tcp_stdurg = 0 net.ipv4.tcp_syn_retries = 6 net.ipv4.tcp_synack_retries = 5 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_thin_dupack = 0 net.ipv4.tcp_thin_linear_timeouts = 0 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_tso_win_divisor = 3 net.ipv4.tcp_tw_recycle = 0 net.ipv4.tcp_tw_reuse = 0 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_wmem = 4096 16384 4194304 net.ipv4.tcp_workaround_signed_windows = 0 ...... 逐個引數排查(主要明白用途,調整影響,參考https://blog.csdn.net/hytfly/article/details/53426630) 注意到引數: net.ipv4.tcp_retries2 = 15 TCP 失敗重傳次數,預設值 15,意味著重傳 15 次才徹底放棄.可減少到 5,以儘早釋放核心資源
驗證: 設定成 1(net.ipv4.tcp_retries2 = 1 ) 後,斷開上層路由,觀察到 socket 連線很快就消失了(約 1 分鐘);close 事件觸發,socket 進入重連機制。
總結: net.ipv4.tcp_retries2 控制 established 狀態下訊息重傳次數;調小可以提高中間網路斷開的感知靈敏度。
思考: 如果 net.ipv4.tcp_retries2 = 15 不變更,上層網路在 15 分鐘內恢復正常,在恢復正常時間範圍內傳送的訊息能正常到達服務端嗎?有興趣的同學可以嘗試下。
注:寫得匆忙,省略了很多細節,權當備忘錄了。
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- 什麼是Socket連線?它與TCP連線有什麼關係TCP
- 網路連線總超時?從四層模型上解析網路是怎麼連線的模型
- VirtualBox 本地網路連線無線狀態下連線虛擬機器虛擬機
- TCP為什麼是有狀態的?TCP
- HarmonyOS 如何獲取裝置資訊(系統、版本、網路連線狀態)
- 網路學習筆記(一):TCP連線的建立與關閉筆記TCP
- TCP連線狀態異常記錄TCP
- 統計TCP連線數和狀態TCP
- win10連線不上網路印表機怎麼辦 為什麼連線不上印表機Win10
- win10系統網路總掉線怎麼辦_win10網路連線不穩總是掉線斷網如何處理Win10
- 手機網路連線效能API介面:查詢手機網路連線效能狀態API
- 系統程式設計-網路-tcp客戶端伺服器程式設計模型(續)、連線斷開、獲取連線狀態場景程式設計TCP客戶端伺服器模型
- 在 TIME_WAIT 狀態的 TCP 連線,收到 SYN 後會發生什麼?AITCP
- 什麼是伺服器【三網直連】線路?伺服器
- 判斷網路是否連線
- Android APP如何獲取裝置網線插拔的狀態AndroidAPP
- 網路連線狀態檢視工具:Internet Status for MacMac
- Internet Status Mac網路連線狀態檢視工具Mac
- 什麼是3C直連網路?什麼是3C精品專線網路?
- 記錄一次網路連線除錯問題只有tcp客戶端為什麼自己會連線上自己除錯TCP客戶端
- 解鎖伺服器連線狀態新姿勢:tcping工具助你高效診斷網路連通性伺服器TCP
- Mac網路連線狀態檢視工具:Internet Status for MacMac
- 連線上網路無法上網
- 超市無線網路的關鍵需求因素是什麼?
- 五分鐘瞭解網路連線
- 網路連線斷開如何解決 win10系統網路連線經常斷開Win10
- [從0到1編寫伺服器]TCP連線建立與斷開狀態變化伺服器TCP
- TCP 兩次握手為什麼無法阻止歷史連線?TCP
- 無線網路卡狀態不對問題:已連線 顯示 未連線
- win10網路總是自動掉線斷網怎麼辦_win10網路自動掉線斷網的解決教程Win10
- WebSocket 是什麼原理?為什麼可以實現持久連線?Web
- 網際網路的寒冬下各大一線網際網路公司還在用SpringBoot這是為什麼?Spring Boot
- 我為 Netty 貢獻原始碼 | 且看 Netty 如何應對 TCP 連線的正常關閉,異常關閉,半關閉場景Netty原始碼TCP
- tcp 連線TCP
- 判斷是否能連線網際網路
- win10突然斷網無線能連線上但不能上網怎麼辦Win10
- TCP連線的TIME_WAIT和CLOSE_WAIT 狀態解說TCPAI
- Windows10系統關閉離線狀態的方法Windows