初步認識TCP協議 TCP的reset報文

2021-08-14 19:54:00 字數 1437 閱讀 6794

當本次tcp接收到不正確的tcp報文(即埠號與ip位址為本機,但對方的ip位址本機不認識,或是對應埠上沒有tcp連線)時,會傳送reset報文通知對方放棄連線。tcp連線是通過socket對來標識連線的(即本機與對方的ip位址加埠號)。

傳送rst包關閉連線時,不必等緩衝區的包都發出去,直接就丟棄緩衝區中的包,傳送rst

在如下情況會傳送reset報文:

1、傳送連線請求到沒有程序監聽(處於listen狀態)的埠

2、客戶端和伺服器的某一方在互動的過程中發生異常(如程式崩潰等)

,該方系統將向對端傳送

tcp reset

報文,告之對方釋放相關的

tcp連線

,當應用程式想要傳送reset報文時,會將還未處理的本次tcp連線的報文全部丟棄,然後傳送reset報文,接收方tcp會通知應用程式直接放棄本次連線,同時不會傳送ack。

3、接收端收到

tcp報文,但是發現該

tcp的報文,並不在其已建立的

tcp連線列表內,則其直接向對端傳送

reset報文

4、在互動的雙方中的某一方長期未收到來自對方的確認報文,則其在超出一定的重傳次數或時間後,會主動向對端傳送

reset

報文釋放該

tcp連線

5、有些應用開發者在設計應用系統時,會利用

reset

報文快速釋放已經完成資料互動的

tcp連線,以提高業務互動的效率 6、

檢測半關閉連線

如果一方已經關閉或異常終止連線而另一方卻還不知道,我們將這樣的tcp連線稱為半開啟的。任何一端的主機異常都可能導致發生這種情況。只要不打算在半開啟連線上傳輸資料,仍處於連線狀態的一方就不會檢測另一方已經出現異常。下面介紹一種建立半開啟連線的情形。在bsdi上執行telnet客戶程式,通過它和svr4上的丟棄伺服器建立連線。接著斷開伺服器主機與乙太網的電纜,並重啟伺服器主機。這可以模擬伺服器主機出現異常(在重啟伺服器之前斷開乙太網電纜是為了防止它向開啟的連線傳送fin,某些tcp在關機時會這麼做)。伺服器主機重啟後,我們重新接上電纜,並從客戶向伺服器傳送一行字元。由於伺服器的tcp已經重新啟動,它將丟失復位前連線的所有資訊,因此它不知道資料報文段中提到的連線。tcp處理的原則是接收方以復位作為應答。

由於傳送reset報文不會有ack,若reset報文丟失,且半開放方一直未傳送報文,是否意味著tcp會一直處於半關閉的狀態?

不會,tcp有乙個存活計數器,用於判斷對方是否還與自己建立連線,若在規定時間裡未接受到對方的報文,則會reset本次連線。

傳送完reset報文後,若建立socket相同的連線,之前連線的在網路上的延遲報文會不會被誤認為是新建立連線的報文?

不會,如果序列號與確認號不同,則不會接收相應的報文,在rfc754中規定,isn每隔4ms isn的值就會遞增,在32位的情況下,從0開始增長到最大值需要4.5小時,所以之前連線的報文與當前連線ack相等的概率很低,基本可以忽略。

TCP協議初步理解(一)

tcp作為傳輸控制協議,控制著傳輸層。為了保證資料可靠傳遞,主要有兩種方法保證資料傳輸可靠性。重新傳送也能處理超差問題,所以重試是很多通訊協議的基礎,包括了tcp。既然有重試,那傳送方必須知道什麼時候停止重試,也就是說需要接受者的響應,一般稱之為ack。這裡又會牽扯到新的問題。第乙個問題比較麻煩,t...

TCP初步學習

盜圖一張 最近在學tcp服務開發 先來乙個最初版本的 服務端 include pch.h include include winsock2必須放在windows上面,因為早期的window已經實現了winsock,會引起衝突 include include using namespace std p...

TCP協議 傳輸控制協議TCP(1)

tcp協議具有以下特點 1 tcp協議是面向連線的,工作在運輸層。也就是說,tcp協議在傳輸資料之前需要先建立連線,傳輸結束後要釋放連線。3 tcp連線是可靠的。通過tcp連線可以無差錯的傳輸資料,使資料不丟失 不重複且按序到達。4 tcp提供全雙工的通訊。5 面向位元組流。所謂的面向位元組流就是說...