文章編號:11479時間:2024-09-30人氣:
在探討網絡性能優化與數據傳輸可靠性時,TCP/IP滑動窗口成為關鍵技術。 本文深入剖析滑動窗口的工作原理,探討其在確保數據準確性和實現高效通信方面的重要性。 通過解析滑動窗口大小、流控制和數據包確認機制,揭示了如何通過優化窗口大小和流控制參數來提升網絡性能。 流量控制是確保接收方能及時接收數據的關鍵,TCP利用滑動窗口機制實現這一功能。 網絡上的數據傳輸需要考慮接收方的接收能力與網絡上可發送數據包的大小,接收方通過告知發送方其接收窗口大小來實現這一控制。 持續計時器機制解決了發送方和接收方相互等待的死鎖問題。 當一方收到對方的零窗口通知時,啟動持續計時器。 若計時器超時,發送方發送零窗口探測報文,并等待接收方回復。 如果回復中窗口大小仍為零,發送方重新啟動持續計時器。 零窗口探測報文的發送與重傳計時器結合使用,確保了這一過程的可靠性。 RTT(往返時間)是衡量網絡狀態的重要指標。 它由鏈路傳播時間、末端系統處理時間以及路由器緩存中排隊和處理時間組成。 RTT的計算有助于網絡擁塞控制,通過RTT可以反映網絡擁塞程度,進而調整網絡傳輸策略。 RTO(重傳超時時間)定義了重傳報文的時間限制。 當網絡出現延遲導致報文超時未被確認時,TCP進入Loss狀態,重傳所有未被確認的報文,并啟動慢啟動恢復過程。 這一機制有助于避免網絡擁塞和提高傳輸效率。 慢啟動與擁塞控制是TCP管理網絡流量的關鍵策略。 在慢啟動階段,窗口大小以指數增長,實現高效數據傳輸。 當窗口大小達到特定閾值時,進入擁塞控制階段,窗口大小以線性增長,以避免網絡擁塞。 隨著窗口大小的增長,網絡傳輸速率提高,但當出現網絡擁塞時,分組超時重傳。 快重傳與快恢復算法進一步優化了TCP性能。 當個別報文段丟失時,發送方可以盡早發現并快速重傳,避免啟動慢啟動算法,從而提高網絡吞吐量。 快恢復機制則允許發送方在丟失個別報文段后,迅速調整窗口大小,進入擁塞避免階段。 TCP基于字節為單位的滑動窗口實現可靠傳輸。 窗口大小動態調整,基于網絡狀態和接收方能力。 RTT計算有助于推算窗口大小,確保數據傳輸的準確性和高效性。 當接收方不接收數據(recv)而發送方持續發送(send)時,數據可能滯留在發送方緩沖區,直至緩沖區飽和。 此時,發送方會通過返回-1告知應用程序IO不可寫。 TCP不保證接收序號的順序性,但應用程序可以確保數據取用的順序性。 適當延遲回復ACK可以提高傳輸效率,但需注意避免超時重傳,一般延遲不超過0.5秒。 總結,TCP/IP滑動窗口是實現高效、可靠的網絡數據傳輸的關鍵技術,通過合理配置和優化參數,可以顯著提升網絡性能。 關注公眾號獲取更多學習資源,系統提升學習與技能。
TCP是面向連接的,可靠 的,流式 傳輸的協議。 在TCP的里面有7種定時器分別是 顧名思義,這個定時器是在建立連接的時候使用的, 我們知道, TCP建立連接需要3次握手: 如果client在連接server的時候, 在發送SYN的時候, 會啟動一個定時器(在 3.10 版本中首次超時時間是 1 s,一些老版本中是 3 s。 ),如果SYN包丟失了, 那么1秒以后會重新發送SYN包的(當然還會啟動一個新的定時器, 設置成2秒超時),當然也不會一直沒完沒了的發SYN包, 在/proc/sys/net/ipv4/tcp_syn_retries 可以設置到底要重新發送幾次SYN包。 對于TCP發送出去的數據包, 需要等待對端發來ACK才能從內存里面刪除, 那么如果對端沒有發送ACK怎么辦? 重傳。 在發送數據的同時,再設置一個超時時間(一般設置成2個RTT的時間),如果在這個超時時間內, 沒有收到ACK,那么就重傳剛才發送的數據。 顧名思義, 這個定時器是在延遲應答的時候使用的。 為什么要延遲應答呢? 比如客戶端發一段數據給服務端, 服務端本應該立刻回ACK給客戶端的, 延遲應答是為了提高網絡傳輸的效率, 比如服務端收到客戶端的數據后, 不是立刻回ACK給客戶端, 而是等一段時間(一般最大200ms),這樣如果服務端要是有數據需要發給客戶端,那么這個ACK就和服務端的數據一起發給客戶端了, 這樣比立即回給客戶端一個ACK節省了一個數據包。 堅持定時器是在收到receive window為0的時候開始啟動的, 為什么需要這個呢? 比如最后一個ACK丟了, 那么發送端就永遠認為接收端的窗口是0, 那么就發不了數據了。 這個時候就需要堅持定時器,每隔一段時間(第一個探測包是在收到窗口為0的消息后的5秒)發送一個字節的探測包給服務端, 如果服務端窗口不是0了, 會在ack里面更新窗口大小的。 如果客戶端和服務端長時間沒有數據交互,那么需要保活定時器來判斷是否對端還活著,但是這個其實很不實用,因為默認是2小時沒有數據交互才探測,時間實在是太長了。 如果你真的要確認對端是否活著, 那么應該在應用層自己實現心跳包,而不是依賴于這個保活定時器。 在主動關閉的一端調用完close以后(發FIN包給對端, 并且收到對端對FIN的ACK)則進入到FIN_WAIT_2狀態, 那么這個時候如果和對端之間的網絡壞了或者對端程序有問題了一直不close, 或者對端機器直接掉電了, 本端不能一直傻等, 所以就需要這個定時器. 如果在這個定時器超時的時候,還是沒收到對端的FIN包, 那么不好意思, 不等了, 直接釋放這個鏈接。 這個定時器的時間是多少呢?可以從/proc/sys/net/ipv4/tcp_fin_timeout里面看到。 TIME_WAIT是主動關閉連接的一端最后進入的狀態, 而不是直接變成CLOSED的狀態, 為什么呢? 第一個原因是萬一最后一個ACK丟失了, 對端會重傳的, 這個在超時之前的重新收到對端的FIN也可以回ACK, 而不是RST。 另外一個原因是防止老的連接的包在新的連接里面出現, 影響了新的連接。 有這個2MSL的時間,可以在2個MSL時間之內不會建立同樣四元組(源IP, 源端口,目的IP,目的端口)的連接,也就不會出現老的包影響新連接的事情。 TCP包括兩個定時器函數:一個函數為200ms調用一次(快速定時器);另一個函數每500ms調用一次(慢速定時器)。 延遲ACK定時器與其它6個定時器有所不同,如果摸個連接上設定了延遲ACK定時器,那么下一個200ms定時器超時后,延遲的ACK必須被發送(ACK的延時時間必須在0-200ms之間)。 其它的定時器每500ms遞減一次,計時器減為0時,就觸發相應的動作。 TCP協議中的七個定時器TCP中的7種定時器
原理四個主要方面: 一、tcp協議之連接建立、斷開 二、tcp協議之超時重傳 三、tcp協議之窗口管理 四、tcp協議之擁塞控制
TCP是一種面向有連接的協議,也就是說必須確認對方存在時才能發送數據而TCP通過檢驗和、序列號、確認應答、重發控制、連接管理、窗口控制等機制來實現可靠傳輸。
1. 目的:TCP三次握手是客戶端和服務器總共發三個數據包,通過三個數據包來確認主動發送能力和被動接收能力是否正常。 2. 實質:通過指定的四元組(源地址、源端口、目標地址、目標端口)來建立TCP連接,同步雙方各自發送序列號seq和確認號ACK,同時也會交換窗口大小信息
三次握手過程的實現方式就是交換序列號seq。
隨便在網上找個地址,如果通過域名想看ip地址,可以ping下看連接。
① 192.168.3.7發送[SYN]報文段至222.169.228.146,告知序列號x為0。 ② 222.169.228.146發送[SYN,ACK]報文段至192.168.3.7,告知序列號y為0,確認號ACK為x+1=1。 ③192.168.3.7發送[ACK]報文段至222.169.228.146,告知確認號ACK為y+1=1。
報文段中的其他參數: MSS=1460 :允許從對方接收到的最大報文段,圖中為1460字節(指承載的數據,不包含報文段的頭部)。 win=8192 :滑動窗口的大小為8192字節。 SACK_PERM=1 :開啟選擇確認。 為什么會使用SACK:tcp確認方式不是一段報文段一確認,而是采用累積確認方式。 服務器接收到的報文段無序所以序列號也是不連續,服務器的接收隊列會出現空洞情況。 為了解決空洞,提前了解當前空洞,應對丟失遺漏,采取重傳。 提前了解方式就是通過SACK選項信息,SACK信息包含接收方已經成功接收的數據塊的序列號范圍。 而SACK_PERM字段為1表明,選擇開啟了SACK功能。
網絡層可能會出現丟失、重復、亂序的問題,tcp是提供可靠的數據傳輸服務的,為了保證數據的正確性,tcp協議會重傳它認為的已經丟失的包。 重傳兩種機制:一種基于時間重傳,一種基于確認報文段提供的信息重傳。
RTT :數據完全發送完(完成最后一個比特推送到數據鏈路上)到收到確認信號的時間(往返時間)。 RTO :重傳超時時間(tcp發送數據時設置一個計時器,當計時器超時沒有收到數據確認信息,引發超時而重傳,判斷的標準就是RTO)。
思考:發送序列號為1、2、3、4這4個報文段,但是出現了序列號2報文段丟失,怎么辦?
發送端接收到seq1的確認報文(ACK=2)后,等待seq=2的確認報文。 接收端當收到序列號為3的報文(2已丟失),發送ack為4的確認報文,發送端正等待ack為2的確認報文,面對跳躍的報文,那么發送端會一直等待,直到超出指定時間,重傳報文2。
為什么不跳躍確認呢? tcp是累積確認方式,如果確認報文3,那么意味著報文1和報文2都已經成功接收。
超時處理方式:
思考:上面計時器是以時間為標準重傳,那么可以通過確認報文的次數來決定重傳。
發送端接收到seq1的確認報文(ACK=2)后,等待seq=2的確認報文。 接收端收到報文3、4、5,但是沒收到報文2,那么接收端發送三個ACK為2的確認報文,發送端收到這個三個確認報文,重傳報文2。
思考:如果快速重傳中丟失包的地方很多(報文2,報文,7,報文9,報文30,報文300....),那么需要從頭到尾都重傳,這很蛋疼?
思考:SACK重傳對于接收到重復數據段怎樣運作沒有明確規定,通過DSACK重傳可以讓發送方知道哪些數據被重復接收了,而且明確是什么原因造成的。
發送端沒有收到100-199的ACK包,超過指定時間,重傳報文。 接收端都已經收到200-299的發送報文了,又來100-199是重復報文。 再向發送端發送一個ACK報文,設置SACK 100-199,告知發送端,已經收到了100-199包,只是回應ACK包丟失。
發送端發送包100-199,由于網絡延遲,一直沒有達到接收端。 接收端連續發送三個ACK 200確認報文,觸發快速重傳,發送端收到了ACK 500的確認報文,表明之前的報文都已經交付成功。 接收端又收到了延遲的報文100-199,再次向發送端發送一個SACK 100-199的ACK 500報文。 發送端發現這是重復報文,判斷為網絡延遲造成的。
計時器重傳:根據超時,重傳。 快速重傳:根據接收三次相同ACK報文,重傳。 選擇確認重傳:根據接收端提供的SACK信息,重傳。 DSACK重傳:根據重復報文,明確丟失ACK報文還是網絡延遲。
Category1:已發送且已確認(已經收到ACK報文的數據)。 Category2:已發送但未收到確認。 Category3:即將發送。 Category4:窗口移動前都不能發送。
可用窗口:46-51字節。 發送窗口:32-51字節。
:左邊界 :接收窗口 +:右邊界 接收端接收到序列號小于左邊界,那么被認為重復數據而被丟棄。 接收端接收到序列號大于右邊界,那么被認為超出處理范圍,丟棄。 注意:tcp協議為累積ACK結構,只有當達到數據序列號等于左邊界時,數據才不會被丟棄。
如果窗口更新ACK丟失,對于發送端,窗口左邊界右移,已發送數據得到ACK確認之后,左右邊界距離減小,發送端窗口會減小,當左右邊界相等時,稱為零窗口。 零窗口之后:接收端發送窗口更新能會發生窗口更新ACK丟失。
<
解決方案: 發送端會采用一個持續計時器間歇性地查詢接收端,看其窗口是否已增長。 觸發窗口探測,強制要求接收端返回ACK。 發送幾次探測,窗口大小還是0,那么斷開連接。
出現SWS的情況: ① 接收端通告窗口太小。 ② 發送端發送的數據太小。 解決方案: ① 針對接收端:不應通告小窗口值 [RFC1122]描述:在窗口可增至一個全長的報文段(接收端MSS)或者接收端緩存空間的一半(取兩者中較小值)之前,不能通告比當前窗口更大的窗口值。 標準:min(MSS , 緩存空間/2)。 ② 針對發送端:不應發送小的報文 至少滿足以下其一: (1)可以發送MSS字節的報文。 window size >= MSS或者 數據大小>=MSS (2)數據段長度>=接收端通告過的最大窗口值的一半,才可以發送。 收到之前發送的數據的ack回包,再發送數據,否則一直攢數據。 (3) -1 沒有未經確認的在傳數據或者-2 連接禁用Nagle算法。
tcp基于ACK數據包中的通告窗口大小字段實現了流量控制。 當網絡大規模通信負載而癱瘓,默認網絡進入擁塞狀態,減緩tcp的傳輸。 發送方和接收方被要求承擔超負荷的通信任務時,采取降低發送速率或者最終丟棄部分數據的方法。
反映網絡傳輸能力的變量稱為擁塞窗口(cwnd)。 通告窗口(awnd)。 發送窗口swnd=min(cwnd,awnd)
目的:tcp在用擁塞避免算法探尋更多可用帶寬之前得到cwnd值,幫助tcp建立ACK時鐘。 [RFC5681] :在傳輸初始階段,由于未知網絡傳輸能力,需要緩慢探測可用傳輸資源,防止短時間內大量數據注入導致擁塞。 慢啟動算法針對這一問題而設計。 在數據傳輸之初或者重傳計時器檢測到丟包后,需要執行慢啟動。
擁塞窗口值:每收到一個ACK值,cwnd擴充一倍。 所以假設沒有丟包且每個數據包都有相應ACK值,在k輪后swnd=,成 指數增長 。
SMSS是發送方的最大段大小。
慢啟動階段,cwnd會指數增長,很快,幫助確立一個慢啟動闕值(ssthresh)。 有了闕值,tcp會進入擁塞避免階段,cwnd每次增長值近似于成功傳輸的數據段大小,成 線性增長 。 實現公式:cwnd+=SMSS*SMSS/cwnd
剛建立連接使用慢啟動算法,初始窗口為4,收到一次ACK后,cwnd變為8,再收到一次ACK后,cwnd變為16,依次繼續,32、64,達到闕值ssthresh為64。 開始使用擁塞避免算法,設置ssthresh為ssthresh/2,值為32。 重新從初始窗口4,線性遞增到ssthresh=32。
當cwnd < ssthresh時,使用慢啟動算法 當cwnd > ssthresh時,使用擁塞避免算法
應用快速恢復算法時機:啟動快速重傳且正常未失序ACK段達到之前。 啟動快速恢復算法。 實現過程: ① 將ssthresh設置為1/2 cwnd,將cwnd設置為ssthresh+3*SMSS。 ② 每接收一個重復ACK,cwnd值暫時增加1 SMSS。 ③當接收到新數據ACK后,將cwnd設置為ssthresh。
參考:<
TCP斷開重連時間變長可能是由以下幾個因素造成的:1. 網絡延遲:斷開和重連之間的時間會受到網絡延遲的影響。 如果網絡延遲很高,即數據在網絡中傳輸的時間很長,那么斷開和重連之間的時間可能會變長。 2. 網絡擁塞:如果網絡中的流量較大導致網絡擁塞,那么斷開和重連之間的時間可能會增加。 網絡擁塞會導致連接建立的握手過程變慢,進而延長斷開和重連的時間。 3. 服務器負載:服務器的負載也可能影響斷開和重連的時間。 如果服務器過載,它可能無法及時處理新的連接請求,導致斷開和重連之間的時間延長。 4. 客戶端問題:有時,斷開和重連時間的變長可能是由客戶端問題引起的。 例如,客戶端在斷開連接后需要進行一些處理操作,或者等待一段時間再嘗試重連。 需要注意的是,斷開和重連時間的變長有時是合理的,特別是在網絡不穩定的情況下。 TCP協議為了保證連接的可靠性和穩定性,會采取一些機制來處理連接問題,如重試和超時機制。 如果以上因素都不是造成斷開和重連時間變長的原因,那么問題可能是由于一些網絡設備或配置問題引起的,例如防火墻過濾規則、路由器設備故障等。 在這種情況下,建議檢查網絡設備和配置,以確定是否有問題。 如果問題仍然存在,建議與網絡管理員或技術支持團隊聯系,進一步進行故障排除和解決。
所以 TCP 針對數據包丟失的情況,會用重傳機制解決。
重傳機制的其中一個方式,就是在發送數據時,設定一個定時器,當超過指定的時間后,沒有收到對方的 ACK 確認應答報文,就會重發該數據,也就是我們常說的超時重傳。
TCP 會在以下兩種情況發生超時重傳:
我們先來了解一下什么是 RTT(ROUND-Trip Time 往返時延),從下圖我們就可以知道:RTT 指的是數據發送時刻到接收到確認的時刻的差值,也就是包的往返時間。
上圖中有兩種超時時間不同的情況:
精確的測量超時時間 RTO 的值是非常重要的,這可讓我們的重傳機制更高效。 根據上述的兩種情況,我們可以得知,超時重傳時間 RTO 的值應該略大于報文往返 RTT 的值。
如果超時重發的數據,再次超時的時候,又需要重傳的時候,TCP 的策略是 超時間隔加倍。
也就是 每當遇到一次超時重傳的時候,都會將下一次超時時間間隔設為先前值的兩倍。 兩次超時,就說明網絡環境差,不宜頻繁反復發送。
超時觸發重傳存在的問題是,超時周期可能相對較長。那是不是可以有更快的方式呢?
于是就可以用「快速重傳」機制來解決超時重發的時間等待。
TCP 還有另外一種快速重傳(Fast Retransmit)機制,它不以時間為驅動,而是以數據驅動重傳。
快速重傳機制,是如何工作的呢?其實很簡單,一圖勝千言。
在上圖,發送方發出了 1,2,3,4,5 份數據:
還有一種實現重傳機制的方式叫:SACK( Selective Acknowledgment 選擇性確認)。
這種方式需要在 TCP 頭部「選項」字段里加一個 SACK 的東西,它可以將緩存的地圖發送給發送方,這樣發送方就可以知道哪些數據收到了,哪些數據沒收到,知道了這些信息,就可以只重傳丟失的數據。
如下圖,發送方收到了三次同樣的 ACK 確認報文,于是就會觸發快速重發機制,通過 SACK 信息發現只有 200~299 這段數據丟失,則重發時,就只選擇了這個 TCP 段進行重復。
Duplicate SACK 又稱 D-SACK,其主要使用了 SACK 來告訴「發送方」有哪些數據被重復接收了。
下面舉例兩個栗子,來說明 D-SACK 的作用。
這個模式就有點像我和你面對面聊天,你一句我一句。 但這種方式的缺點是效率比較低的。
如果你說完一句話,我在處理其他事情,沒有及時回復你,那你不是要干等著我做完其他事情后,我回復你,你才能說下一句話,很顯然這不現實。
所以,這樣的傳輸方式有一個缺點:數據包的往返時間越長,通信的效率就越低。
為解決這個問題,TCP 引入了窗口這個概念。 即使在往返時間較長的情況下,它也不會降低網絡通信的效率。
那么有了窗口,就可以指定窗口大小,窗口大小就是指無需等待確認應答,而可以繼續發送數據的最大值。
窗口的實現實際上是操作系統開辟的一個緩存空間,發送方主機在等到確認應答返回之前,必須在緩沖區中保留已發送的數據。 如果按期收到確認應答,此時數據就可以從緩存區清除。
假設窗口大小為 3 個 TCP 段,那么發送方就可以「連續發送」 3 個 TCP 段,并且中途若有 ACK 丟失,可以通過「下一個確認應答進行確認」。
TCP 頭里有一個字段叫 Window,也就是窗口大小。
這個字段是接收端告訴發送端自己還有多少緩沖區可以接收數據。 于是發送端就可以根據這個接收端的處理能力來發送數據,而不會導致接收端處理不過來。
所以, 通常窗口的大小是由接收方的窗口大小來決定的 。
發送方發送的數據大小不能超過接收方的窗口大小,否則接收方就無法正常接收到數據。
并不是完全相等,接收窗口的大小是 約等于 發送窗口的大小的。
因為滑動窗口并不是一成不變的。 比如,當接收方的應用進程讀取數據的速度非常快的話,這樣的話接收窗口可以很快的就空缺出來。 那么新的接收窗口大小,是通過 TCP 報文中的 Windows 字段來告訴發送方。 那么這個傳輸過程是存在時延的,所以接收窗口和發送窗口是約等于的關系。
如果一直無腦的發數據給對方,但對方處理不過來,那么就會導致觸發重發機制,從而導致網絡流量的無端的浪費。
為了解決這種現象發生,TCP 提供一種機制可以讓「發送方」根據「接收方」的實際接收能力控制發送的數據量,這就是所謂的流量控制。
前面的流量控制例子,我們假定了發送窗口和接收窗口是不變的,但是實際上,發送窗口和接收窗口中所存放的字節數,都是放在操作系統內存緩沖區中的,而操作系統的緩沖區,會被操作系統調整。
可見最后窗口都收縮為 0 了,也就是發生了窗口關閉。 當發送方可用窗口變為 0 時,發送方實際上會定時發送窗口探測報文,以便知道接收方的窗口是否發生了改變,這個內容后面會說,這里先簡單提一下。
所以,如果發生了先減少緩存,再收縮窗口,就會出現丟包的現象。
為了防止這種情況發生,TCP 規定是不允許同時減少緩存又收縮窗口的,而是采用先收縮窗口,過段時間再減少緩存,這樣就可以避免了丟包情況。
在前面我們都看到了,TCP 通過讓接收方指明希望從發送方接收的數據大小(窗口大小)來進行流量控制。
這會導致發送方一直等待接收方的非 0 窗口通知,接收方也一直等待發送方的數據,如不采取措施,這種相互等待的過程,會造成了死鎖的現象。
窗口探測的次數一般為 3 次,每次大約 30-60 秒(不同的實現可能會不一樣)。 如果 3 次過后接收窗口還是 0 的話,有的 TCP 實現就會發RST報文來中斷連接。
一般來說,計算機網絡都處在一個共享的環境。 因此也有可能會因為其他主機之間的通信使得網絡擁堵。
在網絡出現擁堵時,如果繼續發送大量數據包,可能會導致數據包時延、丟失等,這時 TCP 就會重傳數據,但是一重傳就會導致網絡的負擔更重,于是會導致更大的延遲以及更多的丟包,這個情況就會進入惡性循環被不斷地放大....
所以,TCP 不能忽略網絡上發生的事,它被設計成一個無私的協議,當網絡發送擁塞時,TCP 會自我犧牲,降低發送的數據量。
于是,就有了擁塞控制,控制的目的就是避免「發送方」的數據填滿整個網絡。
為了在「發送方」調節所要發送數據的量,定義了一個叫做「擁塞窗口」的概念。
擁塞控制主要是四個算法:
TCP 在剛建立連接完成后,首先是有個慢啟動的過程,這個慢啟動的意思就是一點一點的提高發送數據包的數量,如果一上來就發大量的數據,這不是給網絡添堵嗎?
慢啟動的算法記住一個規則就行:當發送方每收到一個 ACK,擁塞窗口 cwnd 的大小就會加 1。
這里假定擁塞窗口 cwnd 和發送窗口 swnd 相等,下面舉個栗子:
連接建立完成后,一開始初始化 cwnd = 1,表示可以傳一個 MSS 大小的數據。 當收到一個 ACK 確認應答后,cwnd 增加 1,于是一次能夠發送 2 個 當收到 2 個的 ACK 確認應答后, cwnd 增加 2,于是就可以比之前多發2 個,所以這一次能夠發送 4 個 當這 4 個的 ACK 確認到來的時候,每個確認 cwnd 增加 1, 4 個確認 cwnd 增加 4,于是就可以比之前多發 4 個,所以這一次能夠發送 8 個。
可以看出慢啟動算法,發包的個數是 指數性的增長 。
有一個叫慢啟動門限ssthresh(slow start threshold)狀態變量。
前面說道,當擁塞窗口 cwnd 「超過」慢啟動門限 ssthresh 就會進入擁塞避免算法。
一般來說 ssthresh 的大小是 字節。
那么進入擁塞避免算法后,它的規則是:每當收到一個 ACK 時,cwnd 增加 1/cwnd。
接上前面的慢啟動的栗子,現假定 ssthresh 為 8:
當 8 個 ACK 應答確認到來時,每個確認增加 1/8,8 個 ACK 確認 cwnd 一共增加 1,于是這一次能夠發送 9 個 MSS 大小的數據,變成了線性增長。
所以,我們可以發現,擁塞避免算法就是將原本慢啟動算法的指數增長變成了線性增長,還是增長階段,但是增長速度緩慢了一些。
就這么一直增長著后,網絡就會慢慢進入了擁塞的狀況了,于是就會出現丟包現象,這時就需要對丟失的數據包進行重傳。
當觸發了重傳機制,也就進入了「擁塞發生算法」。
當網絡出現擁塞,也就是會發生數據包重傳,重傳機制主要有兩種:
發生超時重傳的擁塞發生算法
當發生了「超時重傳」,則就會使用擁塞發生算法。
這個時候,ssthresh 和 cwnd 的值會發生變化:
還有更好的方式,前面我們講過「快速重傳算法」。 當接收方發現丟了一個中間包的時候,發送三次前一個包的 ACK,于是發送端就會快速地重傳,不必等待超時再重傳。
TCP 認為這種情況不嚴重,因為大部分沒丟,只丟了一小部分,則ssthresh和cwnd變化如下:
快速重傳和快速恢復算法一般同時使用,快速恢復算法是認為,你還能收到 3 個重復 ACK 說明網絡也不那么糟糕,所以沒有必要像 RTO 超時那么強烈。
正如前面所說,進入快速恢復之前,cwnd 和 ssthresh 已被更新了:
內容聲明:
1、本站收錄的內容來源于大數據收集,版權歸原網站所有!
2、本站收錄的內容若侵害到您的利益,請聯系我們進行刪除處理!
3、本站不接受違法信息,如您發現違法內容,請聯系我們進行舉報處理!
4、本文地址:http://www.lmxpnzry.com/article/6f0df6361b4d117be13d.html,復制請保留版權鏈接!
ActivePerl是一個流行的Perl環境,它為Windows、macOS和Linux平臺提供了一個命令行界面,CLI,,讓您可以輕松地自動化任務、管理Perl模塊和配置,以及與其他程序進行交互,自動化任務ActivePerl的CLI非常適合自動化各種任務,例如,安裝和更新Perl模塊運行Perl腳本管理Perl進程處理文件和目錄執...。
本站公告 2024-09-29 21:11:48
要使用八進制數字設置文件myfile的權限為,用戶具有讀寫權限組具有讀取權限其他人具有讀取權限請使用以下命令,chmod644myfile八進制數字的含義八進制數字644由三個數字組成,每個數字代表文件權限的三個級別,第一個數字代表用戶權限第二個數字代表組權限第三個數字代表其他用戶權限每個數字的含義如下,數字權限0無權限1執行權限2寫...。
技術教程 2024-09-28 15:27:23
函數指針面試題函數指針是一種強大的工具,它允許你將函數作為值來傳遞和存儲,這在面向對象編程中非常有用,它可以讓你創建高度靈活和可擴展的代碼,在本教程中,我們將探討函數指針在面向對象編程中的妙用,我們將首先了解函數指針的基礎知識,然后討論如何在面向對象設計中使用它們,最后,我們將解決一些常見的函數指針面試題,函數指針的基礎知識函數指針是...。
技術教程 2024-09-26 14:06:09
簡介您是否厭倦了等待文件下載或在不同的設備之間傳輸文件,現在,您可以享受隨時隨地下載文件的便利,無論您使用的是電腦、手機還是平板電腦,本文將介紹一款出色的軟件,它可以讓您輕松快捷地從任何設備下載所需的文件,主要功能從任何設備下載文件,包括電腦、手機和平板電腦支持各種文件類型,包括音樂、視頻、文檔和圖片高速下載,最大限度地利用您的互聯網...。
最新資訊 2024-09-24 02:14:34
3e,n,1,xnln,b,n,其中,`n`是導數階數`,`表示階乘應用對數求導法則在許多應用中都很有用,例如,增長和衰減問題,對數函數用于建模指數增長和衰減過程,求導可以幫助我們找到這些過程的速率,求解方程,對數求導法則可以幫助我們求解涉及對數的方程,優化問題,對數函數用于建模許多優化問題,求導可以幫助我們找到這些問題的極值,...。
本站公告 2024-09-13 13:43:45
簡介Socket編程是Linux下實現網絡通信的一種基本技術,它允許應用程序通過網絡與其他計算機進行通信,在實際應用中,Socket編程可能會遇到各種問題和錯誤,本文將介紹一些常見的故障排除技巧,幫助您解決LinuxSocket編程中的網絡問題并保持應用程序正常運行,常見的網絡問題在Socket編程中,常見的網絡問題包括,無法連接到遠...。
互聯網資訊 2024-09-12 05:22:01
尺度函數是一個重要的數學工具,用于描述物理系統中不同尺度上的現象,從材料科學到量子力學,尺度函數在物理學中都有廣泛的應用,尺度函數的定義尺度函數是一種特殊類型的函數,它描述了物理系統如何隨著尺寸或能量的變化而變化,尺度函數通常用$f,x,$表示,其中$x$是尺寸或能量的尺度參數,尺度函數具有以下性質,當$x$增加時,$f,x,$遞增,...。
本站公告 2024-09-12 01:38:05
導語編程就像一門語言,具有自己的語法和規則,編程語言的底層實現機制卻鮮為人知,本文將探討編程語言實現的模式化思維,幫助您更深入地理解編程語言背后的科學,模式化思維模式化思維是一種認知過程,它將復雜的問題分解成可管理的模式和結構,在編程語言實現中,模式化思維體現在以下方面,語法規則,編程語言的語法規則定義了代碼的結構和合法性,例如,Ja...。
本站公告 2024-09-11 16:24:15
溝通和人際交往能力是現代社會中必不可少的基本技能之一,它不僅影響著我們的日常生活,更對我們的職業發展和事業成功有著至關重要的作用,具備較強的溝通和人際交往能力,可以讓我們在與他人交流、建立關系和達成共識方面更為有效,溝通能力良好的溝通能力包括準確地表達自己的想法、傾聽并理解他人的觀點、以及有效地回應和反饋,它包含三個關鍵方面,語言表達...。
最新資訊 2024-09-11 04:13:14
QQ空間黑科技,解鎖10個隱藏特效代碼,打造令人驚艷的空間QQ空間作為騰訊旗下的社交平臺,擁有著海量的用戶群體,隨著平臺的發展,QQ空間也推出了許多隱藏的黑科技功能,為用戶提供了更加個性化的空間展示效果,本文將介紹10個QQ空間隱藏特效代碼,幫助你打造令人驚艷的空間,1.背景音樂代碼html將代碼粘貼到空間背景音樂設置區域,即可設置一...。
技術教程 2024-09-10 07:27:43
在黑夜中編碼,使用黑色背景,可能聽起來像是一個奇怪的想法,但它實際上有很多好處,黑色背景可以減少眼睛疲勞,提高注意力,并改善代碼可讀性,黑色背景的好處減少眼睛疲勞白色背景會反射大量光線,這會使眼睛疲勞,黑色背景則可以減少光線的反射,從而減輕眼睛疲勞,提高注意力白色背景上雜亂的代碼會分散注意力,黑色背景可以隱藏這些雜亂,讓你更容易專注于...。
最新資訊 2024-09-09 17:28:47
前言單片機C語言是一種強大的編程語言,廣泛應用于嵌入式系統和物聯網設備中,本文將從零基礎開始,帶你踏上單片機C語言編程的學習之旅,基礎知識什么是單片機,單片機是一種集成在單個芯片上的微控制器,它包含了處理器、內存和輸入,輸出接口,什么是C語言,C語言是一種通用編程語言,以其高效、可移植性和廣泛應用而著稱,單片機C語言和普通C語言的區別...。
本站公告 2024-09-09 13:23:55