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分節總結
unix 網路程式設計中rst 分節總結 rst的含義為 復位 它是tcp 在某些錯誤情況下所發出的一種tcp 分節。有三個條件可以產生rst 1 syn 到達某埠但此埠上沒有正在監聽的伺服器。2 tcp 想取消乙個已有連線 3 tcp 接收了乙個根本不存在的連線上的分節。1 connect 函式返...
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...