簡體   English   中英

可以將打開的插座放置很長時間而不讀取它嗎?

[英]Can an open socket be left for a long time without reading from it?

我正在打開服務器的套接字,然后休眠,可能要花很長時間(幾天)。 該進程是單線程的,所以我沒有專用於管理套接字的線程。 套接字應保持活動狀態。 我假設服務器不發送任何需要客戶端響應的消息。

問題是,是否可以安全地假設套接字將保持活動狀態? Linux內核是否處理所需的TCP通信(例如,保持活動的數據包?),或者不時需要應用程序從套接字讀取?

如果服務器向客戶端發送一些消息怎么辦? 我假設有一些此類數據的緩沖區。 它有多大,如何更改,如果裝滿了怎么辦?

除了此處已說過的內容外,一段時間不活動后,防火牆和NAT可能會斷開TCP連接。 TCP保持活動消息的頻率可能不足以使TCP連接保持活動狀態。 這就是為什么許多應用程序級協議都具有應用程序級保持活動消息的原因(例如,我通常將ssh客戶端配置為每30分鍾發送一次保持活動消息,因為我的辦公室NAT在1小時后會斷開TCP連接)。

換句話說,您的應用程序可能希望在可配置的時間內一次與其遠程對等方交換一些消息。

或者,使用特定於平台的套接字選項來啟用TCP保持活動消息( SO_KEEPALIVE )並配置超時(在Linux上為TCP_KEEPIDLE )。

除非在客戶端或服務器上配置了TCP保持活動狀態,否則連接將無限期保持打開狀態,而無需執行任何操作。

但這只是理論,除非您使用保持活動機制,否則您將不能依靠它。

讓我們看一下TCP如何工作以了解這一點:通常,TCP通信伙伴將發送FIN包以通知另一只手它將關閉連接。 除非將發送/接收此類程序包,否則雙方都同意連接已打開。

但是,如果遠程主機由於停電而立即關閉怎么辦? 還是因為管理員對端口進行了防火牆保護(在建立連接之后)?

在這種情況下,另一個連接伙伴將不會注意到該事實,並且讀取操作將永遠被阻止。

為了解決這個問題,引入了內核保持活動。 使用這種機制,內核以可配置的時間間隔和周期將保持活動包發送到遠程端,期望使用ACK 如果沒有收到任何ACK ,則內核會假定遠程端不再可用,並從阻塞相關套接字上的讀取系統調用中返回。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM