你還在為 tcp 重傳、滑動視窗、流量控制、擁塞控制發愁嗎?一文搞定!
太厲害了,終於有人能把tcp/ip協議講的明明白白了!
tcp協議的滑動視窗具體是怎樣控制流量的?
滑動視窗協議的基本原理就是:
就像是這樣,乙個單位就要來回應答一次,效率實在太差:
老師說"從"
學生寫"從". 學生說"嗯"
老師說"前"
學生寫"前". 學生說"嗯"
老師說"今天我還想早點下班呢..."
視窗的實現實際上是作業系統開闢的乙個快取空間,傳送方主機在等到確認應答返回之前,必須在緩衝區中保留已傳送的資料。如果按期收到確認應答,此時資料就可以從快取區清除。
假設視窗大小為3
個 tcp 段,那麼傳送方就可以「連續傳送」3
個 tcp 段,並且中途若有 ack 丟失,可以通過「下乙個確認應答進行確認」。如下圖:
圖中的 ack 600 確認應答報文丟失,也沒關係,因為可以通話下乙個確認應答進行確認,只要傳送方收到了 ack 700 確認應答,就意味著 700 之前的所有資料「接收方」都收到了。
這個模式就叫累計確認或者累計應答。
tcp 頭里有乙個欄位叫window
,也就是視窗大小。
這個欄位是接收端告訴傳送端自己還有多少緩衝區可以接收資料。於是傳送端就可以根據這個接收端的處理能力來傳送資料,而不會導致接收端處理不過來。
通常視窗的大小是由接收方的決定的。
傳送方傳送的資料大小不能超過接收方的視窗大小,否則接收方就無法正常接收到資料。
對於tcp會話的傳送方,任何時候在其傳送快取內的資料都可以分為4類
下圖就是傳送方快取的資料,根據處理的情況分成四個部分,其中藍色方框是傳送視窗,紫色方框是可用視窗:
**「已經傳送但還未收到對端ack的」和「未傳送但對端允許傳送的」**這兩部分資料稱之為傳送視窗。
tcp 滑動視窗方案使用三個指標來跟蹤在四個傳輸類別中的每乙個類別中的位元組。其中兩個指標是絕對指標(指特定的序列號),乙個是相對指標(需要做偏移)。
那麼可用視窗大小的計算就可以是:
可用視窗大小 = snd.wnd -(snd.nxt - snd.una)
當傳送方把資料「全部」都一下傳送出去後,可用視窗的大小就為 0 了,表明可用視窗耗盡,在沒收到 ack 確認之前是無法繼續傳送資料了。
當收到之前傳送的資料32~36
位元組的 ack 確認應答後,如果傳送視窗的大小沒有變化,則滑動視窗往右邊移動 5 個位元組,因為有 5 個位元組的資料被應答確認,接下來52~56
位元組又變成了可用視窗,那麼後續也就可以傳送52~56
這 5 個位元組的資料了。
接收視窗相對簡單一些,根據處理的情況劃分成三個部分:
三個接收部分,使用兩個指標進行劃分:
並不是完全相等。
接收視窗的大小約等於傳送視窗的大小。
因為滑動視窗並不是一成不變的。
比如,當接收方的應用程序讀取資料的速度非常快的話,這樣的話接收視窗可以很快的就空缺出來。
那麼新的接收視窗大小,是通過 tcp 報文中的 windows 欄位來告訴傳送方。
那麼這個傳輸過程是存在時延的,所以接收視窗和傳送視窗是約等於的關係。
m1,m2,m3,m4,m5,丟失m2;怎麼重傳m2?
因為每個tcp報文被傳送時,都會設定乙個重傳定時器,若定時期到了還沒收到ack包,則應重傳。
為什麼不用重傳m4,m5?
因為採用了累積確認。有例如下:
server 傳送80個位元組 part1,seq = 1
server 傳送120個位元組part2,seq = 81
server傳送160個位元組part3,seq = 201,此包由於其他原因丟失
client收到前2個報文段,並傳送ack = 201
server傳送140個位元組part4, seq = 361
server收到client對於前兩個報文段的ack,將2個報文從視窗中移除,視窗有200個位元組的餘量
報文3的重傳定時器到期,沒有收到ack,進行重傳
這個時候client已經收到報文4,存放在緩衝區中,也不會傳送ack【累計通知,傳送ack就表示3也收到了】,等待報文3,報文3收到之後,一塊對3,4進行確認
server收到確認之後,將報文3,4移除視窗,所有資料傳送完成
1)最基本的傳輸可靠性**於「確認重傳」機制。
2)tcp的滑動視窗的可靠性也是建立在「確認重傳」基礎上的。
3)傳送視窗只有收到對端對於本段傳送視窗內位元組的ack確認,才會移動傳送視窗的左邊界。
4)接收視窗只有在前面所有的段都確認的情況下才會移動左邊界。當在前面還有位元組未接收但收到後面位元組的情況下,視窗不會移動,並不對後續位元組確認。以此確保對端會對這些資料重傳。
TCP滑動視窗
目前建立在tcp協議上的網路協議特別多,有telnet,ssh,有ftp,有http等等。這些協議又可以根據資料吞吐量來大致分成兩大類 1 互動資料型別,例如telet,ssh,這種型別的協議在大多數情況下只是做小流量的資料交換,比如說按一下鍵盤,回顯一些文字等等。2 資料成塊型別,例如ftp,這種...
TCP滑動視窗
假設a和b之間新建立了一條tcp連線。裝置a需要傳送一長串資料流,但裝置b無法一次全部接收,所以它限制裝置a每次傳送分段指定數量的位元組數,直到分段中已傳送的位元組數得到確認。之後,裝置a可以繼續傳送更多位元組。每乙個裝置都對傳送,接收及確認資料進行追蹤。tcpbuffer中資料可以分為以下四類 1...
TCP滑動視窗
tcp滑動視窗是用來控制流量的,避免擁塞的發生。滑動視窗又包括接收端滑動視窗和傳送端滑動視窗,下面我們簡單分析一下。上圖顯示的是接收緩衝區,其中接收視窗也在其中。接收視窗的大小是8,即4 12,此時由a可知,接收端下乙個預計接收序列號4,當接收端接收到4 7之後,滑動視窗就會右移,此時接收端預計接收...