Beschrijving van Windows TCP-functies

In dit artikel worden de TCP-functies in Windows beschreven.

Van toepassing op: Windows 10 - alle edities, Windows Server 2012 R2
Origineel KB-nummer: 224829

Samenvatting

In dit artikel worden de volgende TCP-functies in Windows beschreven:

  • TCP-venstergrootte
  • TCP-opties worden nu ondersteund
  • Windows-schaalaanpassing - RFC 1323
  • Tijdstempel - RFC 1323
  • Beveiliging tegen verpakte volgnummers (PAWS)
  • Selectieve bevestigingen (SACKS) - RFC 2018
  • Gedrag van TCP-hertransmissie en snelle hertransmit

De TCP-functies kunnen worden gewijzigd door de vermeldingen in het register te wijzigen.

Belangrijk

De volgende secties, methoden of taken bevatten stappen die u laten weten hoe u het register kunt wijzigen. Als u het register op onjuiste wijze wijzigt, kunnen er echter grote problemen optreden. Het is dan ook belangrijk dat u deze stappen zorgvuldig uitvoert. Maak een back-up van het register voordat u wijzigingen aanbrengt. Als er een probleem optreedt, kunt u het register altijd nog herstellen. Als u meer informatie wilt over het maken van een back-up van het register en het herstellen van het register, klikt u op de volgende artikelnummers in de Microsoft Knowledge Base:
322756 Een back-up van het register maken en het register terugzetten in Windows

TCP-venstergrootte

De grootte van het TCP-ontvangstvenster is de hoeveelheid ontvangstgegevens (in bytes) die tijdens een verbinding kan worden gebufferd. De verzendende host kan alleen die hoeveelheid gegevens verzenden voordat deze moet wachten op een bevestiging en een vensterupdate van de ontvangende host. De Windows TCP/IP-stack is ontworpen om zichzelf in de meeste omgevingen zelf af te stemmen en gebruikt grotere standaardvenstergrootten dan eerdere versies.

In plaats van een vastgecodeerde standaardgrootte voor ontvangstvensters te gebruiken, past TCP zich aan aan zelfs verhogingen van de maximale segmentgrootte (MSS). De MSS wordt onderhandeld tijdens het instellen van de verbinding. Als u het ontvangstvenster aanpast aan gelijkmatige stappen van de MSS, wordt het percentage tcp-segmenten op volledige grootte verhoogd dat wordt gebruikt tijdens bulkgegevensoverdrachten.

De grootte van het ontvangstvenster wordt op de volgende manier bepaald:

  1. De eerste verbindingsaanvraag die naar een externe host wordt verzonden, maakt een ontvangstvenstergrootte van 16.384 bytes (16.384 bytes) bekend.
  2. Wanneer de verbinding tot stand is gebracht, wordt de grootte van het ontvangstvenster naar boven afgerond op een gelijkmatige toename van de MSS.
  3. De venstergrootte wordt aangepast naar vier keer de MSS, tot een maximale grootte van 64 K, tenzij de vensterschaaloptie (RFC 1323) wordt gebruikt.

Opmerking

Zie de sectie Windows-schaalaanpassing.

Voor Ethernet-verbindingen wordt de venstergrootte normaal gesproken ingesteld op 17.520 bytes (16.000 afgerond op twaalf segmenten van 1460 bytes). De venstergrootte kan afnemen wanneer er een verbinding tot stand wordt gebracht met een computer die ondersteuning biedt voor uitgebreide TCP-hoofdopties, zoals Selectieve bevestigingen (SACKS) en tijdstempels. Deze twee opties vergroten de grootte van de TCP-header tot meer dan 20 bytes, wat resulteert in minder ruimte voor gegevens.

In eerdere versies van Windows NT was de venstergrootte voor een Ethernet-verbinding 8.760 bytes, of zes segmenten van 1460 bytes.

Als u de grootte van het ontvangstvenster wilt instellen op een specifieke waarde, voegt u de waarde TcpWindowSize toe aan de registersubsleutel die specifiek is voor uw versie van Windows. Ga hiervoor als volgt te werk:

  1. Selecteer Uitvoeren starten>, typ Regediten selecteer vervolgens OK.

  2. Vouw de registersubsleutel uit die specifiek is voor uw versie van Windows:

    • Vouw voor Windows 2000 de volgende subsleutel uit: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • Vouw voor Windows Server 2003 de volgende subsleutel uit: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. Wijs in het menu Bewerkende optie Nieuw aan en selecteer vervolgens DWORD-waarde.

  4. Typ TcpWindowSize in het vak Nieuwe waarde en druk op Enter

  5. Selecteer Wijzigen in het menu Bewerken .

  6. Typ de gewenste venstergrootte in het vak Waardegegevens .

    Opmerking

    Het geldige bereik voor venstergrootte is 0-0x3FFFC000 Hexadecimaal.

Deze waarde is niet standaard aanwezig. Wanneer u de waarde TcpWindowSize toevoegt, wordt het hierboven beschreven standaardalgoritme voor venstergrootte overschreven.

Opmerking

TcpWindowSize kan ook worden toegevoegd aan de parametertoets om de venstergrootte globaal in te stellen voor alle interfaces.

TCP-opties worden nu ondersteund

Voorheen werden TCP-opties voornamelijk gebruikt voor het onderhandelen over maximale segmentgrootten. In Windows worden TCP-opties gebruikt voor vensterschalen, tijdstempel en selectieve ACK.

Er zijn twee typen TCP-opties:

  1. Een TCP-optie met één octet, die wordt gebruikt om een specifiek type optie aan te geven.
  2. Een TCP-optie met meerdere octets, die bestaat uit een optiesoort, een optielengte en een reeks optie-octetten.

De volgende lijst bevat elk type TCP-optie, lengte, naam en beschrijving.

Soort: 0
Lengte: 1
Optie: Einde van lijst met opties
Beschrijving: wordt gebruikt wanneer opvulling nodig is voor de laatste TCP-optie.

Soort: 1
Lengte: 1
Optie: Geen bewerking
Beschrijving: wordt gebruikt wanneer opvulling nodig is en er meer TCP-opties volgen binnen hetzelfde pakket.

Soort: 2
Lengte: 4
Optie: Maximale segmentgrootte
Beschrijving: geeft de maximale grootte aan voor een TCP-segment dat via het netwerk kan worden verzonden.

Soort: 3
Lengte: 3
Optie: Optie vensterschaal
Beschrijving: identificeert de schaalfactor die moet worden gebruikt bij het gebruik van venstergrootten groter dan 64.000.

Soort: 8
Lengte: 10
Optie: Optie tijdstempel
Beschrijving: wordt gebruikt om de retourtijd (RTT) van verzonden pakketten te berekenen.

Soort: 4
Lengte: 2
Optie: TCP SACK is toegestaan
Beschrijving: informeert andere hosts dat Selectieve Acks zijn toegestaan.

Soort: 5
Lengte: varieert
Optie: TCP SACK-optie
Beschrijving: wordt gebruikt door hosts om te bepalen of niet-bestelde pakketten zijn ontvangen.

Windows-schaalaanpassing

Voor een efficiënter gebruik van netwerken met een hoge bandbreedte kan een grotere TCP-venstergrootte worden gebruikt. Het veld TCP-venstergrootte bepaalt de gegevensstroom en is beperkt tot 2 bytes, of een venstergrootte van 65.535 bytes.

Omdat het veld grootte niet kan worden uitgebreid, wordt een schaalfactor gebruikt. TCP-vensterschaal is een optie die wordt gebruikt om de maximale venstergrootte te verhogen van 65.535 bytes naar 1 gigabyte.

De optie vensterschaal wordt alleen gebruikt tijdens de TCP-handshake in drie richtingen. De waarde voor vensterschaal vertegenwoordigt het aantal bits dat naar links moet worden verplaatst in het veld 16-bits venstergrootte. De waarde van de vensterschaal kan worden ingesteld van 0 (geen shift) tot 14.

Als u de werkelijke venstergrootte wilt berekenen, vermenigvuldigt u de venstergrootte met 2^S, waarbij S de schaalwaarde is.

Bijvoorbeeld:

Als de venstergrootte 65.535 bytes is met een vensterschaalfactor van 3.
Werkelijke venstergrootte = 65535*2^3

Werkelijke venstergrootte = 524280

De volgende tracering netwerkmonitor laat zien hoe de optie voor vensterschaal wordt gebruikt:

TCP: ....S., len:0, seq:725163-725163, ack:0, win:65535, src:1217 dst:139(NBT Session)  
TCP: Source Port = 0x04C1  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 725163 (0xB10AB)  
TCP: Acknowledgement Number = 0 (0x0)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x02 : ....S.  
TCP: Window = 65535 (0xFFFF)  
TCP: Checksum = 0x8565  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
+ TCP: Maximum Segment Size Option  
TCP: Option Nop = 1 (0x1)  
TCP: Window Scale Option  
TCP: Option Type = Window Scale  
TCP: Option Length = 3 (0x3)  
TCP: Window Scale = 3 (0x3)  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: SACK Permitted Option  

De venstergrootte die wordt gebruikt in de werkelijke handshake in drie richtingen, is niet de venstergrootte die wordt geschaald, volgens RFC 1323 sectie 2.2:

'Het veld Venster in een SYN-segment (bijvoorbeeld een [SYN] of [SYN,ACK]) wordt nooit geschaald.'

Dit betekent dat het eerste gegevenspakket dat na de handshake in drie richtingen wordt verzonden, de werkelijke grootte van het venster is. Als er een schaalfactor is, wordt altijd de eerste venstergrootte van 65.535 bytes gebruikt. De grootte van het venster wordt vervolgens vermenigvuldigd met de schaalfactor die wordt geïdentificeerd in de handshake in drie richtingen. De onderstaande tabel vertegenwoordigt de grenzen van de schaalfactor voor verschillende venstergrootten.

Schaalfactor Schaalwaarde Eerste venster Venster geschaald
0 1 65535 of minder 65535 of minder
1 2 65535 131,070
2 4 65535 262,140
3 8 65535 524,280
4 16 65535 1,048,560
5 32 65535 2,097,120
6 64 65535 4,194,240
7 128 65535 8,388,480
8 256 65535 16,776,960
9 512 65535 33,553,920
10 1024 65535 67,107,840
11 2048 65535 134,215,680
12 4096 65535 268,431,360
13 8192 65535 536,862,720
14 16384 65535 1,073,725,440

Bijvoorbeeld:

Als de venstergrootte in het register wordt ingevoerd als 269000000 (269M) in decimalen, is de schaalfactor tijdens de handshake in drie richtingen 13. Met een schaalfactor van 12 is een venstergrootte van maximaal 268.431.360 bytes (268 miljoen) mogelijk.

De eerste venstergrootte in dit voorbeeld wordt als volgt berekend:
65.535 bytes met een vensterschaalfactor van 13.
Werkelijke venstergrootte = 65535*2^13
Werkelijke venstergrootte = 536.862.720

Wanneer de waarde voor venstergrootte wordt toegevoegd aan het register en de grootte groter is dan de standaardwaarde, probeert Windows een schaalwaarde te gebruiken die geschikt is voor de nieuwe venstergrootte.

De waarde Tcp1323Opts in de volgende registersleutel kan worden toegevoegd om schaalvensters en tijdstempels te beheren:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. Selecteer> StartRun op de werkbalk en typ Regedit om de register-Editor te starten.

  2. Selecteer in de Editor Register de optie Bewerken, wijs Nieuw aan en selecteer vervolgens DWORD-waarde.

  3. Typ in het vak Tcp1323OptsNieuwe waarde, druk op Enter en selecteer vervolgens wijzigen in het menu Bewerken.

    Opmerking

    Het geldige bereik is 0, 1, 2 of 3, waarbij:
    0 (RFC 1323-opties uitschakelen)
    1 (alleen vensterschaal ingeschakeld)
    2 (alleen tijdstempels ingeschakeld)
    3 (beide opties ingeschakeld)

Deze registervermelding bepaalt RFC 1323-tijdstempels en opties voor vensterschalen. Tijdstempels en vensterschalen zijn standaard ingeschakeld, maar kunnen worden gemanipuleerd met vlag-bits. Bit 0 bepaalt het schalen van vensters. Bit 1 bepaalt tijdstempels.

Tijdstempels

Voorheen gebruikte de TCP/IP-stack één voorbeeld per verzonden venster met gegevens om de retourtijd (RTT) te berekenen. Er is een timer (timer voor opnieuw verzenden) ingesteld toen het pakket werd verzonden, totdat de bevestiging werd ontvangen. Als de venstergrootte bijvoorbeeld 64.240 bytes (44 volledige segmenten) op een Ethernet-netwerk was, werd slechts één van elke 44 pakketten gebruikt om de retourtijd opnieuw te berekenen. Met een maximale venstergrootte van 65.535 bytes was deze steekproeffrequentie voldoende. Met behulp van vensterschaal en een maximale venstergrootte van 1 gigabyte is deze RTT-steekproeffrequentie niet voldoende.

De optie TCP-tijdstempel kan nu worden gebruikt voor segmenten (gegevens en ACK) die geschikt worden geacht door de stack, om bewerkingen uit te voeren, zoals:

  • RTT-berekening
  • PAWS-controle

Met behulp van deze gegevens kan de RTT nauwkeurig worden berekend met grote venstergrootten. RTT wordt gebruikt om retransmissieintervallen te berekenen. Nauwkeurige RTT- en retransmissietime-outs zijn nodig voor een optimale doorvoer.

Wanneer TCP-tijdstempel wordt gebruikt in een TCP-sessie, verzendt de afzender van de sessie de optie in het eerste pakket van de TCP-handshake in drie richtingen (SYN-pakket). Beide zijden kunnen vervolgens de TCP-optie gebruiken tijdens de sessie.

Optie TCP-tijdstempels (TSopt):

Soort = 8 Lengte = 10 TS-waarde (Tsval) TS Echo Reply (Tsecr)
1 byte 1 byte 4 bytes 4 bytes

Het tijdstempeloptieveld kan worden weergegeven in een netwerkmonitortracering door het veld TCP-opties uit te vouwen, zoals hieronder wordt weergegeven:

TCP: Timestamps Option  
TCP: Option Type = Timestamps  
TCP: Option Length = 10 (0xA)  
TCP: Timestamp = 2525186 (0x268802)  
TCP: Reply Timestamp = 1823192 (0x1BD1D8)

Beveiliging tegen verpakte volgnummers (PAWS)

Het veld TCP-reeksnummer is beperkt tot 32 bits, waardoor het aantal beschikbare volgnummers wordt beperkt. Met netwerken met hoge capaciteit en een grote gegevensoverdracht is het mogelijk om reeksnummers te verpakken voordat een pakket het netwerk doorkruist. Als gegevens worden verzonden op een Netwerk met één Giga-byte per seconde (Gbps), kunnen de reeksnummers in slechts 34 seconden teruglopen. Als een pakket wordt vertraagd, kan er mogelijk een ander pakket bestaan met hetzelfde volgnummer. Om verwarring bij dubbele volgnummers te voorkomen, wordt de TCP-tijdstempel gebruikt als uitbreiding op het volgnummer. Pakketten hebben huidige en voortgangsstempels. Een oud pakket heeft een ouder tijdstempel en wordt verwijderd.

Selectieve bevestigingen (SACK's)

Windows introduceert ondersteuning voor een prestatiefunctie die selectieve bevestiging of SACK wordt genoemd. SACK is met name belangrijk voor verbindingen die gebruikmaken van grote TCP-venstergrootten. Vóór SACK kon een ontvanger alleen het meest recente volgnummer van een aaneengesloten gegevensstroom die was ontvangen, of de 'linkerrand' van het ontvangstvenster bevestigen. Als SACK is ingeschakeld, blijft de ontvanger het ACK-nummer gebruiken om de linkerrand van het ontvangstvenster te bevestigen, maar kan de ontvanger ook andere blokken met ontvangen gegevens afzonderlijk bevestigen. SACK maakt gebruik van TCP-headeropties, zoals hieronder wordt weergegeven.

SACK maakt gebruik van twee typen TCP-opties.

De optie TCP Sack-Permitted wordt alleen gebruikt in een SYN-pakket (tijdens het tot stand brengen van de TCP-verbinding) om aan te geven dat het selectieve ACK kan uitvoeren.

De tweede TCP-optie, TCP Sack Option, bevat bevestiging voor een of meer gegevensblokken. De gegevensblokken worden geïdentificeerd met behulp van het volgnummer aan het begin en aan het einde van dat gegevensblok. Dit wordt ook wel de linker- en rechterrand van het gegevensblok genoemd.

Type 4 is TCP Sack-Permitted-optie. Soort 5 is TCP Sack Option. Lengte is de lengte in bytes van deze TCP-optie.

Tcp SACK toegestaan:

Soort = 4 Lengte = 2
1 byte 1 byte

Tcp SACK-optie:

Soort = 5 Lengte = Variabele
1 byte Linkerrand van eerste blok naar rechterrand van eerste blok
...
Linkerrand van Nth blok naar rechterrand van Nth blok

Als SACK is ingeschakeld (standaard), kan een pakket of reeks pakketten worden verwijderd. De ontvanger informeert de afzender welke gegevens zijn ontvangen en waar er mogelijk 'gaten' in de gegevens zijn. De afzender kan vervolgens de ontbrekende gegevens selectief opnieuw verzenden zonder dat blokken met gegevens die al zijn ontvangen, opnieuw worden verzonden. SACK wordt beheerd door de registerparameter SackOpts.

De waarde SackOpts in de volgende registersleutel kan worden bewerkt om het gebruik van selectieve bevestigingen te beheren:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Selecteer> StartRun op de werkbalk en typ Regedit om de register-Editor te starten.
  2. Zoek en selecteer de bovenstaande sleutel in het register Editor en selecteer vervolgens Wijzigen in het menu Bewerken.
  3. Typ de gewenste waarde in het vak Waardegegevens .

Opmerking

De geldige binaire waarde is 0 of 1, de standaardwaarde is 1. Deze parameter bepaalt of ondersteuning voor Selectieve ACK (SACK - RFC 2018) is ingeschakeld.

De volgende tracering van netwerkmonitor illustreert een host die alle gegevens tot het volgnummer 54857341, plus de gegevens van volgnummer 54858789-54861685. De ontbrekende gegevens zijn van 54857341 naar 54858788.

TCP: .A...., len:0, seq:925104-925104, ack:54857341, win:32722, src:1242 dst:139  
TCP: Source Port = 0x04DA  
TCP: Destination Port = NETBIOS Session Service  
TCP: Sequence Number = 925104 (0xE1DB0)  
TCP: Acknowledgement Number = 54857341 (0x3450E7D)  
TCP: Data Offset = 44 (0x2C)  
TCP: Reserved = 0 (0x0000)  
+ TCP: Flags = 0x10 : .A....  
TCP: Window = 32722 (0x7FD2)  
TCP: Checksum = 0x4A72  
TCP: Urgent Pointer = 0 (0x0)  
TCP: Options  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
+ TCP: Timestamps Option  
TCP: Option Nop = 1 (0x1)  
TCP: Option Nop = 1 (0x1)  
TCP: SACK Option  
TCP: Option Type = 0x05  
TCP: Option Length = 10 (0xA)  
TCP: Left Edge of Block = 54858789 (0x3451425)  
TCP: Right Edge of Block = 54861685 (0x3451F75)

Gedrag van TCP-hertransmissie en snelle hertransmit

TCP-hertransmissie

Als een beoordeling van het normale gedrag van retransmissie start TCP een timer voor opnieuwtransmissie wanneer elk uitgaand segment wordt overgedragen aan het Internet Protocol (IP). Als er geen bevestiging is ontvangen voor de gegevens in een bepaald segment voordat de timer verloopt, wordt het segment opnieuw verzonden.

De time-out voor hertransmissie (RTO) wordt continu aangepast aan de kenmerken van de verbinding met behulp van SRTT-berekeningen (Smoothed Round Trip Time), zoals beschreven in RFC 793. De timer voor een bepaald segment wordt verdubbeld na elke hertransmissie van dat segment. Met behulp van dit algoritme stemt TCP zichzelf af op de normale vertraging van een verbinding.

Snelle herverzending

TCP wordt onder bepaalde omstandigheden opnieuw verzonden voordat de timer voor opnieuw verzenden verloopt. De meest voorkomende oorzaak is een functie die bekend staat als snel opnieuw verzenden. Wanneer een ontvanger die ondersteuning biedt voor snelle retransmit gegevens ontvangt met een reeksnummer dat groter is dan het huidige verwachte nummer, zijn sommige gegevens waarschijnlijk verwijderd. Om de afzender van deze gebeurtenis op de hoogte te brengen, verzendt de ontvanger onmiddellijk een ACK, waarbij het ACK-nummer is ingesteld op het volgnummer dat hij verwachtte. Dit wordt voortgezet voor elk extra TCP-segment dat binnenkomt. Wanneer de afzender een stroom ACL's ontvangt die hetzelfde volgnummer erkent, is er mogelijk een segment verwijderd. De afzender zal het segment dat de ontvanger verwacht onmiddellijk opnieuw verzenden, zonder te wachten tot de timer voor opnieuw verzenden verloopt. Deze optimalisatie verbetert de prestaties aanzienlijk wanneer pakketten regelmatig worden verwijderd.

Standaard wordt een segment in Windows opnieuw verzonden onder de volgende voorwaarden:

  • Het ontvangt drie ACL's voor hetzelfde volgnummer: één ACK en twee duplicaten.
  • Het volgnummer loopt achter op het huidige nummer.

Dit gedrag kan worden bepaald met de TcpMaxDupAcks registerparameter.

De waarde TcpMaxDupAcks in de volgende registersleutel kan worden bewerkt om het aantal ACL's te bepalen dat nodig is om een snelle hertransmits te starten:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Selecteer> StartRun op de werkbalk en typ Regedit om de register-Editor te starten.
  2. Zoek en selecteer de bovenstaande sleutel in het register Editor en selecteer vervolgens Wijzigen in het menu Bewerken.
  3. Typ de gewenste waarde in het vak Waardegegevens .

Opmerking

Het geldige bereik is 1-3, de standaardwaarde is 2.

Deze parameter bepaalt het aantal dubbele ACL's dat moet worden ontvangen voor hetzelfde aantal verzonden gegevens voordat fast retransmit wordt geactiveerd om het segment dat tijdens overdracht is verwijderd, opnieuw te verzenden.