Описание функций Windows TCP

В этой статье описаны функции TCP в Windows.

Применимо к следующим выпускам: Windows 10 – все выпуски, Windows Server 2012 R2
Исходный номер базы знаний: 224829

Сводка

В этой статье описываются следующие функции TCP в Windows:

  • Размер окна TCP
  • Параметры TCP теперь поддерживаются
  • Масштабирование Windows — RFC 1323
  • Метка времени — RFC 1323
  • Защита от упакованных порядковых номеров (PAWS)
  • Выборочные подтверждения (SACKS) — RFC 2018
  • Поведение повторной передачи TCP и быстрая повторная передача

Функции TCP можно изменить, изменив записи в реестре.

Важно!

В следующих разделах, методах или задачах содержатся инструкции по изменению реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому следует в точности выполнять приведенные инструкции. Для дополнительной защиты создайте резервную копию реестра, прежде чем редактировать его. Так вы сможете восстановить реестр, если возникнет проблема. Дополнительные сведения о создании резервной копии и восстановлении реестра см. в соответствующей статье базы знаний Майкрософт:
322756 Создание резервной копии и восстановление реестра Windows

Размер окна TCP

Размер окна получения TCP — это объем данных получения (в байтах), которые можно буферистить во время подключения. Отправляющий узел может отправлять только этот объем данных, прежде чем ему придется дождаться подтверждения и обновления окна от принимающего узла. Стек WINDOWS TCP/IP предназначен для самостоятельной настройки в большинстве сред и использует окна по умолчанию большего размера, чем в более ранних версиях.

Вместо использования жестко запрограммированного размера окна получения по умолчанию TCP адаптируется к четным приращениям максимального размера сегмента (MSS). MSS согласовывается во время настройки подключения. При настройке окна получения до четных приращений MSS увеличивается процент полноразмерных сегментов TCP, используемых во время массовой передачи данных.

Размер окна получения определяется следующим образом:

  1. Первый запрос на подключение, отправленный удаленному узлу, объявляет окно получения размером 16 КБ (16 384 байта).
  2. Когда подключение установлено, размер окна получения округляется до четного приращения MSS.
  3. Размер окна изменяется в четыре раза больше MSS до максимального размера 64 КБ, если не используется параметр масштабирования окна (RFC 1323).

Примечание.

См. раздел "Масштабирование Windows".

Для подключений Ethernet размер окна обычно устанавливается в 17 520 байт (16 КБ округляется до двенадцати сегментов 1460 байт). Размер окна может уменьшиться при установке подключения к компьютеру, который поддерживает расширенные параметры головки TCP, такие как выборочные подтверждения (SACKS) и метки времени. Эти два варианта увеличивают размер заголовка TCP до более чем 20 байт, что приводит к уменьшению места для данных.

В предыдущих версиях Windows NT размер окна для подключения Ethernet составлял 8760 байт или шесть сегментов размером 1460 байт.

Чтобы задать размер окна получения определенного значения, добавьте значение TcpWindowSize в подраздел реестра, относящееся к вашей версии Windows. Для этого выполните указанные ниже действия.

  1. Нажмите кнопку Запустить>запуск, введите Regeditи нажмите кнопку ОК.

  2. Разверните подраздел реестра для вашей версии Windows:

    • Для Windows 2000 разверните следующий подраздел: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces

    • Для Windows Server 2003 разверните следующий подраздел: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  3. В меню Правка наведите указатель мыши на пункт Создать, а затем выберите значение DWORD.

  4. Введите TcpWindowSize в поле Новое значение и нажмите клавишу ВВОД.

  5. Выберите Изменить в меню Правка .

  6. Введите нужный размер окна в поле Значение .

    Примечание.

    Допустимый диапазон для размера окна — 0–0x3FFFC000 шестнадцатеричный.

По умолчанию это значение отсутствует. При добавлении значения TcpWindowSize он переопределяет алгоритм размера окна по умолчанию, описанный выше.

Примечание.

TcpWindowSize также можно добавить в раздел Параметры, чтобы глобально задать размер окна для всех интерфейсов.

Параметры TCP теперь поддерживаются

Ранее параметры TCP использовались в основном для согласования максимальных размеров сегментов. В Windows параметры TCP используются для масштабирования окна, метки времени и выборочного ACK.

Существует два типа параметров TCP:

  1. Параметр TCP с одним октетом, который используется для указания определенного типа параметра.
  2. Параметр TCP с несколькими октетами, который состоит из типа параметра, длины параметра и ряда октетов параметров.

В следующем списке показаны тип, длина, имя и описание каждого параметра TCP.

Тип: 0
Длина: 1
Параметр: конец списка вариантов
Описание: используется, когда для последнего параметра TCP требуется заполнение.

Вид: 1
Длина: 1
Параметр: нет операции
Описание: используется, когда требуется заполнение, и в одном пакете следуют дополнительные параметры TCP.

Вид: 2
Длина: 4
Параметр: Максимальный размер сегмента
Описание. Указывает максимальный размер сегмента TCP, который может быть отправлен по сети.

Вид: 3
Длина: 3
Параметр: параметр масштабирования окна
Описание. Определяет коэффициент масштабирования, используемый при использовании размеров окна больше 64 кб.

Вид: 8
Длина: 10
Параметр: параметр метки времени
Описание: используется для вычисления времени кругового пути (RTT) передаваемых пакетов.

Вид: 4
Длина: 2
Параметр: разрешено TCP SACK
Описание: сообщает другим узлам о том, что разрешены выборочные acks.

Вид: 5
Длина: зависит от
Параметр: параметр TCP SACK
Описание: используется узлами для определения того, были ли получены неупорядоченные пакеты.

Масштабирование Windows

Для более эффективного использования сетей с высокой пропускной способностью можно использовать больший размер окна TCP. Поле размера окна TCP управляет потоком данных и ограничено 2 байтами или размером окна 65 535 байт.

Так как поле размера невозможно развернуть, используется коэффициент масштабирования. Масштабирование окон TCP — это параметр, используемый для увеличения максимального размера окна с 65 535 байт до 1 гигабайта.

Параметр масштабирования окна используется только во время трехстороннего подтверждения TCP. Значение масштабирования окна представляет количество битов для сдвига влево 16-битового поля размера окна. Значение шкалы окна можно задать от 0 (без смены) до 14.

Чтобы вычислить истинный размер окна, умножьте размер окна на 2^S, где S — это значение шкалы.

Например:

Если размер окна составляет 65 535 байт с коэффициентом масштабирования окна 3.
Истинный размер окна = 65535*2^3

Истинный размер окна = 524280

Следующая трассировка сетевого монитора показывает, как используется параметр масштабирования окна:

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  

Размер окна, используемый в фактическом трехстороннем подтверждении, не является масштабируемым размером окна в соответствии с RFC 1323, раздел 2.2:

"Поле Window в сегменте SYN (например, [SYN] или [SYN,ACK]) никогда не масштабируется.

Это означает, что первый пакет данных, отправленный после трехстороннего подтверждения, является фактическим размером окна. При наличии коэффициента масштабирования всегда используется начальный размер окна в 65 535 байт. Затем размер окна умножается на коэффициент масштабирования, определенный в трехстороннем подтверждении. В приведенной ниже таблице представлены границы коэффициента масштабирования для различных размеров окон.

Коэффициент масштабирования Значение масштабирования Начальное окно Масштабируемая оконная шкала
0 1 65535 или меньше 65535 или меньше
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

Например:

Если размер окна в реестре указан как 2690000000 (269M) в десятичном формате, коэффициент масштабирования во время трехстороннего подтверждения равен 13. Коэффициент масштабирования 12 допускает только размер окна до 268 431 360 байт (268 МЛН).

Начальный размер окна в этом примере будет вычисляться следующим образом:
65 535 байт с коэффициентом масштабирования окна 13.
Истинный размер окна = 65535*2^13
Истинный размер окна = 536 862 720

Если значение размера окна добавляется в реестр, а его размер превышает значение по умолчанию, Windows пытается использовать значение масштабирования, которое соответствует новому размеру окна.

Значение Tcp1323Opts в следующем разделе реестра можно добавить для управления окнами масштабирования и метками времени:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters

  1. На панели инструментов выберите Запустить>запуск и введите Regedit , чтобы запустить Редактор реестра.

  2. В Редактор реестра выберите Изменить, наведите указатель мыши на пункт Создать, а затем выберите Значение DWORD.

  3. В поле Новое значение введите Tcp1323Opts, нажмите клавишу ВВОД, а затем в меню Правка выберите Изменить.

    Примечание.

    Допустимый диапазон — 0, 1, 2 или 3, где:
    0 (отключить параметры RFC 1323)
    1 (включено только масштабирование окна)
    2 (только метки времени включены)
    3 (оба параметра включены)

Эта запись реестра управляет метками времени RFC 1323 и параметрами масштабирования окон. Метки времени и масштабирование окон включены по умолчанию, но могут управляться битами флагов. Бит 0 управляет масштабированием окна. Бит 1 управляет метками времени.

Временные метки

Ранее стек TCP/IP использовал одну выборку для каждого окна отправляемых данных для вычисления времени кругового пути (RTT). Таймер (таймер повторной передачи) был установлен при отправке пакета до получения подтверждения. Например, если размер окна в сети Ethernet составлял 64 240 байт (44 полных сегмента), для пересчета времени кругового пути использовался только один из каждых 44 пакетов. При максимальном размере окна в 65 535 байт эта частота выборки была достаточной. При масштабировании окон и максимальном размере окна в 1 Гбит, эта частота выборки RTT недостаточную.

Параметр Метка времени TCP теперь можно использовать для сегментов (данных и ACK), которые считаются подходящими для стека, для выполнения таких операций, как:

  • Вычисления RTT
  • проверка PAWS

Используя эти данные, можно точно вычислить RTT с большими размерами окон. RTT используется для вычисления интервалов повторной передачи. Для оптимальной пропускной способности требуется точное время ожидания RTT и повторной передачи.

Если метка времени TCP используется в сеансе TCP, инициатор сеанса отправляет параметр в своем первом пакете трехстороннего подтверждения TCP (пакет SYN). Затем обе стороны могут использовать параметр TCP во время сеанса.

Параметр "Метки времени TCP" (TSopt):

Тип = 8 Длина = 10 TS Value (Tsval) Ответ на эхо TS (Tsecr)
1 байт 1 байт 4 байта 4 байта

Поле параметра метки времени можно просмотреть в трассировке сетевого монитора, развернув поле параметры TCP, как показано ниже:

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

Защита от упакованных порядковых номеров (PAWS)

Поле порядкового номера TCP ограничено 32 битами, что ограничивает количество доступных порядковых номеров. При использовании сетей высокой емкости и большой передачи данных можно упаковать порядковые номера до того, как пакет будет проходить по сети. При отправке данных в сети с одним гига-байтом в секунду (Гбит/с) порядковые номера могут храниться всего за 34 секунды. Если пакет задерживается, может существовать другой пакет с тем же порядковый номер. Чтобы избежать путаницы в повторяющихся порядковых номерах, метка времени TCP используется в качестве расширения последовательного номера. Пакеты имеют текущие и текущие метки времени. Старый пакет имеет старую метку времени и отбрасывается.

Выборочные подтверждения (SACK)

В Windows реализована поддержка функции производительности, известной как селективное подтверждение или SACK. SACK особенно важен для подключений, использующих большие размеры окон TCP. До SACK получатель мог подтвердить только последний порядковый номер непрерывного потока данных, который был получен, или "левый край" окна получения. После включения SACK получатель продолжает использовать номер ACK для подтверждения левого края окна получения, но он также может подтвердить другие блоки полученных данных по отдельности. SACK использует параметры заголовка TCP, как показано ниже.

SACK использует два типа параметров TCP.

Параметр TCP Sack-Permitted используется только в пакете SYN (во время установки TCP-подключения), чтобы указать, что он может выполнять выборочное ACK.

Второй параметр TCP, TCP Sack Option, содержит подтверждение для одного или нескольких блоков данных. Блоки данных определяются с помощью порядкового номера в начале и в конце этого блока данных. Он также называется левым и правым краем блока данных.

Тип 4 — параметр TCP Sack-Permitted. Тип 5 — параметр TCP Sack. Длина — это длина в байтах этого параметра TCP.

Tcp SACK разрешен:

Тип = 4 Длина = 2
1 байт 1 байт

Параметр TCP SACK:

Тип = 5 Length = Variable
1 байт Левый край первого блока к правому краю первого блока
...
Левый край N-го блока до правого края N-го блока

Если SACK включен (по умолчанию), пакет или ряд пакетов можно удалить. Получатель сообщает отправителю, какие данные были получены и где могут быть "дыры" в данных. Затем отправитель может выборочно перенапустить отсутствующие данные без повторной передачи блоков данных, которые уже были успешно получены. SACK управляется параметром реестра SackOpts.

Значение SackOpts в следующем разделе реестра можно изменить, чтобы контролировать использование выборочных подтверждений:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. На панели инструментов выберите Запустить>запуск и введите Regedit , чтобы запустить Редактор реестра.
  2. Найдите и выберите указанный выше раздел в Редактор реестра, а затем выберите Изменить в меню Правка.
  3. Введите нужное значение в поле Значение .

Примечание.

Допустимое двоичное значение — 0 или 1, значение по умолчанию — 1. Этот параметр определяет, включена ли поддержка селективного ACK (SACK — RFC 2018).

Следующая трассировка сетевого монитора показывает узел, который подтверждает все данные до порядкового номера 54857341, а также данные из последовательного номера 54858789-54861685. Отсутствующие данные от 54857341 до 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)

Поведение повторной передачи TCP и быстрая повторная передача

Повторная передача TCP

В качестве обзора нормального поведения ретранслирования TCP запускает таймер повторной передачи, когда каждый исходящий сегмент передается ip-адресу. Если до истечения срока действия таймера не было получено подтверждение для данных в данном сегменте, сегмент передается повторно.

Время ожидания повторной передачи (RTO) постоянно корректируется в соответствии с характеристиками соединения с помощью вычислений сглаженного времени кругового пути (SRTT), как описано в RFC 793. Таймер для данного сегмента удваивается после каждой повторной передачи этого сегмента. Используя этот алгоритм, TCP настраивает себя на обычную задержку подключения.

Быстрая повторная передача

TCP повторно передает данные до истечения срока действия таймера повторной передачи при некоторых обстоятельствах. Наиболее распространенной причиной является функция, известная как быстрая повторная передача. Когда получатель, поддерживающий быструю повторную передачу, получает данные с порядковой номером, превышающим текущий ожидаемый, некоторые данные, скорее всего, были удалены. Чтобы помочь сообщить отправителю об этом событии, получатель немедленно отправляет ACK с номером ACK, заданным как порядковый номер, который он ожидал. Он будет продолжать делать это для каждого дополнительного сегмента TCP, который поступает. Когда отправитель начинает получать поток AK, который подтверждает тот же порядковый номер, возможно, сегмент был удален. Отправитель немедленно повторно отправит сегмент, который ожидает получатель, не дожидаясь истечения срока действия таймера повторной передачи. Эта оптимизация значительно повышает производительность при частом удалении пакетов.

По умолчанию Windows повторно отправляет сегмент при следующих условиях:

  • Он получает три AK для одного порядкового номера: один ACK и два дубликата.
  • Порядковый номер отстает от текущего.

Это поведение можно контролировать с помощью TcpMaxDupAcks параметра реестра.

Значение TcpMaxDupAcks в следующем разделе реестра можно изменить, чтобы управлять количеством пакетов контроля доступа, необходимыми для запуска быстрой повторной передачи:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

  1. На панели инструментов выберите Запустить>запуск и введите Regedit , чтобы запустить Редактор реестра.
  2. Найдите и выберите указанный выше раздел в Редактор реестра, а затем выберите Изменить в меню Правка.
  3. Введите нужное значение в поле Значение .

Примечание.

Допустимый диапазон — 1–3, значение по умолчанию — 2.

Этот параметр определяет количество повторяющихся AK, которые должны быть получены для того же порядкового номера отправленных данных до fast retransmit активации повторной отправки сегмента, который был удален при передаче.