Nätverk och protokoll

TCP

Pålitlig, anslutningsorienterad transport som levererar en byteström i ordning.

Var du ser detta: Syns i paketfångster, nätverksdiagram, brandväggsregler samt system- och nätverksloggar.

Vad det är

TCP (Transmission Control Protocol) är ett transportprotokoll som ger tillförlitlig, ordnad leverans mellan två ändpunkter. Applikationer skriver bytes till TCP och läser bytes från TCP; TCP avgör hur strömmen delas upp i segment, hur förluster återhämtas och hur data levereras i rätt ordning till mottagaren.

Nyckelpunkter
  • Börjar med ett handslag som synkroniserar tillstånd mellan två slutpunkter.
  • Spårar sekvensnummer så att mottagaren kan ordna om data och upptäcka förlust.
  • Använder flödeskontroll och trängselkontroll så att det inte överväldiga nätverk eller mottagare.

Hur det fungerar i stora drag

  1. Klienten och servern utför en trevägshandskakning (SYN, SYN ACK, ACK) för att komma överens om initiala sekvensnummer och skapa per anslutningstillstånd.
  2. Avsändaren strömmar data; TCP kapar den i segment, numrerar byten och lägger dem på tråden.
  3. Mottagaren bekräftar vad den har tagit emot, vanligtvis genom att säga nästa byte den förväntar sig.
  4. Om bekräftelserna inte kommer fram i tid, återsänder avsändaren de saknade uppgifterna. Mottagaren ordnar om segment och tar bort dubbletter.
  5. Flödeskontroll begränsar hur mycket data som kan vara under överföring baserat på mottagarfönstret så att en snabb avsändare inte överväldiga en långsam mottagare.
  6. Trängselkontroll anpassar sändningshastigheten till nätverket genom att sondera kapaciteten och backa när den upptäcker överbelastningssignaler som förlust eller ECN-märken.
  7. När den är klar stängs anslutningen med FIN eller avbryts med RST, och TCP behåller kortlivad tillstånd (som TIME WAIT) för att undvika att blanda gamla paket med nya anslutningar.

Konkret exempel

Du laddar en webbplats. Din webbläsare öppnar en TCP-anslutning till servern, slutför handskakningen och skickar sedan en HTTP-förfrågan. Om ett paket försvinner på vägen, återsänder TCP det, och din webbläsare får fortfarande hela svaret i ordning utan att veta att en förlust inträffade.

Varför det är viktigt

Internets baslager, IP, kan släppa, duplicera eller omordna paket. TCP finns för att dölja den verkligheten från applikationer som behöver korrekta, såsom webbsurfning, APIs, e-post, SSH och den mesta databastrafiken.

Säkerhetsperspektiv

  • TCP är sårbar för resursutmattning som SYN översvämningar, så servrar använder ofta begränsningar som SYN cookies och hastighetsbegränsning.
  • Sekvensnummerförutsägelse och återställningsinjektion är klassiska risker, men moderna stackar ger härdning. Använd TLS för att skydda applikationsdata och slutpunkter.
  • Middleboxar som NATs och brandväggar spårar TCP tillstånd. Felkonfigurerade tidsgränser för tillstånd kan bryta långlivade anslutningar.

Vanliga fallgropar

  • Förutsatt att en applikationsskrivning är lika med ett paket. TCP är en ström, inte ett meddelandeprotokoll.
  • Att glömma att prestanda beror på tur och retur tid och förlust. Liten förlust kan krossa genomströmningen.
  • Ignorerar MTU-problem. Path MTU-problem kan se ut som slumpmässiga timeouts eller avstannade överföringar.
  • Felläsning av TIME WAIT som en bugg. Det är normalt och skyddar nya anslutningar.
  • Behandla port 443 som automatiskt säker. TCP tillhandahåller bara transport, inte förtroende.

FÖRDJUPNING

Anslutningsinställningar är förhandling plus tillstånd

En TCP anslutning är inte bara ett rör. Båda slutpunkterna skapar tillstånd som nycklas av de 4 tupeln: källkod IP, källport, destination IP, destinationsport. När en klient anropar connect, skickar den ett SYN-segment som föreslår ett initialt sekvensnummer och ofta en uppsättning alternativ som MSS, fönsterskalning och SACK-behörighet. Servern svarar med SYN ACK, väljer sitt eget initiala sekvensnummer och bekräftar vad den accepterar, och klienten avslutar med ett ACK. Efter den punkten är båda sidor överens om hur man numrerar byte och hur man tolkar bekräftelser.

Det handslaget förhindrar också en stor klass av förvirring. Utan det kan ett gammalt försenat paket från en tidigare konversation se ut som giltig data för en ny konversation. Handslaget tvingar båda sidor att bevisa att de är live nu och att synkronisera sekvensnummerutrymmen innan applikationsdata levereras.

I paketfångster ser du ofta mer än de klassiska tre segmenten. Optioner är hur TCP anpassar sig till verkliga nät. MSS begränsar segmentstorlek, fönsterskalning möjliggör stora mottagningsfönster på länkar med hög bandbredd, och SACK låter mottagaren ange vilka block som kommit i fel ordning så att avsändaren kan undvika onödiga omsändningar.

Tillförlitlighet är noggrann bokföring, inte magi

TCP levererar en byteström, vilket innebär att applikationen inte ser meddelandegränser. Internt har varje byte en position. Avsändaren grupperar bytes i segment och märker dem med sekvensnummer. Mottagaren bekräftar vad den har tagit emot med hjälp av bekräftelser som vanligtvis är kumulativa, vilket betyder att den säger nästa byte den förväntar sig. Om ett segment går förlorat, förblir mottagaren antingen tyst om det gapet eller kvitterar förbi det bara när det kan, och avsändaren sänder så småningom om.

Förlustdetektering är en blandning av timers och tips. En återsändningstidsgräns är den sista utvägen. Snabbare återhämtning kommer från dubbla ACKs: om mottagaren fortsätter att kvittera nästa byte, kan avsändaren sluta sig till ett saknat segment och sända om tidigt med snabb återsändning. Med SACK kan mottagaren vara exakt om vilken data den redan har, så avsändaren kan fokusera återsändningar på vad som verkligen saknas.

Ordning hanteras genom buffring. Om segment kommer i fel ordning kan mottagaren lagra dem och ändå kvittera mottagen data, men levererar inte bytes till applikationen förrän luckan är fylld. Därför kan ett enda tappat paket tillfälligt stoppa ett annars snabbt flöde, ofta beskrivet som head-of-line-blockering.

Flödeskontroll kontra trängselkontroll

Flödeskontroll skyddar mottagaren. Varje ACK har ett annonserat mottagningsfönster som talar om för avsändaren hur mycket ytterligare data mottagaren kan buffra. Avsändaren måste respektera den gränsen även om nätverket skulle kunna hantera mer. Om fönstret sjunker till noll, pausar avsändaren och sonderar regelbundet tills mottagaren öppnar fönstret igen.

Trängselkontroll skyddar nätverket. TCP använder ett congestion window som begränsar hur mycket data som får vara under överföring utan kvittens. Avsändaren styrs alltid av det minsta av congestion window och mottagarfönstret. Detta är viktigt eftersom mottagaröverbelastning och nätverksträngsel är olika problem med olika signaler.

Verkliga algoritmer för trängselkontroll varierar beroende på operativsystem och era, men kärnidén är stabil. Börja försiktigt, öka sändningshastigheten medan bekräftelserna kommer tillbaka smidigt och minska när förlust eller försening tyder på överbelastning. Det är därför genomströmningen ökar, sedan stabiliseras och ibland sjunker kraftigt när vägen blir trafikerad.

Typisk livscykel vid verklig användning

De flesta moderna applikationer håller anslutningarna öppna och återanvänder dem. En webbläsare kan till exempel öppna ett litet antal TCP-anslutningar till en webbplats och skicka många HTTP-förfrågningar över varje. Återanvändning är viktigt eftersom anslutningsinstallationen kostar minst en tur och retur, och långsam start gör att avsändaren inte omedelbart kan spränga i full fart.

När en anslutning är inaktiv kan mellanboxar glömma tillståndet. NAT enheter och brandväggar tar ofta timeout-mappningar, så program som behöver långlivade anslutningar använder keepalives eller periodisk trafik. På förlustlösa trådlösa länkar kommer du att se omsändningar och variabel latens, och TCP kommer att anpassa sig genom att minska sitt överbelastningsfönster och sedan bygga om det.

När applikationen är klar är den rena avstängningen en FIN-växling. Varje riktning kan stängas oberoende, varför du kan se en sida skicka FIN och fortfarande ta emot data från den andra sidan ett tag. Efter stängning anger en sida TIME WAIT för att se till att sena paket från den gamla anslutningen inte korrumperar en framtida anslutning som råkar återanvända samma 4 tupel.

Vad man ska leta efter när något känns långsamt

Om du beställer stånd, leta efter förlust. En fångst kan visa upprepade dubbletter av ACKs, SACK block som pekar på ett mellanrum och återsändningar. Även små förluster kan krossa genomströmningen på långa fördröjningsvägar eftersom varje förlusthändelse utlöser backoff.

Om genomströmningen är begränsad, kontrollera begränsningsfönstret. Ett litet mottagningsfönster tyder på att mottagaren eller programmet inte läser snabbt. Ett litet trängselfönster tyder på att avsändaren är försiktig på grund av trafikstockningssignaler. Att mäta tur och returtid och återsändningshastigheter hjälper dig att bestämma vilken berättelse som passar.

Om anslutningen återställs upprepade gånger kan du se en brandväggspolicy, en krasch eller ett program som tar slut och avbryts. En RST är en hård abort, medan en FIN är en graciös nära. Den skillnaden har betydelse för felsökning.