甲:發送「seq:x,len:y」給乙;緩存
乙:回覆的確認號,x+y,表示它收到了x+y以前的全部字節;網絡
綜合上面SEQ和ACK的計算,能夠發現:tcp
(1)理論上,接收方回覆的Ack剛好就等於發送方的下一個seq號;性能
(2)TCP的確認是能夠累積的;優化
(3)這幾個參數的意義:spa
包亂序時,接收方只要根據Seq號從小到大從新排好就好了,保證了TCP的有序性;3d
有包丟失時,接收方判斷丟了哪些包的方法:經過前一個Seq+Len的值與下一個Seq的差,保證了TCP的可靠性;server
現實中存在一些限制,如接收方的緩存(接收窗口)可能一會兒接受不了這麼多數據,而網絡的帶寬也不必定足夠大,一口氣發太多會致使丟包事故,TCP的發送窗口就是發送方一口氣能夠發送的數據量。blog
Tcp Dup Ack xxx#y 表明了數據段丟失的TCP狀態,xxx表明數據丟失的位置,#後表明第幾回丟失文;ci
快速重傳是對超時重傳的優化,當觸發3個及以上dup ack包時,會觸發重傳;可是若是丟了報,且沒有觸發快速重傳,就只能等待超時重傳了。
下面是丟包對大文件和小文件影響的區別,緣由就在於上面一段的描述:
說明亂序了,前一個包沒有收到,收到後面的包了。
下面抓包來自於手機利用FTP下載文件速率小的案例。
tcp重複確認:表示該ACK包發生了丟失,致使發送方對包進行了重傳,網關測抓包,發現,最嚴重的一個丟包是,一個包重傳了37次:(同一個包的dup ack的時間間隔約10ms,能夠以725這個包爲例分析,該包重傳了37次);
「SACK方案」
一樣對網關測抓包TCP頭中的sack信息進行分析:
一個dup ack包,725#3,是725號包的第三次重傳ack,內容以下:
SACK=32121~33581和35041~37961,而ACK=29201,這樣,FTP server就會知道:
32121~33581和35041~37961都已經收到了,而前面的29201~32120之間的2920個字節沒有收到;
故: