連線保持活動但端點已死?

連線保持活動但端點已死?

有誰知道什麼會導致 TCP 連線(客戶端)保持在 ESTABLISHED 狀態大約 24 小時,即使伺服器已重新啟動?客戶端進程保持在recv系統呼叫上並且保持這種狀態而不會導致錯誤!

客戶端安裝在 Ubuntu 11.04 上。這種情況已經在我身上發生過幾次了,但我似乎不明白為什麼或如何解決它。

答案1

連線在一側保持 ESTABLISHED 狀態,而在另一側不存在,因為這是伺服器重新啟動後它所處的狀態。客戶端不知道伺服器重新啟動,伺服器也不知道客戶端認為它仍然處於連線狀態。除非客戶端嘗試使用該連接,否則它將永遠保持這種狀態。 (除非啟用了保活,在這種情況下,它通常會保持這種狀態大約兩天。)

為什麼客戶端要永遠等待伺服器?客戶端或協定被破壞。如果客戶端不遵循協議,則客戶端就會損壞。如果協定沒有指定如何偵測死連接,則協定被破壞。

TCP 不會偵測未嘗試傳送資料的一端的死連線。因此每個協定都位於 TCP 之上必須設計時要考慮到這一點。如果這種卡住的連接是不可接受的行為,則該協議被破壞,因為它允許這種不可接受的行為(或客戶端因不遵循協議而被破壞)。

協議規範真的說要等嗎永遠為了數據?如果是這樣,我會質疑該協議開發人員的理智。

相關內容