Opis funkcji TCP systemu Windows

W tym artykule opisano funkcje TCP w systemie Windows.

Dotyczy systemów: Windows 10 — wszystkie wersje, Windows Server 2012 R2
Oryginalny numer KB: 224829

Podsumowanie

W tym artykule opisano następujące funkcje protokołu TCP w systemie Windows:

  • Rozmiar okna TCP
  • Opcje TCP są teraz obsługiwane
  • Skalowanie systemu Windows — RFC 1323
  • Sygnatura czasowa — RFC 1323
  • Ochrona przed zawiniętymi numerami sekwencji (PAWS)
  • Potwierdzenia selektywne (SACKS) — RFC 2018
  • Zachowanie retransmisji TCP i szybka retransmitowanie

Funkcje TCP można zmienić, zmieniając wpisy w rejestrze.

Ważna

Poniższe sekcje, metody lub zadania zawierają kroki, które informują o sposobie modyfikowania rejestru. Niepoprawne zmodyfikowanie rejestru może jednak być przyczyną poważnych problemów. Dlatego należy uważnie wykonywać podane czynności. Dla większego bezpieczeństwa przed zmodyfikowaniem rejestru należy wykonać jego kopię zapasową. Dzięki temu będzie można przywrócić rejestr w przypadku wystąpienia problemu. Aby uzyskać więcej informacji dotyczących wykonywania kopii zapasowej i przywracania rejestru, kliknij następujący numer artykułu w celu wyświetlenia tego artykułu z bazy wiedzy Microsoft Knowledge Base:
322756 Jak wykonać kopię zapasową rejestru i przywrócić go w systemie Windows

Rozmiar okna TCP

Rozmiar okna odbierania TCP to ilość odbieranych danych (w bajtach), które mogą być buforowane podczas połączenia. Host wysyłający może wysłać tylko tę ilość danych, zanim będzie musiał poczekać na potwierdzenie i aktualizację okna od odbierającego hosta. Stos TCP/IP systemu Windows został zaprojektowany do samodzielnego dostosowywania się w większości środowisk i używa większych domyślnych rozmiarów okien niż wcześniejsze wersje.

Zamiast używać zakodowanego domyślnego rozmiaru okna odbierania, protokół TCP dostosowuje się do nawet przyrostów maksymalnego rozmiaru segmentu (MSS). Usługa MSS jest negocjowana podczas konfigurowania połączenia. Dostosowanie okna odbierania do nawet przyrostów mss zwiększa procent pełnowymiarowych segmentów TCP używanych podczas transmisji danych zbiorczych.

Rozmiar okna odbierania jest określany w następujący sposób:

  1. Pierwsze żądanie połączenia wysłane do hosta zdalnego anonsuje rozmiar okna odbierania 16 000 (16 384 bajtów).
  2. Po nawiązaniu połączenia rozmiar okna odbierania jest zaokrąglany w górę do równomiernego wzrostu mss.
  3. Rozmiar okna jest dostosowywany do czterokrotności mss, do maksymalnego rozmiaru 64 K, chyba że jest używana opcja skalowania okien (RFC 1323).

Uwaga

Zobacz sekcję "Skalowanie systemu Windows".

W przypadku połączeń Ethernet rozmiar okna będzie zwykle ustawiony na 17 520 bajtów (16 000 zaokrąglonych do dwunastu segmentów 1460 bajtów). Rozmiar okna może zmniejszyć się po nawiązaniu połączenia z komputerem, który obsługuje rozszerzone opcje głowicY TCP, takie jak potwierdzenia selektywne (SACKS) i znaczniki czasu. Te dwie opcje zwiększają rozmiar nagłówka TCP do ponad 20 bajtów, co daje mniej miejsca na dane.

W poprzednich wersjach systemu Windows NT rozmiar okna dla połączenia Ethernet wynosił 8760 bajtów lub sześć segmentów 1460 bajtów.

Aby ustawić rozmiar okna odbierania na określoną wartość, dodaj wartość TcpWindowSize do podklucza rejestru specyficznego dla wersji systemu Windows. Aby tak zrobić, wykonaj następujące kroki:

  1. Wybierz pozycję Rozpocznij>uruchamianie, wpisz Regedit, a następnie wybierz przycisk OK.

  2. Rozwiń podklucz rejestru specyficzny dla twojej wersji systemu Windows:

    • W przypadku systemu Windows 2000 rozwiń następujący podklucz: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • W przypadku systemu Windows Server 2003 rozwiń następujący podklucz: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. W menu Edytuj wskaż pozycję Nowy, a następnie wybierz pozycję WARTOŚĆ DWORD.

  4. Wpisz TcpWindowSize w polu Nowa wartość , a następnie naciśnij klawisz Enter

  5. Wybierz pozycję Modyfikuj w menu Edycja .

  6. Wpisz żądany rozmiar okna w polu Dane wartości .

    Uwaga

    Prawidłowy zakres rozmiaru okna to 0-0x3FFFC000 szesnastkowa.

Ta wartość nie jest domyślnie obecna. Po dodaniu wartości TcpWindowSize zastępuje ona domyślny algorytm rozmiaru okna omówiony powyżej.

Uwaga

TcpWindowSize można również dodać do klucza Parametry, aby ustawić rozmiar okna globalnie dla wszystkich interfejsów.

Opcje TCP są teraz obsługiwane

Wcześniej opcje TCP były używane głównie do negocjowania maksymalnych rozmiarów segmentów. W systemie Windows opcje TCP są używane do skalowania okien, sygnatury czasowej i selektywnej ACK.

Istnieją dwa typy opcji protokołu TCP:

  1. Opcja TCP pojedynczej oktetu, która służy do wskazywania określonego rodzaju opcji.
  2. Opcja TCP z wieloma oktetami, która składa się z rodzaju opcji, długości opcji i serii oktetów opcji.

Na poniższej liście przedstawiono każdy rodzaj opcji TCP, długość, nazwę i opis.

Rodzaj: 0
Długość: 1
Opcja: koniec listy opcji
Opis: używane, gdy dopełnienie jest potrzebne dla ostatniej opcji TCP.

Rodzaj: 1
Długość: 1
Opcja: Brak operacji
Opis: używane, gdy wymagane jest dopełnienie, a więcej opcji TCP jest dostępnych w ramach tego samego pakietu.

Rodzaj: 2
Długość: 4
Opcja: maksymalny rozmiar segmentu
Opis: wskazuje maksymalny rozmiar segmentu TCP, który może być wysyłany przez sieć.

Rodzaj: 3
Długość: 3
Opcja: opcja skalowania okien
Opis: identyfikuje współczynnik skalowania, który ma być używany podczas używania rozmiarów okien większych niż 64 tys.

Rodzaj: 8
Długość: 10
Opcja: Opcja sygnatury czasowej
Opis: służy do obliczania czasu rundy (RTT) przesyłanych pakietów.

Rodzaj: 4
Długość: 2
Opcja: Dozwolony protokół TCP SACK
Opis: Informuje inne hosty, że selektywne pakiety Ack są dozwolone.

Rodzaj: 5
Długość: różni się
Opcja: opcja TCP SACK
Opis: używany przez hosty do identyfikowania, czy odebrano pakiety poza kolejnością.

Skalowanie systemu Windows

W celu wydajniejszego korzystania z sieci o wysokiej przepustowości można użyć większego rozmiaru okna TCP. Pole rozmiaru okna TCP steruje przepływem danych i jest ograniczone do 2 bajtów lub rozmiar okna 65 535 bajtów.

Ponieważ nie można rozszerzyć pola rozmiaru, używany jest współczynnik skalowania. Skala okien TCP to opcja służąca do zwiększenia maksymalnego rozmiaru okna z 65 535 bajtów do 1 gigabajtu.

Opcja skalowania okien jest używana tylko podczas uzgadniania trójstopnienego protokołu TCP. Wartość skalowania okna reprezentuje liczbę bitów do przesunięcia w lewo pola rozmiaru okna 16-bitowego. Wartość skalowania okna można ustawić z 0 (bez zmiany) do 14.

Aby obliczyć rzeczywisty rozmiar okna, pomnóż rozmiar okna przez 2^S, gdzie S jest wartością skalowania.

Na przykład:

Jeśli rozmiar okna wynosi 65 535 bajtów ze współczynnikiem skalowania okna 3.
Rzeczywisty rozmiar okna = 65535*2^3

Rzeczywisty rozmiar okna = 524280

Poniższy ślad monitora sieci pokazuje, jak jest używana opcja skalowania okien:

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  

Rozmiar okna używany w rzeczywistym uzgadnianiu trójstopniowym nie jest rozmiarem okna, który jest skalowany zgodnie z sekcją 2.2 RFC 1323:

"Pole Okno w segmencie SYN (na przykład [SYN] lub [SYN,ACK]) nigdy nie jest skalowane."

Oznacza to, że pierwszy pakiet danych wysłany po uzgadnianiu trójstopnienym jest rzeczywistym rozmiarem okna. Jeśli istnieje współczynnik skalowania, zawsze jest używany początkowy rozmiar okna 65 535 bajtów. Rozmiar okna jest następnie mnożony przez współczynnik skalowania zidentyfikowany w uzgadnianiu trójstopniowym. Poniższa tabela przedstawia granice współczynnika skalowania dla różnych rozmiarów okien.

Współczynnik skalowania Wartość skalowania Okno początkowe Skalowane okno
0 1 65535 lub mniej 65535 lub mniej
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

Przykład:

Jeśli rozmiar okna w rejestrze jest wprowadzany jako 2690000000 (269M) w postaci dziesiętnej, współczynnik skalowania podczas uzgadniania trójstopnienego wynosi 13. Współczynnik skalowania 12 umożliwia tylko rozmiar okna do 268 431 360 bajtów (268 M).

Początkowy rozmiar okna w tym przykładzie zostanie obliczony w następujący sposób:
65 535 bajtów ze współczynnikiem skalowania okien wynoszącym 13.
Rzeczywisty rozmiar okna = 65535*2^13
Rzeczywisty rozmiar okna = 536 862 720

Gdy wartość rozmiaru okna jest dodawana do rejestru, a jego rozmiar jest większy niż wartość domyślna, system Windows próbuje użyć wartości skalowania, która uwzględnia nowy rozmiar okna.

Wartość Tcp1323Opts w następującym kluczu rejestru można dodać do sterowania oknami skalowania i znacznikiem czasu:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. Na pasku narzędzi wybierz pozycję Rozpocznij>uruchamianie, a następnie wpisz Regedit polecenie , aby uruchomić Redaktor rejestru.

  2. W Redaktor rejestru wybierz pozycję Edytuj, wskaż pozycję Nowy, a następnie wybierz pozycję WARTOŚĆ DWORD.

  3. W polu Nowa wartość wpisz Tcp1323Opts, naciśnij klawisz ENTER, a następnie w menu Edytuj wybierz pozycję Modyfikuj.

    Uwaga

    Prawidłowy zakres to 0, 1, 2 lub 3, gdzie:
    0 (wyłącz opcje RFC 1323)
    1 (tylko włączona skala okien)
    2 (tylko znaczniki czasu włączone)
    3 (obie opcje są włączone)

Ten wpis rejestru kontroluje znaczniki czasu RFC 1323 i opcje skalowania okien. Znaczniki czasu i skalowanie okien są domyślnie włączone, ale można nimi manipulować za pomocą bitów flagi. Bit 0 steruje skalowaniem okien. Bit 1 kontroluje znaczniki czasu.

Sygnatury czasowe

Wcześniej stos TCP/IP używał jednego przykładu na okno wysłanych danych, aby obliczyć czas rundy (RTT). Czasomierz (czasomierz ponownego przesyłania) został ustawiony, gdy pakiet został wysłany do momentu odebrania potwierdzenia. Jeśli na przykład rozmiar okna wynosił 64 240 bajtów (44 pełne segmenty) w sieci Ethernet, tylko jeden z 44 pakietów został użyty do ponownego obliczenia czasu rundy. Przy maksymalnym rozmiarze okna wynoszącym 65 535 bajtów ta częstotliwość próbkowania była wystarczająca. Przy użyciu skalowania okien i maksymalnego rozmiaru okna wynoszącego 1 gigabajt ten współczynnik próbkowania RTT nie jest wystarczający.

Opcja Sygnatura czasowa protokołu TCP może być teraz używana w segmentach (danych i ACK) uważanych za odpowiednie dla stosu do wykonywania operacji, takich jak:

  • Obliczenia RTT
  • Sprawdzanie usługi PAWS

Korzystając z tych danych, rtt można dokładnie obliczyć przy użyciu dużych rozmiarów okien. Funkcja RTT służy do obliczania interwałów retransmisji. Dokładne limity czasu rtt i retransmisji są potrzebne w celu uzyskania optymalnej przepływności.

Gdy sygnatura czasowa TCP jest używana w sesji TCP, inicjalator sesji wysyła opcję w pierwszym pakietze trzystopniowego uzgadniania TCP (pakiet SYN). Każda ze stron może następnie użyć opcji TCP podczas sesji.

Opcja znaczników czasu TCP (TSopt):

Rodzaj = 8 Długość = 10 Wartość TS (Tsval) TS Echo Reply (Tsecr)
1 bajt 1 bajt 4 bajty 4 bajty

Pole opcji sygnatury czasowej można wyświetlić w śledzenia monitora sieci przez rozszerzenie pola opcje TCP, jak pokazano poniżej:

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

Ochrona przed zawiniętymi numerami sekwencji (PAWS)

Pole numer sekwencji TCP jest ograniczone do 32 bitów, co ogranicza liczbę dostępnych numerów sekwencji. W przypadku sieci o dużej pojemności i dużego transferu danych można zawinąć numery sekwencji, zanim pakiet przejdzie przez sieć. W przypadku wysyłania danych w jednej sieci gigabajtowej na sekundę (Gb/s) liczby sekwencji mogą kończyć się zaledwie 34 sekundami. Jeśli pakiet jest opóźniony, inny pakiet może potencjalnie istnieć z tym samym numerem sekwencji. Aby uniknąć pomyłek dotyczących zduplikowanych numerów sekwencji, sygnatura czasowa TCP jest używana jako rozszerzenie numeru sekwencji. Pakiety mają bieżące i postępujące sygnatury czasowe. Stary pakiet ma starszy sygnaturę czasową i jest odrzucany.

Selektywne potwierdzenia (SACK)

System Windows wprowadza obsługę funkcji wydajności znanej jako potwierdzenie selektywne lub SACK. Sack jest szczególnie ważny w przypadku połączeń korzystających z dużych rozmiarów okien TCP. Przed rozwiązaniem SACK odbiornik mógł potwierdzić tylko najnowszy numer sekwencji ciągłego strumienia danych, który został odebrany, lub "lewą krawędź" okna odbioru. Po włączeniu funkcji SACK odbiornik nadal używa numeru ACK, aby potwierdzić lewą krawędź okna odbioru, ale może również indywidualnie potwierdzać inne bloki odebranych danych. Sack używa opcji nagłówka TCP, jak pokazano poniżej.

Sack używa dwóch typów opcji TCP.

Opcja Sack-Permitted TCP jest używana tylko w pakietze SYN (podczas ustanawiania połączenia TCP), aby wskazać, że może wykonać selektywną ACK.

Druga opcja TCP, opcja worka TCP, zawiera potwierdzenie co najmniej jednego bloku danych. Bloki danych są identyfikowane przy użyciu numeru sekwencji na początku i na końcu tego bloku danych. Jest ona również nazywana lewą i prawą krawędzią bloku danych.

Rodzaj 4 to opcja Sack-Permitted TCP. Rodzaj 5 to opcja worka TCP. Długość to długość w bajtach tej opcji TCP.

Tcp SACK Dozwolone:

Rodzaj = 4 Długość = 2
1 bajt 1 bajt

Opcja Tcp SACK:

Rodzaj = 5 Długość = Zmienna
1 bajt Lewa krawędź pierwszego bloku do prawej krawędzi pierwszego bloku
...
Lewa krawędź bloku Nth do prawej krawędzi bloku Nth

Z włączoną opcją SACK (ustawienie domyślne) można porzucić pakiet lub serię pakietów. Odbiorca informuje nadawcę, które dane zostały odebrane i gdzie mogą znajdować się "dziury" w danych. Nadawca może następnie selektywnie przetransmitować brakujące dane bez ponownego przesyłania bloków danych, które zostały już pomyślnie odebrane. Sack jest kontrolowany przez parametr rejestru SackOpts.

Wartość SackOpts w następującym kluczu rejestru można edytować, aby kontrolować użycie selektywnych potwierdzenia:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Na pasku narzędzi wybierz pozycję Rozpocznij>uruchamianie, a następnie wpisz Regedit polecenie , aby uruchomić Redaktor rejestru.
  2. Znajdź i wybierz powyższy klucz w Redaktor rejestru, a następnie wybierz pozycję Modyfikuj w menu Edycja.
  3. Wpisz żądaną wartość w polu Dane wartości .

Uwaga

Prawidłowa wartość binarna to 0 lub 1, a wartość domyślna to 1. Ten parametr określa, czy obsługa selektywnej ACK (SACK — RFC 2018) jest włączona.

Poniższy ślad monitora sieci ilustruje hosta potwierdzającego wszystkie dane do 54857341 numerów sekwencji oraz dane z sekwencji o numerze 54858789-54861685. Brakujące dane pochodzą z 54857341 do 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)

Zachowanie retransmisji TCP i szybka retransmitowanie

Retransmisję TCP

W ramach przeglądu normalnego zachowania retransmisji protokół TCP uruchamia czasomierz retransmisji, gdy każdy segment ruchu wychodzącego jest przekazywany do protokołu internetowego (IP). Jeśli dane w danym segmencie nie zostały odebrane przed wygaśnięciem czasomierza, segment zostanie ponownie przesłany.

Limit czasu retransmisji (RTO) jest dostosowywany w sposób ciągły w celu dopasowania do charakterystyk połączenia przy użyciu obliczeń smoothed Round Trip Time (SRTT) zgodnie z opisem w dokumencie RFC 793. Czasomierz dla danego segmentu jest podwojony po każdej retransmisji tego segmentu. Za pomocą tego algorytmu protokół TCP dostosowuje się do normalnego opóźnienia połączenia.

Szybka retransmitowanie

TCP ponownie przesyła dane przed wygaśnięciem czasomierza retransmisji w pewnych okolicznościach. Najczęstszą przyczyną jest funkcja znana jako szybka retransmit. Gdy odbiornik obsługjący szybką retransmitę odbiera dane z liczbą sekwencji spoza bieżącego oczekiwanego, niektóre dane prawdopodobnie zostały porzucone. Aby ułatwić informowanie nadawcy o tym zdarzeniu, odbiorca natychmiast wysyła ACK z numerem ACK ustawionym na oczekiwany numer sekwencji. Będzie to nadal robić dla każdego dodatkowego segmentu TCP, który nadejdzie. Gdy nadawca zacznie odbierać strumień zestawów ACK, który potwierdza ten sam numer sekwencji, segment mógł zostać usunięty. Nadawca natychmiast ponownie wyśle segment, który oczekuje od odbiorcy, bez oczekiwania na wygaśnięcie czasomierza retransmisji. Ta optymalizacja znacznie zwiększa wydajność, gdy pakiety są często porzucane.

Domyślnie system Windows ponownie zapisuje segment w następujących warunkach:

  • Otrzymuje trzy zestawy ACK dla tego samego numeru sekwencji: jeden ACK i dwa duplikaty.
  • Numer sekwencji opóźnia bieżącą.

To zachowanie można kontrolować za pomocą parametru TcpMaxDupAcks rejestru.

Wartość TcpMaxDupAcks w następującym kluczu rejestru można edytować w celu kontrolowania liczby zestawów ACK niezbędnych do szybkiego ponownego przesyłania:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. Na pasku narzędzi wybierz pozycję Rozpocznij>uruchamianie, a następnie wpisz Regedit polecenie , aby uruchomić Redaktor rejestru.
  2. Znajdź i wybierz powyższy klucz w Redaktor rejestru, a następnie wybierz pozycję Modyfikuj w menu Edycja.
  3. Wpisz żądaną wartość w polu Dane wartości .

Uwaga

Prawidłowy zakres to 1–3, a wartość domyślna to 2.

Ten parametr określa liczbę zduplikowanych zestawów ACK, które muszą zostać odebrane dla tej samej liczby sekwencji wysłanych danych, zanim fast retransmit zostaną wyzwolone w celu ponownego wysłania segmentu, który został porzucony podczas przesyłania.