TCP Congestion Control bestämmer hur anslutningar ska hanteras vid förändringar i nätbelastning justera datahastigheten och hur algoritmerna fungerar i verkliga hostingmiljöer. I denna jämförelse visar jag konkreta effekter på genomströmning, fördröjning och rättvisa för Webbhotell, streaming och molnbaserade arbetsbelastningar.
Centrala punkter
För att du ska kunna läsa artikeln på ett målinriktat sätt sammanfattar jag kort de viktigaste aspekterna och sätter sedan allt i sitt sammanhang. Jag gör en tydlig åtskillnad mellan förlustbaserade och modellbaserade metoder, eftersom de två grupperna reagerar mycket olika. Jag förklarar varför cwnd, RTT och pacing påverkar prestanda och Rättvisa besluta. Jag sorterar mätresultaten så att du inte behöver fatta beslut baserat på magkänslan. Jag avslutar med pragmatiska rekommendationer för hosting, containrar och globala Användare.
- AIMD styr cwnd och reagerar på förluster
- CUBIC levererar konstant prestanda vid stora RTT:er
- BBR använder modell, minskar köer och latens
- BIC poäng i nät med Drops
- Hybla accelererar långa ledningar (satellit)
Vad överbelastningskontroll styr: cwnd, RTT, förlustsignaler
Jag börjar med grunderna, eftersom de påverkar alla senare val. Trängselvindu (cwnd) begränsar hur många byte som är på väg utan bekräftelse, och AIMD ökar cwnd stegvis tills förluster uppstår. RTT avgör hur snabbt bekräftelser kommer tillbaka och hur aggressivt en algoritm kan växa. Förlustersignaler uppstod tidigare från timeouts och trippel-duplikat-ACK:er, idag räknas dessutom ködjup, minimal RTT och uppmätt flaskhalsbandbredd. Den som förstår cwnd, RTT och förlusttolkning kan bedöma påverkan på genomströmning, fördröjning och Jitter omedelbart bättre.
Tillbakablick: Reno, NewReno och Vegas i vardagen
Reno använder Slow Start i början och övergår sedan till linjär tillväxt, men halverar fönsterstorleken drastiskt efter förluster. NewReno reparerar flera förluster per fönster mer effektivt, vilket är särskilt hjälpsamt vid måttliga felfrekvenser. Vegas mäter förväntad mot faktisk genomströmning över RTT och bromsar tidigt för att undvika förluster. Denna försiktighet håller köerna små, men kostar genomströmning när förlustbaserade flöden sänder mer aggressivt parallellt. Om du ser oförklarliga timeouts eller dubbla ACK:er bör du först Analysera paketförluster och sedan algoritmen för Topologi välja lämpligt.
High-BW-RTT: Jämförelse mellan BIC och CUBIC
BIC närmar sig binärt den högsta förlustfria cwnd och håller hastigheten förvånansvärt konstant även vid mindre fel. I laboratorier med låg latens och drop-hastigheter på omkring 10^-4 levererade BIC genomströmningsvärden över 8 Gbit/s, medan klassiska algoritmer varierade. CUBIC ersatte BIC som standard eftersom det styr sin cwnd via en kubisk tidsfunktion och därmed utnyttjar långa RTT bättre. Kurvan växer först måttligt efter en förlust, accelererar sedan märkbart och blir återigen försiktig nära den senaste maximala hastigheten. I nätverk med långa vägar uppnår jag ofta högre utnyttjande med CUBIC samtidigt som jag får bra Planerbarhet latenserna.
Modellbaserad: BBR, pacing och bufferbloat
BBR använder en modell baserad på minimal RTT och uppmätt flaskhalsbandbredd, sätter cwnd till ungefär dubbelt så mycket som bandbreddsfördröjningsprodukten och fördelar paket jämnt. Denna strategi förhindrar överfulla köer och håller fördröjningarna korta, även om det uppstår mindre förluster. I installationer med varierande radiokvalitet eller blandade vägar förblir Goodput högt, eftersom BBR inte reagerar reflexmässigt på varje tapp. Version 1 anses vara mycket snabb, men kan konkurrera med CUBIC i små buffertar och uppvisa något orättvis fördelning. Jag kombinerar BBR i BBR CUBIC hosting Jag föredrar landskap för primära flöden och kör CUBIC som kompatibel fallback.
Satellit och radio: Hybla, Westwood och PCC
Hybla kompenserar nackdelarna med höga RTT:er genom att skala cwnd som om det fanns en kort referens-RTT. Detta gör att långa sträckor, till exempel satellit, mycket snabbare når användbara hastigheter och förblir där på ett tillförlitligt sätt. Westwood uppskattar tillgänglig bandbredd utifrån ACK-hastigheterna och minskar cwnd mindre kraftigt efter förluster, vilket hjälper i radionätverk med slumpmässiga fel. PCC går ett steg längre och optimerar ett nyttovärde genom korta experiment, vilket gör att det kan uppnå höga kombinationer av goodput och latens. I heterogena nätverk med Rörlighet Jag testar helst Hybla och Westwood innan jag tar itu med komplicerade QoS-regler.
Prestandajämförelse: mätvärden och rättvisa
Jämförelser visar tydligt olika profiler när latens och felfrekvenser varierar. Vid låg RTT dominerar BIC ofta ren genomströmning, medan CUBIC erbjuder en pålitlig blandning av hastighet och beteende över tid. Vid mycket långa RTT:er vinner CUBIC klart över Reno och NewReno, eftersom det bättre omvandlar väntetiderna till tillväxt. BBR håller köerna tomma och levererar konstant låga fördröjningar, men genererar fler återöverföringar beroende på buffertstorleken. För parallella flöden visar CUBIC oftast en rättvis fördelning, medan BIC gärna håller ledningen nära Kapacitet.
| Algoritm | Princip | Styrka | svaghet | Rekommenderas för |
|---|---|---|---|---|
| Reno / NewReno | Förlustbaserad, AIMD | Enkelt beteende | Långsam vid hög RTT | Legacy-stackar, Felsökning |
| Vegas | RTT-baserad | Tidig trafikstockningsförebyggande | Lägre genomströmning | Konstant latens |
| BIC | Binär sökning | Hög goodput vid droppar | Aggressiv mot andra | Låg RTT, felfrekvens |
| CUBIC | Kubisk tidsfunktion | God rättvisa | Spridning vid droppar | Långa vägar, datacenter |
| BBR | Modellbaserad, pacing | Låg latenstid | Orättvist i små buffertar | Hosting, globala användare |
| Hybla | RTT-kompensation | Snabb uppstart | Särskilt fall | Satellit, Maritim |
Praktisk guide: Val efter latens, förlust och mål
Jag börjar varje beslut med tydliga mål: låg latens, maximal goodput eller balans för många flöden. Vid hårt begränsade buffertstorlekar och känsliga latenskrav använder jag först BBR. Om långa vägar dominerar och flera värdar samexisterar finns det inget alternativ till CUBIC. I nätverk med väl observerbara drop-mönster levererar BIC fortfarande imponerande hastigheter, förutsatt att rättvisa är av underordnad betydelse. För satellit och mycket höga RTT-vägkostnader undanröjer Hybla typiska ramp-up-nackdelar och säkerställer snabb nyttolast.
Linux, Windows och containrar: aktivering och optimering
I Linux kontrollerar jag den aktiva algoritmen med sysctl net.ipv4.tcp_congestion_control och implementerar den specifikt med sysctl net.ipv4.tcp_congestion_control=bbr. För CUBIC följer jag kärnans standardinställningar, men justerar net.core.default_qdisc och pacing-parametrarna när jag avlastar värdköerna. I containrar överför jag inställningar till värden, eftersom namnutrymmen inte isolerar varje kö. I Windows från och med aktuella versioner kan BBR aktiveras i lämpliga utgåvor, medan äldre system fortsätter att använda CUBIC eller Compound. Utan ett stabilt system och Kö-inställningarna förlorar varje algoritm märkbart sin effekt.
Webbhotellperspektiv: Multi-Flow-Fairness och Goodput
I hostingkluster är det summan av många samtidiga flöden som räknas, inte det bästa värdet för en enskild överföring. CUBIC håller anslutningarna förutsägbara och fördelar kapaciteten rättvist, vilket gynnar täta multitenant-scenarier. BBR minskar köerna och håller svarstiderna korta för API:er och dynamiska webbplatser. Om du tittar på protokollöverhead bör du testa transporten med HTTP-versioner; min utgångspunkt är HTTP/3 jämfört med HTTP/2 i samverkan med den valda CC-metoden. För globala användare föredrar jag låga latensspikar, eftersom reaktionstiden direkt påverkar den upplevda Hastighet präglat.
QUIC och BBR: Inflytande bortom TCP
QUIC har egen UDP-baserad köhantering och använder liknande principer som BBR, till exempel pacing och RTT-övervakning. I moderna stackar flyttas prestandan därmed gradvis från TCP till applikationslagret. Detta ökar frihetsgraden, men kräver noggranna mätningar på väg-, värd- och applikationsnivå. För planering rekommenderar jag att man använder QUIC-protokoll mot CUBIC/BBR‑TCP under verkliga belastningsprofiler. På så sätt kan jag tidigt upptäcka var köbildning uppstår och hur jag kan undvika flaskhalsar genom pacing eller Formning glätte.
AQM, ECN och buffertdisciplin: samverkan med algoritmerna
Trafikstyrning får sin fulla effekt först i samverkan med nätverksenheternas köhantering. Klassisk tail drop fyller buffertar till brädden och kastar sedan plötsligt bort paket – vilket resulterar i latensspikar och synkroniseringseffekter. Active Queue Management (AQM) som CoDel eller FQ-CoDel markerar eller kasserar paket i ett tidigt skede och fördelar kapaciteten mer rättvist över flödena. Detta gynnar alla processer: CUBIC förlorar mindre cwnd genom burst-drops, och BBR behåller sin PacingStrategin blir stabilare eftersom köerna inte „spricker“.
ECN (Explicit Congestion Notification) kompletterar denna bild. Istället för att kasta paket markerar routrar trängsel med en CE-bit; slutpunkter stryper utan att återutsändningar behövs. Förlustbaserade algoritmer reagerar därmed tidigare och mjukare, medan modellbaserade metoder som BBR tolkar signalerna i kontexten av minimal RTT. I datacenter möjliggör DCTCP med konsekvent ECN mycket låga köfördröjningar vid hög belastning. I WAN använder jag ECN selektivt: endast när vägarna konsekvent vidarebefordrar markeringarna och middleboxar inte ingriper. I blandade offentliga nätverk gäller det fortfarande att konfigurera AQM korrekt istället för att bara öka buffertarna.
Bursts, offloads och värdbaserad pacing
Många prestandaförluster orsakas av sändningsburstar på värden. Stora avlastningar (TSO/GSO) samlar segment i mycket stora ramar; utan Pacing dessa paket avlastas i korta toppar och fyller switchköer. Under Linux ställer jag därför in sch_fq eller FQ‑CoDel som default_qdisc och använder pacing‑hastigheter som anges av CC‑algoritmen. BBR drar särskilt nytta av detta, men även CUBIC blir lugnare. För stora NIC-ringbuffertar och en för hög txqueuel förlänger köerna i värden – jag väljer måttliga värden och observerar med tc -s qdisc om det uppstår droppar eller ECN-märken där.
På mottagarsidan påverkar GRO/LRO latensen för små flöden. För API-tunga arbetsbelastningar är det värt att testa eller begränsa dessa avlastningar beroende på NIC och kärna, så att ACK:er bearbetas snabbare. I containeruppsättningar kontrollerar jag veth-par och host-Qdiscs: kön finns på host-gränssnittet, inte i namnområdet. Den som använder cgroups för bandbreddshantering bör sätta gränser som är konsekventa med CC och AQM, annars uppstår oförutsägbara störningar mellan flöden.
Arbetsbelastningsprofiler: korta flöden, elefanter och strömning
Inte alla applikationer kräver samma köhantering. „Mice“-flöden (små överföringar) dominerar webb-API:er och dynamiska sidor. Här är det viktigt hur snabbt anslutningen kommer in i användningsfasen och hur låga tail-latenser förblir. BBR håller köerna korta och gynnar kortlivade flöden, medan CUBIC levererar solida medelvärden med rättvis kapacitetsfördelning. Den initiala fönsterstorleken (initcwnd) och inställningarna för fördröjd ACK påverkar de första RTT:erna: konservativa standardvärden skyddar mot bursts, men får inte bromsa de första kilobyten för mycket.
„Elephant“-flöden (säkerhetskopiering, replikering, stora nedladdningar) kräver stabil belastning under långa perioder. CUBIC skalar här robust över olika RTT:er och delar rättvist med parallella flöden. BIC levererar maximala hastigheter i kontrollerade nätverk med kända drop-mönster, men har nackdelar vid samexistens. För livestreaming och realtidsinteraktion (VoIP, gaming) undviker jag konsekvent stillastående köer: BBR förblir förstahandsvalet så länge buffertarna är små och AQM fungerar. Nagle-interaktioner (TCP_NODELAY) och applikationsbatching spelar in: Den som genererar många små skrivningar bör stänga av Nagle och överlåta finjusteringen till pacing.
Mätmetodik: realistiska tester och meningsfulla mätvärden
Bra beslut kräver reproducerbara mätningar. Jag kombinerar syntetisk belastning med verkliga vägförhållanden: kontrollerad emulering av RTT, jitter och förlust (t.ex. på testlänkar) plus verkliga målplatser. Jag mäter bandbredd som goodput och korrelerar den med RTT-förlopp, återutsändningar och andelen out-of-order. P50/P95/P99-latenser säger mer än medelvärden – särskilt när det gäller API-svarstider och interaktivitet. För TCP tittar jag på cwnd-förlopp och pacing_rate och kontrollerar Qdisc-statistik samt CPU-mättnad på värdsidan så att jag kan identifiera flaskhalsar korrekt.
Enskilda tester kan vara missvisande: parallella flöden per värd och korsande trafik skapar realistiska konkurrenssituationer. Tid på dygnet, peeringvägar och radioförhållanden varierar; jag upprepar mätningar i tidsserier och kontrollerar känsligheten för små drop-frekvenser. För QUIC speglar jag identiska arbetsbelastningar mot TCP så att applikations- och transportnivån utvärderas separat. Först när mätningarna förblir stabila under störningar fattar jag ett beslut om produktionen.
Vanliga fel och snabba lösningar
En konstant ökning av RTT under belastning samtidigt som goodput sjunker tyder på Bufferbloat Åtgärd: Aktivera AQM, skärpa host-pacing, använd BBR vid behov. Många återutsändningar utan tydliga drop-mönster talar för omordning eller ACK-komprimering – FQ-baserade Qdiscs och ren pacing hjälper. Plötsliga hängningar med uteblivna ACK:er tyder ofta på Path-MTU-problem; jag aktiverar MTU-probing och sätter MSS-clamping vid relevanta övergångar.
Orättvis fördelning mellan flöden uppstår när enskilda anslutningar har en permanent fördel: CUBIC förbättrar RTT-rättvisan jämfört med äldre förlustalgoritmer, BBR kräver ren buffertdisciplin; vid små buffertar kan en finare justering av takten eller en återgång till CUBIC säkerställa samexistens. I container-miljöer uppstår „dolda“ köer i veth-ändar – utan samordnade Qdisc- och cgroup-gränser flyttas trafikstockningar till värden, långt bort från applikationen.
Operativa riktlinjer: Beslut om team och plattformar
Jag förankrar kökontroll i plattformsstandarder: enhetliga Qdisc-standardvärden, definierade CC-profiler per kluster och playbooks för avvikelser. För globala Användare Jag delar upp arbetsbelastningen efter latenskänslighet: Frontend-API:er prioriteras med BBR och strikt AQM, bulköverföring med CUBIC. Telemetri är obligatoriskt: RTT-fördelning, goodput, retransmissioner och ECN-kvoter som tidsserier. Teamet rullar ut ändringar genom procentuella experiment och jämför P95/P99, inte bara genomsnittsvärden. På så sätt blir CC-beslut repeterbara och spårbara – och förblir inte bara en magkänsla.
Checklista för beslut
Jag kontrollerar först RTT-intervall och felfrekvenser, eftersom de dominerar beteendet. Därefter bestämmer jag om latens eller genomströmning har prioritet och testar specifikt mot denna mätvärde. I nästa steg mäter jag rättvisa med parallella flöden för att undvika överraskningar under drift. Därefter kontrollerar jag buffertstorlekar, AQM-procedurer och pacing-inställningar på värden och gateways. Slutligen validerar jag under belastning om valet med riktiga användare och riktiga Rutter bär.
Kort balansräkning
Reno och NewReno levererar ett tydligt referensbeteende, men verkar bromsas på långa vägar. CUBIC är standard i nästan alla Linux-hosting, eftersom det utnyttjar långa RTT:er väl och beter sig rättvist. BIC övertygar i nätverk med märkbara droppar, när maximal utnyttjande är viktigare än närhet. BBR möjliggör låga latenser och konstanta svarstider, men kräver uppmärksamhet för buffertar och samexistens. Den som jämför mål, vägkarakteristik och värdköer på ett tydligt sätt sätter trafikstockningskontroll som en verklig Spak för användarupplevelse och kostnader.


