在tcp協議中rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或缺的。傳送rst包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄快取區的包傳送rst包。而接收端收到rst包後,也不必傳送ack包來確認。
在網路程式設計過程中,各種rst錯誤比較難排查和找到原因,基於此,根據以往的經驗以及找到的一些資料,整理了以下幾種rst的情況。
伺服器程式埠未開啟而客戶端來連線。這種情況是最為常見和好理解的一種了。去telnet乙個未開啟的tcp的埠可能會出現這種錯誤。這個和作業系統的實現有關。在某些情況下,作業系統也會完全不理會這些發到未開啟埠請求。
當然在某些作業系統的主機上,未必是這樣的表現。比如向一台windows7的主機傳送乙個連線不存在的埠的請求,這台主機就不會回應。
曾經遇到過這樣乙個情況:乙個客戶端連線伺服器,connect返回-1並且error=einprogress。 直接telnet發現網路連線沒有問題。ping沒有出現丟包。用抓包工具檢視,客戶端是在收到伺服器發出的syn之後就莫名其妙的傳送了rst。
有89、27兩台主機。主機89向主機27傳送了乙個syn,表示希望連線8888埠,主機27回應了主機89乙個syn表示可以連線。但是主機27卻很不友好,莫名其妙的傳送了乙個rst表示我不想連線你了。
後來經過排查發現,在主機89上的程式在建立了socket之後,用setsockopt的so_rcvtimeo選項設定了recv的超時時間為100ms。而我們看上面的抓包結果表示,從主機89發出syn到接收syn的時間多達110ms。(從15:01:27.799961到15:01:27.961886, 小數點之後的單位是微秒)。因此主機89上的程式認為接收超時,所以傳送了rst拒絕進一步傳送資料。
關於tcp,我想我們在教科書裡都讀到過一句話,』tcp是一種可靠的連線』。 而這可靠有這樣一種含義,那就是作業系統接收到的來自tcp連線中的每乙個位元組,我都會讓應用程式接收到。如果應用程式不接收怎麼辦?你猜對了,rst。
如果某個socket已經關閉,但依然收到資料也會產生rst。
幾種TCP連線中出現RST的情況
應該沒有人會質疑,現在是乙個網路時代了。應該不少程式設計師在程式設計中需要考慮多機 區域網 廣域網的各種問題。所以網路知識也是避免不了學習的。而且筆者一直覺得tcp ip網路知識在乙個程式設計師知識體系中必需占有一席之地的。在tcp協議中rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或...
幾種TCP連線中出現RST的情況
在tcp協議中rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或缺的。傳送rst包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄快取區的包傳送rst包。而接收端收到rst包後,也不必傳送ack包來確認。其實在網路程式設計過程中,各種rst錯誤其實是比較難排查和找到原因的。下面列出幾種會...
幾種TCP連線中出現RST的情況
應該沒有人會質疑,現在是乙個網路時代了。應該不少程式設計師在程式設計中需要考慮多機 區域網 廣域網的各種問題。所以網路知識也是避免不了學習的。而且筆者一直覺得tcp ip網路知識在乙個程式設計師知識體系中必需占有一席之地的。在tcp協議中rst表示復位,用來異常的關閉連線,在tcp的設計中它是不可或...