Linux

當網路突然終止時 TCP 連接會發生什麼

  • March 17, 2019

假設使用者空間應用程序與某個非本地端點建立了 TCP 連接。在某些時候,網路突然中斷(即在網路管理器中刪除連接,拔下 wifi 加密狗,切斷乙太網電纜)

核心內部在概念上發生了什麼來應對這種情況以及它如何向使用者空間應用程序表現出來?

指導子問題:

  • 涉及哪些超時?
  • 核心會在嘗試重新連接時嘗試從使用者空間隱藏連接失去嗎?
  • 等待響應會導致使用者空間應用程序不想正常退出嗎?

網路介面或其他基礎設施出現故障並不一定意味著“連接失去” - TCP 可能會在終止連接之前長時間嘗試重新傳輸(取決於發生了什麼 - 本地介面上的錯誤可能會立即導致錯誤,但路由器可能不會沿著路徑的某處下降)。

這不取決於核心,它是由 TCP 協議決定的,“使用者空間應用程序”很可能會等待很長時間才能收到套接字上的錯誤。

要具體回答每個子問題:

  • 我已經看到了在超時前最多 9 分鐘的建議(我認為其中一些超時可能是可配置的,協議允許它和 TCP keepalives 之類的東西可以配置為更早地導致超時);
  • 核心不會隱藏任何東西,或者嘗試“重新連接”,它只是遵循 TCP 協議,不斷地重新嘗試發送未確認的段……“使用者空間應用程序”只是在系統呼叫中暫停(例如 write ()、sendto() 等) 即“使用者空間應用程序”在核心模式下執行,它的上下文被切換出去,直到某個事件使程序再次“可執行”時才會切換回來;
  • 暫停時,“使用者空間應用程序”可能是“不可中斷的”,這意味著您無法殺死它,即使您以 root 身份使用 SIGKILL(即 kill -9) - “優雅退出”可能不是一個選項(雖然,我不’認為在套接字上發送不會發生這種情況,它必須是被認為是短期和高優先級的東西 - 例如寫入 NFS 上的文件,硬掛載和 intr 標誌未設置可以做到)……但即使它是一個選項,也必須編寫“app”以擷取錯誤並自行優雅退出 - 如果核心讓“app”退出,它不會是優雅的:-)(例如,它不會執行 exit處理程序或釋放在“應用程序”之外分配的資源等)

引用自:https://unix.stackexchange.com/questions/486117