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...