Назад | Перейти на главную страницу

Приемник ограничивает размер окна TCP до 64 512

Факты (укажите ложные утверждения):

  1. У меня есть соединение со скоростью 100 Мбит / с между двумя сайтами, расстояние между которыми составляет 80 мс.

  2. Это длинное толстое соединение, которое может выиграть от большого размера окна TCP, возможно, до 100 Мбит / с * 0,08 секунды = 1000000 байтов.

  3. Обе машины работают под управлением Windows Server 2012. «Уровень автоматической настройки окна приема» является нормальным для обоих. «Эвристика масштабирования окна» отключена на обоих.

  4. Я запустил «iperf -s» с одной стороны и «iperf -c» с другой. Передача происходила на скорости 5 Мбит / с. Я получаю тот же результат в другом направлении.

  5. Обе стороны объявили о поддержке скользящих окон TCP в своих SYN.

  6. Получатель запросил размер окна TCP 64 512 байт (0xFC00) в течение всего прогона со значением масштаба окна TCP «без сдвига» (0x000).

  7. Сеть смогла обработать окно большего размера (см. Диаграммы последовательности ниже)

  8. Приемник оставил окно меньше, чем поддерживает сеть

  9. Это соединение происходит в IPSEC VPN. MTU туннельного интерфейса уменьшается до 1400 байтов в обоих направлениях.

Вопрос

Нет ответов


Обновление 1 12 июня 2015 г., 16:30 PDT

Я изменил тест, поместив linux на одну сторону соединения. Конечно, когда Linux отправляет данные в Windows Server 2012, Windows предлагает слишком маленькое окно приема TCP (64 512 байт).

Когда я отправляю данные из Windows в Linux, Linux предлагает достаточно большое окно приема TCP (1365120 байт). Однако Windows ограничивает отправку до 60 000 байт в полете.


Обновление 2 13 июня 2015 г., 15:00 по тихоокеанскому времени

На шаг ближе к первопричине. В моей настройке ни SO_SNDBUF, ни SO_RCVBUF не установлены (iperf). Это буферы отправки и приема, которые эффективно ограничивают окно приема. Если эти значения не указаны, Windows Server 2012 предоставляет значение по умолчанию 64 КБ. Итак, теперь вопрос:

Вопрос

Нет ответов


Обновление 3 24 августа 2015 г., 16:00 по тихоокеанскому времени

По всей видимости, netsh был заменен на Set-NetTCPSetting и его семейство. Get-NetTCPSetting в сочетании с Get-NetTCPConnection показывает, что я работаю в режиме «Интернет», который предлагает мне следующие настройки:

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

Настройки TCP отправителя

PS C:\Users\acs> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : disabled
Direct Cache Access (DCA)           : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : none
ECN Capability                      : enabled
RFC 1323 Timestamps                 : disabled
Initial RTO                         : 3000
Receive Segment Coalescing State    : enabled

PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics         : disabled
Qualifying Destination Threshold  : 3
Profile type unknown              : normal
Profile type public               : normal
Profile type private              : normal
Profile type domain               : normal

PS C:\Users\acs> Get-NetTCPSetting

SettingName                   : Automatic
MinRto(ms)                    : 
InitialCongestionWindow(MSS)  : 
CongestionProvider            : 
CwndRestart                   : 
DelayedAckTimeout(ms)         : 
MemoryPressureProtection      : 
AutoTuningLevelLocal          : 
AutoTuningLevelGroupPolicy    : 
AutoTuningLevelEffective      : 
EcnCapability                 : 
Timestamps                    : 
InitialRto(ms)                : 
ScalingHeuristics             : 
DynamicPortRangeStartPort     : 
DynamicPortRangeNumberOfPorts : 

SettingName                   : Custom
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Compat
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 2
CongestionProvider            : Default
CwndRestart                   : False
DelayedAckTimeout(ms)         : 200
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Datacenter
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

Отправитель SYN

No.     Time           Source                Destination           Protocol Length Delta      Sequence number Acknowledgment number Bytes in flight Calculated window size Info
    814 5.036577000    10.10.0.21            10.11.0.1             TCP      66     0.000000000 0               0                                     64512                  49758→5001 [SYN, ECN, CWR] Seq=0 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1

Frame 814: 66 bytes on wire (528 bits), 66 bytes captured (528 bits) on interface 0
Ethernet II, Src: 00:11:22:33:44:55, Dst: aa:bb:cc:dd:ee:ff
Internet Protocol Version 4, Src: 10.10.0.21 (10.10.0.21), Dst: 10.11.0.1 (10.11.0.1)
Transmission Control Protocol, Src Port: 49758 (49758), Dst Port: 5001 (5001), Seq: 0, Len: 0
    Source Port: 49758 (49758)
    Destination Port: 5001 (5001)
    [Stream index: 73]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 0
    Header Length: 32 bytes
    .... 0000 1100 0010 = Flags: 0x0c2 (SYN, ECN, CWR)
    Window size value: 64512
    [Calculated window size: 64512]
    Checksum: 0x1451 [validation disabled]
    Urgent pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        Maximum segment size: 1460 bytes
        No-Operation (NOP)
        Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
            Length: 3
            Shift count: 0
            [Multiplier: 1]
        No-Operation (NOP)
        No-Operation (NOP)
        TCP SACK Permitted Option: True

Перспектива отправителя графа последовательности

Настройки TCP приемника

PS C:\Users\acs> netsh interface tcp show global
Querying active state...

TCP Global Parameters
----------------------------------------------
Receive-Side Scaling State          : enabled
Chimney Offload State               : disabled
NetDMA State                        : disabled
Direct Cache Access (DCA)           : disabled
Receive Window Auto-Tuning Level    : normal
Add-On Congestion Control Provider  : none
ECN Capability                      : enabled
RFC 1323 Timestamps                 : disabled
Initial RTO                         : 3000
Receive Segment Coalescing State    : enabled

PS C:\Users\acs> netsh interface tcp show heuristics
TCP Window Scaling heuristics Parameters
----------------------------------------------
Window Scaling heuristics         : disabled
Qualifying Destination Threshold  : 3
Profile type unknown              : normal
Profile type public               : normal
Profile type private              : normal
Profile type domain               : normal

PS C:\Users\acs> Get-NetTCPSetting

SettingName                   : Automatic
MinRto(ms)                    : 
InitialCongestionWindow(MSS)  : 
CongestionProvider            : 
CwndRestart                   : 
DelayedAckTimeout(ms)         : 
MemoryPressureProtection      : 
AutoTuningLevelLocal          : 
AutoTuningLevelGroupPolicy    : 
AutoTuningLevelEffective      : 
EcnCapability                 : 
Timestamps                    : 
InitialRto(ms)                : 
ScalingHeuristics             : 
DynamicPortRangeStartPort     : 
DynamicPortRangeNumberOfPorts : 

SettingName                   : Custom
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Compat
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 2
CongestionProvider            : Default
CwndRestart                   : False
DelayedAckTimeout(ms)         : 200
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Datacenter
MinRto(ms)                    : 20
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : DCTCP
CwndRestart                   : True
DelayedAckTimeout(ms)         : 10
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

SettingName                   : Internet
MinRto(ms)                    : 300
InitialCongestionWindow(MSS)  : 4
CongestionProvider            : CTCP
CwndRestart                   : False
DelayedAckTimeout(ms)         : 50
MemoryPressureProtection      : Enabled
AutoTuningLevelLocal          : Normal
AutoTuningLevelGroupPolicy    : NotConfigured
AutoTuningLevelEffective      : Local
EcnCapability                 : Enabled
Timestamps                    : Disabled
InitialRto(ms)                : 3000
ScalingHeuristics             : Disabled
DynamicPortRangeStartPort     : 49152
DynamicPortRangeNumberOfPorts : 16384

Приемник SYN

No.     Time           Source                Destination           Protocol Length Delta      Sequence number Acknowledgment number Bytes in flight Calculated window size Info
    817 5.110501000    10.11.0.1             10.10.0.21            TCP      70     0.073924000 0               1                                     64512                  5001→49758 [SYN, ACK, ECN] Seq=0 Ack=1 Win=64512 Len=0 MSS=1460 WS=1 SACK_PERM=1 [ETHERNET FRAME CHECK SEQUENCE INCORRECT]

Frame 817: 70 bytes on wire (560 bits), 70 bytes captured (560 bits) on interface 0
Ethernet II, Src: aa:bb:cc:dd:ee:ff, Dst: 00:11:22:33:44:55
Internet Protocol Version 4, Src: 10.11.0.1 (10.11.0.1), Dst: 10.10.0.21 (10.10.0.21)
Transmission Control Protocol, Src Port: 5001 (5001), Dst Port: 49758 (49758), Seq: 0, Ack: 1, Len: 0
    Source Port: 5001 (5001)
    Destination Port: 49758 (49758)
    [Stream index: 73]
    [TCP Segment Len: 0]
    Sequence number: 0    (relative sequence number)
    Acknowledgment number: 1    (relative ack number)
    Header Length: 32 bytes
    .... 0000 0101 0010 = Flags: 0x052 (SYN, ACK, ECN)
    Window size value: 64512
    [Calculated window size: 64512]
    Checksum: 0xb5bb [validation disabled]
    Urgent pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        Maximum segment size: 1460 bytes
        No-Operation (NOP)
        Window scale: 0 (multiply by 1)
            Kind: Window Scale (3)
            Length: 3
            Shift count: 0
            [Multiplier: 1]
        No-Operation (NOP)
        No-Operation (NOP)
        TCP SACK Permitted Option: True
    [SEQ/ACK analysis]

Перспектива приемника графа последовательности

Окно TCP

Я видел в этом проблему, связанную с драйвером; в моем случае с сетевыми контроллерами QLogic, которые пытались использовать TCPChimney. Эта ссылка описывает функциональность TCPChimney, добавленную в Windows 2008, но я уверен, что она все еще применима: https://support.microsoft.com/en-us/kb/951037

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

1) Загрузите последние версии драйверов для сетевого адаптера на принимающий компьютер. 1) Отключите TCPChimney на принимающем компьютере 2) Отключите разгрузку всех TCP Receive. Это можно найти в дополнительных настройках свойств сетевого адаптера (та же область, где будут установлены скорость и дуплекс). 3) Отключить всю разгрузку TCP Send (также в дополнительных свойствах сетевого адаптера)

(И вопреки комментарию «И большие размеры окна TCP, превышающие 65 КБ, вредны для серверов, так как тогда возрастает потребность в памяти для соединений. Одни только 65 КБ также могут не сделать вас достаточно счастливым. - user303507 6 августа 2015 г. в 11:30», большие окна приема TCP НЕ по своей сути плохи для сервера. В случае каналов с высокой пропускной способностью и высокой задержкой (например, спутниковые ретрансляторы) необходимы большие значения RWIN, чтобы у нас было больше данных TCP «в конвейере». Представьте себе Соединение со скоростью 600 Мбит / с с задержкой 3000 мс; канал с высокой пропускной способностью будет ограничен примерно до 20 Кбит / с; поскольку только 65 КБ не подтвержденных данных TCP могут находиться «в конвейере» одновременно.)

Мне кажется, что это ошибка автонастройки Windows, возможно, как-то с этим связано? https://support.microsoft.com/en-us/kb/932170

Вы пытались запросить большее значение SO_RCVBUF вручную с помощью WskControlSocket?

Используйте оптимизатор сети, например Cisco WAAS или Riverbed. Они быстро отправляют локальные подтверждения, поэтому вам не нужно беспокоиться о настройках сервера. В большей сети вы в любом случае не можете повлиять на настройку сервера, так как это другие команды или это аутсорсинг.

Вот это немного информации Я обнаружил, что это может быть ответ, который вы ищете. Обратите внимание, что упоминание ограничения в 64 КБ для отключенного режима может указывать на аналогичные ограничения в обычном режиме, которые не задокументированы.

Попробуйте включить «экспериментальный» режим для астрономических уровней автонастройки.

При установке уровня автонастройки Windows возможны следующие настройки:

  • normal: значение по умолчанию, позволяет увеличить окно приема для соответствия большинству условий
  • disabled: использует фиксированное значение для окна приема tcp. Ограничивает его до 64 КБ (ограничено 65535).
  • сильно ограничено: позволяет окну приема увеличиваться за пределы значения по умолчанию, очень консервативно
  • ограничено: несколько ограниченный рост окна приема TCP сверх значения по умолчанию
  • экспериментальный: позволяет увеличить окно приема для адаптации к экстремальным сценариям (не рекомендуется, это может снизить производительность в обычных сценариях, предназначенных только для исследовательских целей. Позволяет использовать значения RWIN более 16 МБ)