UNIX網絡編程中RST分節總結

定義:RST表示復位,RST=1表示TCP中出現嚴重錯誤(因爲主機崩潰或其它緣由),必須釋放鏈接。RST=1還可用來拒絕一個非法的報文段或拒絕打開一個鏈接。發送RST後不會再有正常的四分組終止序列(Unix網絡編程so_linger選項)。html

有三個條件能夠產生RST:
*SYN到達某端口但此端口上沒有正在監聽的服務器(針對TCP而言,UDP則返回端口不可達ICMP錯誤)。
*TCP想取消一個已有鏈接(使用套接字SO_LINGER選項)。
*TCP接收了一個根本不存在的鏈接上的分節。
編程

 

 

1.  Connect 函數返回錯誤ECONNREFUSED:服務器

若是對客戶的SYN的響應是RST,則代表該服務器主機在咱們指定的端口上沒有進程在等待與之鏈接(例如服務器進程也許沒有啓動),這稱爲硬錯(hard error),客戶一接收到RST,立刻就返回錯誤ECONNREFUSED.網絡

 

TCP爲監聽套接口維護兩個隊列。兩個隊列之和不超過listen函數第二個參數backlog函數

當一個客戶SYN到達時,若兩個隊列都是滿的,TCP就忽略此分節,且不發送RST.這個由於:這種狀況是暫時的,客戶TCP將重發SYN,指望不久就能在隊列中找到空閒條目。要是TCP服務器發送了一個RST,客戶connect函數將當即發送一個錯誤,強制應用進程處理這種狀況,而不是讓TCP正常的重傳機制來處理。還有,客戶區別不了這兩種狀況:做爲SYN的響應,意爲「此端口上沒有服務器」的RST和意爲「有服務器在此端口上但其隊列滿」的RST.ui

Posix.1g容許如下兩種處理方法:忽略新的SYN,或爲此SYN響應一個RST.歷史上,全部源自Berkeley的實現都是忽略新的SYNspa

 

2.若是殺掉服務器端處理客戶端的子進程,進程退出後,關閉它打開的全部文件描述符,此時,當服務器TCP接收到來自此客戶端的數據時,因爲先前打開的那個套接字接口的進程已終止,因此以RST響應。

常常遇到的問題:.net

若是不判斷read , write函數的返回值,就不知道服務器是否響應了RST, 此時客戶端若是向接收了RST的套接口進行寫操做時,內核給該進程發一個SIGPIPE信號。此信號的缺省行爲就是終止進程,因此,進程必須捕獲它以避免不情願地被終止。unix

進程不管是捕獲了該信號並從其信號處理程序返回,仍是不理會該信號,寫操做都返回EPIPE錯誤。htm

 

3.服務器主機崩潰後重啓

若是服務器主機與客戶端創建鏈接後崩潰,若是此時,客戶端向服務器發送數據,而服務器已經崩潰不能響應客戶端ACK,客戶TCP將持續重傳數據分節,試圖從服務器上接收一個ACK,若是服務器一直崩潰客戶端會發現服務器已經崩潰或目的地不可達,但可能須要比較長的時間; 若是服務器在客戶端發現崩潰前重啓,服務器的TCP丟失了崩潰前的全部鏈接信息,因此服務器TCP對接收的客戶數據分節以RST響應。

參考資料:http://blog.chinaunix.net/uid-24410388-id-3947704.html        

             http://blog.csdn.net/seu_lyr/article/details/8596122

相關文章
相關標籤/搜索