簡體   English   中英

使用Linux套接字檢測TCP重置

[英]Detecting a TCP reset with Linux sockets

當TCP鏈路的一端斷開連接時,它會向另一端發送重置(RST)消息。 我希望能夠在應用程序層中收到此信息。

在我的代碼中,我使用select()調用來接收來自潛在多個源的輸入,包括TCP連接。 我已經看到,當select()顯示有數據准備好在連接上讀取,然后read()調用返回0字節讀取,這發生在通過TCP發送RST之后。 (我理解recv()read()工作方式類似。)

僅當連接被重置時, read()是否在TCP連接上返回0字節(在select() )? 在任何其他情況下它是否會返回0字節?

我記得前一段時間在連接的另一端使用了一個特定的以太網設備,而這個Linux端在select()之后接收了0個字節,但不是用於連接重置,而是在某些數據流中途。 我在Wireshark中確認收到的數據包有0個數據字節。 這是一個錯誤,或者像上面的問題一樣,這種行為是否有效? 我不記得它是哪個設備,因為它是幾年前,但它使用的是Windows驅動程序。

當TCP鏈路的一端斷開連接時,它會向另一端發送重置(RST)消息。

不正常。

我希望能夠在應用程序層中收到此信息。

你會。

我已經看到,當select()顯示有數據准備好在連接上讀取,然后read()調用返回0字節讀取,這發生在通過TCP發送RST之后。

沒有。

僅當連接被重置時,read()是否在TCP連接上返回0字節(在select()之后)?

從不重置連接。 在這種情況下,它返回-1,並且errno == ECONNRESET

在任何其他情況下它是否會返回0字節?

當且僅當收到FIN時,它返回零,即對等體關閉連接,或關閉其套接字輸出。

如果您嘗試連接到沒有偵聽器的服務器上的端口,也會獲得RST。

假設您已連接到服務器並定期向其發送數據,但隨后服務器重新啟動,您的套接字對當然不再存在,然后您也會獲得RST。

通過使用我認為的套接字選項,服務器可以發送RST,但這不是一個好主意,服務器/客戶端應該在正常情況下使用套接字正常關閉,以便關閉通信,並讓TCP的4路握手可以做到這一點。

暫無
暫無

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

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