如何判定TCP報文超時


上一篇文章已經簡單介紹了TCP連接三次握手、四次揮手的原理。

有網友對如何判定TCP報文超時有點疑惑,這里作者按照自己的理解簡單闡述一下,如有錯誤與不足之處,歡迎大家指正和交流。

 

2*MSL(最長報文段壽命)與報文沒有關系,每次客戶端或者服務器發出報文之后都會開始計時 2*MSL (除第二次揮手外)。

在2*MSL時間內,對於報文發送方而言, 無論是報文發送失敗(如①)還是接收失敗(如②),報文發送方本身是不知道的。在規定的時間內沒有接收到該接收的報文(如①②)或者接收到了不該接收的報文(如③)都會判定上一次報文超時,然后重傳。

這里還要注意一個問題:在③階段客戶端如何判定發來的FIN是不是正確的,是不是之前延時才到的呢?是接收還是丟棄呢?如果丟棄,時間已經到了2*MSL,就要關閉連接進入CLOSE狀態。如果接收就要重傳ACK報文。

這就涉及到了TCP時間戳選項Timestamp

時間戳選項發送方在每個報文段中放置一個時間戳值。接收方在確認中返回這個數值,從而允許發送方為每一個收到的ACK計算RTT(注意是“每一個收到的ACK”而不是“每一個收到的報文段”,是因為TCP通常用一個ACK來確認多個報文段)。

TimeStamp選項主要有兩個用途:
1. 測量TCP連接兩端通訊的延遲(Round Trip Time Measurement)。
    有了RTTM機制。TCP的兩端能夠非常容易的推斷出線路上報文的延遲情況。從而制定出一個優化的發包間隔和報文TimeOut時間。

2.TCP收端收到一個數據報文后,會先比較本次收到報文的TimeStamp和上次收到報文的TimeStamp。假設本次的比較新,那么能夠直接推斷本次收到的報文是新的報文,不須要進行復雜的Sequence Number Window Scale計算。

這樣子③階段客戶端就知道此次發來的報文相對於上一次接收到的報文是新的還是舊的,如果是新的,那么就會接收該報文,重傳ACK,否則就丟棄該報文,關閉連接。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM