Описание функций Windows TCP
В этой статье описаны функции TCP в Windows.
Исходный номер базы знаний: 224829
В этой статье описаны следующие функции TCP в Windows:
- Размер окна TCP
- Теперь поддерживаются параметры TCP
- Масштабирование Windows — RFC 1323
- Метка времени — RFC 1323
- Защита от обтекаемых порядковых номеров (PAWS)
- Выборочные подтверждения (SACKS) — RFC 2018
- Поведение повторной передачи TCP и быстрая повторная передача
Функции TCP можно изменить, изменив записи в реестре.
Важно!
В следующих разделах, методах или задачах содержатся шаги, которые позволяют изменить реестр. Однако при неправильном изменении реестра могут возникнуть серьезные проблемы. Поэтому убедитесь, что вы внимательно выполните следующие действия. Для дополнительной защиты создайте резервную копию реестра перед его изменением. В этом случае реестр можно восстановить, если возникнет проблема. Дополнительные сведения о создании резервной копии и восстановлении реестра см. в соответствующей статье базы знаний Майкрософт:
322756 Создание резервной копии и восстановление реестра Windows
Размер окна получения TCP — это объем данных приема (в байтах), которые можно буферизировать во время подключения. Узел отправки может отправлять только этот объем данных, прежде чем он должен ожидать подтверждения и обновления окна от принимающего узла. Стек TCP/IP Для Windows предназначен для самостоятельной настройки в большинстве сред и использует более крупные размеры окон по умолчанию, чем более ранние версии.
Вместо использования жестко закодированного размера окна получения по умолчанию TCP настраивается даже на увеличение максимального размера сегмента (MSS). MSS согласовывается во время настройки подключения. При настройке окна получения даже приращения MSS увеличивается процент полноразмерных сегментов TCP, используемых во время передачи массовых данных.
Размер окна получения определяется следующим образом:
- Первый запрос на подключение, отправленный удаленному узлу, объявляет размер окна получения размером 16 КБ (16 384 байта).
- При установке подключения размер окна получения округляется до равномерного увеличения MSS.
- Размер окна адаптируется к четырем раза msS, в максимальный размер 64 K, если не используется параметр масштабирования окна (RFC 1323).
Примечание
См. раздел "Масштабирование Windows".
Для подключений Ethernet размер окна обычно будет иметь значение 17 520 байт (16 КБ округляется до двенадцати 1460-байтовых сегментов). Размер окна может уменьшиться при установке подключения к компьютеру, который поддерживает расширенные параметры головки TCP, такие как выборочные подтверждения (SACKS) и метки времени. Эти два параметра увеличивают размер заголовка TCP до более 20 байт, что приводит к меньшему объему места для данных.
В предыдущих версиях Windows NT размер окна для подключения Ethernet составил 8 760 байт или шесть сегментов 1460-байтов.
Чтобы задать размер окна получения определенного значения, добавьте значение TcpWindowSize в подраздел реестра, относящееся к вашей версии Windows. Для этого выполните следующие шаги:
Нажмите кнопку "Запустить>", введите
Regedit
и нажмите кнопку "ОК".Разверните подраздел реестра, характерный для вашей версии Windows:
В Windows 2000 разверните следующий подраздел:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces
Для Windows Server 2003 разверните следующий подраздел:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
В меню "Изменить" наведите указатель мыши на "Создать", а затем выберите значение DWORD.
Введите
TcpWindowSize
поле "Новое значение ", а затем нажмите клавишу ВВОДВыберите "Изменить" в меню "Изменить".
Введите нужный размер окна в поле "Значение".
Примечание
Допустимый диапазон для размера окна составляет 0-0x3FFFC000 шестнадцатеричное значение.
Это значение по умолчанию отсутствует. При добавлении значения TcpWindowSize он переопределяет алгоритм размера окна по умолчанию, описанный выше.
Примечание
TcpWindowSize также можно добавить в ключ параметров, чтобы задать размер окна глобально для всех интерфейсов.
Ранее параметры TCP использовались в первую очередь для согласования максимального размера сегмента. В Windows параметры TCP используются для масштабирования окон, метки времени и выборочного ACK.
Существует два типа параметров TCP:
- Параметр TCP одного октета, который используется для указания определенного типа параметра.
- Несколько вариантов 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
Описание. Используется узлами для определения того, были ли получены пакеты вне порядка.
Для более эффективного использования сетей с высокой пропускной способностью может использоваться более крупный размер окна 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
На панели инструментов нажмите кнопку "Запустить>", а затем введите
Regedit
, чтобы запустить редактор реестра.В редакторе реестра выберите "Изменить", наведите указатель мыши на "Создать", а затем выберите значение DWORD.
В поле "Новое значение" введите
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)
Поле номера последовательности TCP ограничено 32 битами, что ограничивает количество доступных номеров последовательности. При использовании сетей высокой емкости и передачи больших данных можно упаковать порядковые номера перед тем, как пакет проходит по сети. При отправке данных в одну сеть Гига-байта в секунду (Гбит/с) порядковые номера могут быть завернуть не более 34 секунд. Если пакет отложен, другой пакет может существовать с одинаковым порядковым номером. Чтобы избежать путаницы повторяющихся порядковых чисел, метка времени TCP используется в качестве расширения к номеру последовательности. Пакеты имеют текущие и прогрессивные метки времени. Старый пакет имеет старую метку времени и удаляется.
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
- На панели инструментов нажмите кнопку "Запустить>", а затем введите
Regedit
, чтобы запустить редактор реестра. - Найдите и выберите приведенный выше раздел в редакторе реестра, а затем выберите пункт "Изменить" в меню "Изменить".
- Введите требуемое значение в поле данных "Значение".
Примечание
Допустимое двоичное значение равно 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 запускает таймер повторной передачи, когда каждый исходящий сегмент передается протоколу Интернета (IP). Если подтверждение не было получено для данных в заданном сегменте до истечения срока действия таймера, то сегмент перенаправится.
Время ожидания повторной передачи (RTO) настраивается непрерывно, чтобы соответствовать характеристикам подключения с помощью вычислений сглаживания времени кругового пути (SRTT), как описано в RFC 793. Таймер для данного сегмента увеличивается после каждой повторной передачи этого сегмента. С помощью этого алгоритма TCP настраивается на обычную задержку подключения.
TCP повторно отправляет данные до истечения срока действия таймера повторной передачи при определенных обстоятельствах. Наиболее распространенной причиной является функция, известная как быстрая передача. Когда получатель, поддерживающий быструю повторную передачу, получает данные с порядковым номером за пределами текущего ожидаемого, некоторые данные, скорее всего, удалены. Чтобы помочь сообщить отправителю этого события, получатель немедленно отправляет ACK с номером ACK, заданным порядковым номером, который он ожидал. Он будет продолжать делать это для каждого дополнительного сегмента TCP, который прибывает. Когда отправитель начинает получать поток ACL, который подтверждает тот же номер последовательности, возможно, был удален сегмент. Отправитель немедленно перенаправит сегмент, который ожидает получатель, не ожидая истечения срока действия таймера повторной передачи. Эта оптимизация значительно повышает производительность при частом удалении пакетов.
По умолчанию Windows повторно отправляет сегмент в следующих условиях:
- Он получает три AK для одного и того же номера последовательности: один ACK и два дубликата.
- Номер последовательности отстает от текущего.
Это поведение можно контролировать с помощью TcpMaxDupAcks
параметра реестра.
Значение TcpMaxDupAcks в следующем разделе реестра можно изменить, чтобы контролировать количество ключей управления доступом, необходимых для быстрого повторного передачи:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
- На панели инструментов нажмите кнопку "Запустить>", а затем введите
Regedit
, чтобы запустить редактор реестра. - Найдите и выберите приведенный выше раздел в редакторе реестра, а затем выберите пункт "Изменить" в меню "Изменить".
- Введите требуемое значение в поле данных "Значение".
Примечание
Допустимый диапазон равен 1–3, значение по умолчанию — 2.
Этот параметр определяет количество повторяющихся наборов управления доступа, которые должны быть получены для того же номера последовательности отправленных данных, прежде чем fast retransmit
активироваться для повторной отправки сегмента, который был удален во время передачи.