UNIX網路程式設計中RST分節總結

2021-05-18 07:56:11 字數 1551 閱讀 6904

unix

網路程式設計中rst

分節總結

rst的含義為「復位」,它是tcp

在某些錯誤情況下所發出的一種tcp

分節。有三個條件可以產生rst:

1), syn

到達某埠但此埠上沒有正在監聽的伺服器。

2), tcp

想取消乙個已有連線

3), 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.

posix.1g

允許以下兩種處理方法:忽略新的syn

,或為此syn

響應乙個rst.

歷史上,所有源自berkeley

的實現都是忽略新的syn。

2.如果殺掉伺服器端處理客戶端的子程序,程序退出後,關閉它開啟的所有檔案描述符,此時,當伺服器tcp

接收到來自此客戶端的資料時,由於先前開啟的那個套接字介面的程序已終止,所以以rst

響應。經常遇到的問題:

如果不判斷read , write

函式的返回值,就不知道伺服器是否響應了rst, 

此時客戶端如果向接收了rst

的套介面進行寫操作時,核心給該程序發乙個sigpipe

訊號。此訊號的預設行為就是終止程序,所以,程序必須捕獲它以免不情願地被終止。

程序不論是捕獲了該訊號並從其訊號處理程式返回,還是不理會該訊號,寫操作都返回epipe

錯誤。

3.伺服器主機崩潰後重啟

如果伺服器主機與客戶端建立連線後崩潰,如果此時,客戶端向伺服器傳送資料,而伺服器已經崩潰不能響應客戶端ack

,客戶tcp

將持續重傳資料分節,試圖從伺服器上接收乙個ack

,如果伺服器一直崩潰客戶端會發現伺服器已經崩潰或目的地不可達,但可能需要比較長的時間;如果伺服器在客戶端發現崩潰前重啟,伺服器的tcp

丟失了崩潰前的所有連線資訊,所以伺服器tcp

對接收的客戶資料分節以rst

響應。

UNIX網路程式設計中RST分節總結

rst的含義為 復位 它是tcp在某些錯誤情況下所發出的一種tcp分節。有三個條件可以產生rst 1 syn到達某埠但此埠上沒有正在監聽的伺服器。2 tcp想取消乙個已有連線 3 tcp接收了乙個根本不存在的連線上的分節。1 connect 函式返回錯誤econnrefused 如果對客戶的syn的...

UNIX網路程式設計

在unix network programming 的 3.7 inet pton and inet ntop functions 中提到中有如下兩個巨集定義 define inet addrstrlen 16 for ipv4 dotted decimal define inet6 addrstr...

unix網路程式設計

任何tcp的實現都需要為msl選擇乙個合適的值,rfc的建議值是2分鐘。分組可能出現迷途,若迷途分組在msl中找到路,造成重複,tcp必須修復 time wait存在的理由 可靠的實現全雙工的連線和終止 考慮最終ack丟失的情況,允許老的重複分組在網路中消逝 tcp的化生身現象,因為time wai...