1. 程式人生 > >tcp可靠傳輸的機制有哪些(面試必看

tcp可靠傳輸的機制有哪些(面試必看

導致 方便 綜述 其它 ack 嚴重 管理 聯系 緩沖

一、綜述

1、確認和重傳:接收方收到報文就會確認,發送方發送一段時間後沒有收到確認就重傳。

2、數據校驗

3、數據合理分片和排序:

  UDP:IP數據報大於1500字節,大於MTU.這個時候發送方IP層就需要分片(fragmentation).把數據報分成若幹片,使每一片都小於MTU.而接收方IP層則需要進行數據報的重組.這樣就會多做許多事情,而更嚴重的是,由於UDP的特性,當某一片數據傳送中丟失時,接收方便無法重組數據報.將導致丟棄整個UDP數據報.

  tcp會按MTU合理分片,接收方會緩存未按序到達的數據,重新排序後再交給應用層。

4、流量控制:當接收方來不及處理發送方的數據,能提示發送方降低發送的速率,防止包丟失。

5、擁塞控制:當網絡擁塞時,減少數據的發送。

二、滑動窗口

  上面籠統地說了tcp保證可靠傳輸的機制,下面說說如何用滑動窗口來實現。

為什麽要使用滑動窗口

因為發送端希望在收到確認前,繼續發送其它報文段。比如說在收到0號報文的確認前還發出了1-3號的報文,這樣提高了信道的利用率。但可以想想,0-4發出去後可能要重傳,所以需要一個緩沖區維護這些報文,所以就有了窗口。

  RTT:往返時間。

窗口是什麽

接收窗口:

  

  “接收窗口”大小取決於應用(比如說tomcat:8080端口的監聽進程)、系統、硬件的限制。圖中,接收窗口是31~50,大小為20。

  在接收窗口中,黑色的表示已收到的數據,白色的表示未收到的數據。

  當收到窗口左邊的數據,如27,則丟棄,因為這部分已經交付給主機;

  當收到窗口左邊的數據,如52,則丟棄,因為還沒輪到它;

  當收到已收到的窗口中的數據,如32,丟棄;

  當收到未收到的窗口中的數據,如35,緩存在窗口中。

發送窗口:

  發送窗口的大小swnd=min(rwnd,cwnd)。rwnd是接收窗口,cwnd用於擁塞控制,暫時可以理解為swnd= rwnd =20。

  圖中分為四個區段,其中P1到P3是發送窗口。

  tips:發送窗口以字節為單位。為了方便畫圖,圖中展示得像以報文為單位一樣。但這不影響理解。

三、重傳和確認

什麽時候發確認:這是一個復雜的策略。我們這裏先簡單地認為每收到一個報文就發一個確認。

怎麽確認(累計確認):

  情況1:發送ack=31(為什麽這個也要發,這個確認可以用於後面的擁塞控制)

  情況2:發送ack=34,並把接收窗口左邊緣設置成34,右邊緣設置成53

  

  累計確認的好處:情況1中ack=31比描述收到32和33簡單;壞處:可能要重傳已經接收的數據。

發送方收到確認時怎麽處理:

  

  情況1:收到ack=31,什麽都不做,或者說繼續發送可用窗口中的內容,如42~50

  情況2:收到ack=34,發送窗口窗口的左邊緣設置成34,右邊緣設置成53

什麽時候重傳:因為每個報文都有超時計數器,超時才重傳。超時重傳時間的選擇也是一個策略。

tcp緩存和窗口的關系:窗口是緩存的一部分。

發送緩存=發送窗口+ P3右邊的一部分

接收緩存=接收窗口+部分已確認但主機還沒處理完的數據。

四、流量控制

一圖流,簡單來說就是接收方處理不過來的時候,就把窗口縮小,並把窗口值告訴發送端。

  

當窗口值為0,而接受方把窗口值恢復(比如ACK=1,ack=601,rwnd=200),但確認丟失,進入相互等待的死鎖局面。所以如果窗口值為0,發送端就會開啟一個持續計數器,每個一段時間詢問一下接收方。

五、擁塞控制

swnd=min(rwnd,cwnd),cwnd就是擁塞窗口大小。

慢開始和擁塞避免

ssthresh:處理擁塞時參照的一個參數。例子中初始值為16,後來變為12。

當cwnd> ssthresh,cwnd以慢開始的方法指數增長;

當cwnd< ssthresh,cwnd以擁塞避免的方法線性增長。

值得註意的幾個點

1上圖是cwnd隨傳輸輪次的變化,每過一個RTT就算一輪。

2超時就可以認為是擁塞了

快重傳和快恢復:上一個算法的加強版

快重傳:收到3個同樣的確認就立刻重傳,不等到超時;

快恢復:cwnd不是從1重新開始。