當前位置:編程學習大全網 - 源碼下載 - [tcp]關於tcp套接字中的“連接被對等方重置”和“管道斷開”。

[tcp]關於tcp套接字中的“連接被對等方重置”和“管道斷開”。

在socket通信過程中,經常會發現客戶端或服務器的日誌中出現“管道斷開”或“連接被對等體重置”的錯誤提示。

我曾經以為我理解了這兩個錯誤異常提示的意思,其實我完全理解錯了。

我的誤解類似於blogspot的以下聲明:

```

也許我只是傻,但我壹直認為“管道破裂”意味著,“在我完成發送之前,這個套接字的另壹端關閉了”和“由對等方重置連接”意味著,嗯,大致相同的事情。(以及指出壹些稍微深奧的問題。)

然而,結果是,“破裂的管道”實際上意味著“我只是試圖發送壹些東西,而套接字已經關閉了發送。”

因此,在下面的示例中,如果(TCP)套接字的另壹端“sock”在write方法之前關閉或終止,將引發“由對等方重置連接”。下壹次寫入將給出壹個管道中斷錯誤,因為套接字現在知道進壹步發送是無效的。

```

```

嘗試:

sock.write('foo ')

除了:

對等方重置pass #連接

sock.write('bar') #管道破裂

```

在下列情況下,RST的標誌位將被置位。以下是我了解到的情況,可能還有更多場景,未得到驗證:

1.當試圖與未打開的服務器端口建立tcp連接時,服務器tcp會直接向客戶端發送重置消息。

2.雙方之前都正常建立過溝通渠道,也可能有過互動。當壹方在交互過程中出現異常,比如崩潰,異常方會向對方發送復位消息,通知對方關閉連接。

3.當接收到壹條TCP報文,但發現該報文不可由已建立的TCP連接列表處理時,直接向對端發送reset報文。

4.ACK報文丟失超過壹定的重傳次數或時間後,會主動向對端發送reset報文,釋放TCP連接。

實際上,我們在java異常中看到的由對等信息重置的斷開的管道或連接不是在jdk或jvm中定義的。當我看到這些關鍵詞的時候,我經常會去搜索jdk或者hotspot的源代碼,尋找進行上下文分析的位置,但是沒有找到,只覺得應該是在Linux或者glibc中定義的。果然在glibc看到了上面的描述和定義。

對於損壞的管道,當管道的另壹端沒有進程讀取時,將引發此異常。對等體重置連接的描述實際上並不十分正確。從我的實踐來看,只描述了壹個方面。事實上,這種異常可能發生在某壹端正常關閉之後。

對等體重置連接和管道破裂的場景:

1)當向對端已經關閉的通道寫數據時,對方的tcp會收到此消息,並反饋壹條復位消息。當您收到復位消息時,當您繼續選擇讀取數據時,您將會拋出Connect reset by peer異常。

2)當第壹次向對端已關閉的通道寫入數據時,您將收到與上述情況相同的復位消息。當再次向這個套接字寫入數據時,它會拋出壹個破管道。按照tcp的約定,當收到reset包時,上層必須進行處理,並調用關閉socket文件描述符,這實際上意味著管道將被關閉,所以顧名思義會拋出這個異常。

從tcp原理的角度理解斷管和對等體重置連接的區別

/blog/2065 438+04/05/20/TCP-管道破裂

tcp套接字出現“對等連接重置”和“斷管”的原因分析

/2015/04/07/% E5 % 85% B3 % E4 % BA % 8 TCP套接字% E5 % 87 % BA % E7 % 8E % B0 % E7 % 9A %連接-由對等方重置% E5 % 92 %代理管道

  • 上一篇:寧波名勝古跡
  • 下一篇:婚禮微信邀請模板(常用8個)
  • copyright 2024編程學習大全網