1. 程式人生 > >TCP 三次握手和四次揮手與重傳

TCP 三次握手和四次揮手與重傳

一、看圖說話

1、基於套接字的TCP伺服器/客戶端程式流程

 對TCP重傳的進一步認識

2TCP三次握手建立連線

 對TCP重傳的進一步認識

3TCP四次互動斷開連線

對TCP重傳的進一步認識

4TCP狀態轉移圖

對TCP重傳的進一步認識

這張圖看不懂的話解釋在計算機網路第四版P274。解釋下MSL:最長分節生存週期,他代表了IP資料報載網路上的最長生命週期。保證該連線上的資料包在網路中全部消失。

二、TCP重傳

1、重傳的原因

1)發端計時器超時

TCP每傳送一個報文段,就對這個報文段設定一次計時器。當計時器超時而沒有收到確認時,就重傳該報文。

注:原來報文哪去了呢?兩種可能:1)在中間節點丟了。2)還在路上,走的慢。

對於第一種情況:接收端是不知情的,而對於第二種情況,接收端表現為收到兩個一摸一樣的報文。

2)快重傳

原理說明:自己來張圖吧。

對TCP重傳的進一步認識

就是說在傳送端一連收到4ack報文,其中3個重複報文時,就立即重傳相應的報文而不等到定時器超時。

注:1)原來報文的去向以上同。

2)重傳報文可以與原報文不同,就是說重傳報文長度可以比原報文長也可以比原報文短等。

3)說明下逆序問題。還沒到快重傳的時候,走丟的包就出現了。這時候接收端保留逆序包,傳送端不用對其進行重傳。

 對TCP重傳的進一步認識

2、重傳的判定

TCM監測點要求計算一次HTTP過程的重傳率,公式:重傳率=重傳報文數/有效報文數

其中有效報文數:指的是除了純ACK包外的報文總數。因為純ACK包沒有重傳的說法。

重傳報文的判定分雙向進行,現在的演算法(簡要說明):

設定一個變數MaxSeq,初始化為0.每來一個包,檢視其seq,如果該seq大於MaxSeq,則

MaxSeq = seq,否則判定為重傳包。

該演算法的缺點:目前看到的情況,無法區分逆序後來的包和重傳包。如同逆序圖所示:其實M3只是遲到了,並沒有重傳,但我們的演算法卻把它判定為重傳報文。

不知有人對這個問題有所研究沒,歡迎發表意見。

三、因重傳引起的問題

1. 在測量過程中發現某個網站TCP連線的重置率特別高,抓包後發現,原來都是重傳惹的禍(FIN ACK包重傳)。

圖示:

對TCP重傳的進一步認識

對照狀態圖,可以理解當伺服器收到客戶端第一個Ack報文時,該次TCP連線就關閉了。再次收到ACK

,就出錯。