Прочитать на английском

Поделиться через


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

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

Исходный номер базы знаний: 224829

Итоги

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

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

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

Важно!

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

Размер окна TCP

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

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

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

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

Примечание

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

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

В предыдущих версиях Windows NT размер окна для подключения Ethernet составил 8 760 байт или шесть сегментов 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 — это параметр, используемый для увеличения максимального размера окна с 655 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:

"Поле окна в 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

Например:

Если размер окна в реестре введен как 269000000 (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 и параметрами масштабирования окон. Метки времени и масштабирование окон включены по умолчанию, но можно управлять битами флагов. Масштабирование окна элементов управления bit 0 . Бит 1 управляет метками времени.

Метки времени

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

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

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

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

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

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

Тип = 8 Длина = 10 Значение TS (Tsval) Ответ TS Echo (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 используется в качестве расширения к номеру последовательности. Пакеты имеют текущие и прогрессивные метки времени. Старый пакет имеет старую метку времени и удаляется.

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

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

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

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

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

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

Разрешено tcp SACK:

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

Параметр TCP SACK:

Тип = 5 Длина = переменная
1 байт Левый край первого блока на правый край первого блока
...
Левый край блока Nth в правом краю блока Nth

С включенной функцией 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, который прибывает. Когда отправитель начинает получать поток ACL, который подтверждает тот же номер последовательности, возможно, был удален сегмент. Отправитель немедленно перенаправит сегмент, который ожидает получатель, не ожидая истечения срока действия таймера повторной передачи. Эта оптимизация значительно повышает производительность при частом удалении пакетов.

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

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

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

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

Примечание

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

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