Batas penerima ukuran jendela TCP ke 64.512

34

Fakta (harap cantumkan pernyataan palsu):

  1. Saya memiliki koneksi 100 Mbps antara dua situs yang terpisah 80 ms

  2. Ini adalah koneksi panjang dan gemuk yang dapat mengambil manfaat dari ukuran jendela TCP besar mungkin hingga 100 Mbps * 0,08 detik = 1.000.000 byte

  3. Kedua mesin menjalankan Windows Server 2012. "Terima level penyetelan jendela otomatis" adalah normal pada keduanya. "Heuristik penskalaan jendela" dinonaktifkan pada keduanya.

  4. Saya menjalankan "iperf -s" di satu sisi dan "iperf -c" di sisi lain. Transfer terjadi pada 5 Mbps. Saya mendapatkan hasil yang sama dengan pergi ke arah lain.

  5. Kedua belah pihak mengiklankan dukungan untuk jendela geser TCP di SYNs mereka.

  6. Penerima meminta ukuran jendela TCP dari 64.512 byte (0xFC00) selama seluruh proses dengan nilai skala jendela TCP dari "tidak ada pergeseran" (0x000).

  7. Jaringan dapat menangani ukuran jendela yang lebih besar (lihat diagram urutan di bawah ini)

  8. Penerima menjaga jendela lebih kecil dari dukungan jaringan

  9. Koneksi ini terjadi dalam IPSEC VPN. MTU antarmuka terowongan dikurangi menjadi 1400 byte di kedua arah.

Pertanyaan

  • Mengapa penerima menjaga jendela kecil?

Non-Jawaban

  • Jaringan rusak

    Mesin Linux yang berjalan di jaringan yang sama membuka jendela TCP hingga 1,5 megabyte dan mengirimkan data pada 6 kali bandwidth

  • Heuristik penskalaan jendela diaktifkan

    Heuristik penskalaan jendela dinonaktifkan (lihat output "netsh interface tcp show heuristics" di bawah)

  • Level Penalaan Otomatis Jendela Terima tidak normal

    Terima Level Tuning Otomatis Jendela adalah normal (lihat output "netsh interface tcp show global" di bawah)

  • Ini tidak berfungsi dengan baik pada mesin virtual dalam ESXi

    Saya mendapatkan kinerja 6 kali lebih baik pada mesin linux virtual yang berjalan di host yang sama.


Pembaruan 1 Juni 12, 2015 4:30 pm PDT

Saya memodifikasi tes dengan meletakkan linux di satu sisi koneksi. Benar saja, ketika linux mengirim data ke Windows Server 2012, Windows menawarkan jendela penerimaan TCP yang terlalu kecil (64.512 byte).

Ketika saya mengirim data dari Windows ke linux, linux menawarkan jendela penerimaan TCP yang cukup besar (1,365.120 byte). Namun, Windows membatasi pengiriman hingga maksimal ~ 60.000 byte dalam penerbangan.


Pembaruan 2 13 Juni 2015 3:00 sore PDT

Selangkah lebih dekat ke akar permasalahan. Dalam pengaturan saya, baik SO_SNDBUF maupun SO_RCVBUF tidak diatur (oleh iperf). Ini adalah buffer kirim dan terima yang secara efektif mengikat jendela penerimaan. Ketika tidak menentukan nilai-nilai ini, Windows Server 2012 memberikan nilai default 64 kB. Jadi pertanyaannya sekarang:

Pertanyaan

  • Ketika seseorang tidak ditentukan, mengapa Windows Server 2012 tidak secara dinamis meningkatkan SO_SNDBUF / SO_RCVBUF untuk mengakomodasi pipa panjang seperti yang dijelaskan di MSDN ?

Tanpa jawaban

  • "netsh winsock show autotuning" dinonaktifkan

    Itu diaktifkan.


Pembaruan 3 Agustus 24, 2015 4:00 pm PDT

netsh rupanya telah diganti dengan Set-NetTCPSetting dan keluarga. Get-NetTCPSetting dikombinasikan dengan Get-NetTCPConnection menunjukkan saya beroperasi di rezim 'Internet' yang menawarkan saya pengaturan ini:

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

Mengirim Pengaturan 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

Kirim 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

Perspektif pengirim grafik urutan masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Pengaturan TCP Receiver

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 penerima

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]

Perspektif penerima grafik urutan masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Jendela TCP masukkan deskripsi gambar di sini

Chris Stankevitz
sumber
1
Bisakah Anda menambahkan konfigurasi yang tepat - lunak DAN perangkat keras yang relevan (kartu jaringan) untuk kedua sisi?
TomTom
1
Kedengarannya seperti penyetelan jendela dibatasi .
David Schwartz
@ TomTom Kedua mesin adalah VM di dalam ESXi yang berjalan pada HP Proliant DL380 G5. Adaptor ethernet virtual adalah Intel 82574L. Adaptor ethernet perangkat keras adalah BCM5719.
Chris Stankevitz
@ David Schwartz "menerima level penyetelan otomatis jendela" adalah normal pada keduanya dan "heuristik penskalaan jendela" dinonaktifkan (lihat konfigurasi yang diperbarui di OP). Saya percaya ini menunjukkan bahwa penyetelan tidak dibatasi .
Chris Stankevitz
2
Saya tidak berpikir pertanyaan ini akan didasarkan pada pendapat, saya pikir masalah sebenarnya dengan itu bahwa membuat jawaban yang baik akan memerlukan debugging sistem / jaringan OP, yang dapat dilakukan hanya olehnya, dan bukan oleh kami .
peterh mengatakan mengembalikan Monica

Jawaban:

1

Saya telah melihat ini sebagai masalah khusus pengemudi; dalam kasus saya dengan pengontrol jaringan QLogic yang mencoba menggunakan TCPChimney. Tautan ini menjelaskan fungsionalitas TCPChimney yang ditambahkan di Windows 2008 - tapi saya cukup yakin itu masih berlaku: https://support.microsoft.com/en-us/kb/951037

Saya akan merekomendasikan pengujian berikut ini, dalam rangka; setelah setiap tes, reboot dan lihat apakah penerima mulai meningkatkan TCP RWIN seperti yang diharapkan.

1) Muat versi terbaru driver untuk adapter jaringan pada komputer penerima. 1) Nonaktifkan TCPChimney di komputer penerima 2) Nonaktifkan semua pembongkaran 'Terima TCP'. Ini akan ditemukan di pengaturan Advanced Properties Network Adapter (area yang sama di mana Speed ​​& Duplex akan diatur) 3) Nonaktifkan semua offloading 'TCP Send' (juga di properti Advanced Network Adapter)

(Dan bertentangan dengan komentar "Dan ukuran jendela TCP besar di atas 65k buruk untuk server, karena permintaan memori untuk koneksi meningkat. 65k saja mungkin juga tidak membuat Anda cukup bahagia. - user303507 6 Agustus 15 'pukul 11:30", TCP Receive Windows besar TIDAK secara inheren buruk untuk server. Dalam kasus bandwidth tinggi, tautan latensi tinggi (seperti relai satelit), nilai RWIN besar diperlukan agar kami memiliki lebih banyak data TCP "di dalam pipa". Bayangkan sebuah Sambungan 600 Mbps dengan latensi 3000 ms; tautan bandwidth tinggi akan dibatasi hingga sekitar 20 KBps; karena hanya 65 KB data TCP yang belum diakses bisa "di dalam pipa" pada suatu waktu.)

Jason Walker
sumber
0

Sepertinya bug autotuning Windows bagi saya, mungkin ada hubungannya dengan ini? https://support.microsoft.com/en-us/kb/932170

Sudahkah Anda mencoba meminta nilai SO_RCVBUF yang lebih besar secara manual menggunakan WskControlSocket?

Phil McKerracher
sumber
Secara teknis, buffer tersebut tidak memiliki hubungan dengan ukuran TCP Window: stackoverflow.com/questions/14381303/increasing-tcp-window-size
Mary
Phil: Saya menjalankan Windows Server 2012 di kedua sisi sehingga tautan itu tidak berlaku, tapi saya curiga ada bug. Saya dapat meminta SO_RCVBUF yang lebih besar - dan itu membantu - tetapi itu tidak membantu saya memahami apa yang rusak (lihat "Perbarui 2").
Chris Stankevitz
Mary: buffer secara tidak langsung terkait dengan ukuran windows. Tumpukan jaringan akan mengenali buffer kecil dan akibatnya tidak menambah ukuran jendela. Saya jelaskan ini menggunakan handwaving di "Perbarui 2".
Chris Stankevitz
0

Gunakan pengoptimal jaringan seperti Cisco WAAS atau Riverbed. Mereka melakukan acks lokal dengan cepat, jadi Anda tidak perlu peduli dengan pengaturan server. Dalam jaringan yang lebih besar Anda tidak memiliki pengaruh pada pengaturan server karena ini adalah tim lain atau ini adalah outsourcing.

pengguna303507
sumber
Dan ukuran jendela TCP besar di atas 65k buruk untuk server, karena permintaan memori untuk koneksi meningkat. 65k saja mungkin juga tidak membuat Anda cukup bahagia.
user303507
user303507: Saya ingin memahami apa yang terjadi dengan tumpukan jaringan Windows Server 2012. Saya tidak tertarik menutupi masalah dengan alat jaringan. Tetapi saya setuju bahwa membeli alat jaringan atau memindahkan kantor saya lebih dekat bersama akan mengatasi masalah ini.
Chris Stankevitz
komentar user303507 mungkin ada di jalur yang benar - saya bertanya-tanya apakah masalah memori menyebabkan windows membatasi ukuran jendela berdasarkan beberapa pengaturan heuristik atau registri yang tidak terlihat. Bukan berarti itu perilaku yang sesuai, dengan anggapan Anda benar tentang dokumentasinya.
Dan Pritts
0

Berikut adalah beberapa informasi yang saya temukan yang mungkin menjadi jawaban yang Anda cari. Perhatikan menyebutkan batas 64kb pada mode dinonaktifkan mungkin merupakan petunjuk untuk batas serupa pada mode normal yang tidak didokumentasikan.

Coba aktifkan mode "eksperimental" untuk level Tuning Otomatis astronomi.

Saat mengatur level Penalaan Otomatis Windows pengaturan yang dimungkinkan adalah sebagai berikut:

  • normal: nilai default, memungkinkan jendela terima tumbuh untuk mengakomodasi sebagian besar kondisi
  • dinonaktifkan: menggunakan nilai tetap untuk jendela penerimaan tcp. Membatasinya hingga 64KB (terbatas pada 65535).
  • highlyrestricted: memungkinkan jendela terima untuk tumbuh melampaui nilai standarnya, sangat konservatif
  • dibatasi: pertumbuhan tcp menerima jendela yang agak terbatas melampaui nilai standarnya
  • eksperimental: memungkinkan jendela terima tumbuh untuk mengakomodasi skenario ekstrem (tidak disarankan, ini dapat menurunkan kinerja dalam skenario umum, hanya ditujukan untuk tujuan penelitian. Ini memungkinkan nilai RWIN lebih dari 16 MB)
Sebuah daratan
sumber
Itu masuk akal tetapi OP menunjukkan bahwa ia mencapai batas 64k, bahkan pada 1024.
Jim B