SIO_SET_COMPATIBILITY_MODE-Steuerungscode

Beschreibung

Der SIO_SET_COMPATIBILITY_MODE-Steuerungscode fordert an, wie der Netzwerkstapel bestimmte Verhaltensweisen behandeln soll, für die sich die Standardbehandlung des Verhaltens von Windows-Versionen unterscheiden kann.

Um diesen Vorgang auszuführen, rufen Sie die Funktion WSAIoctl oder WSPIoctl mit den folgenden Parametern auf.

int WSAIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_SET_COMPATIBILITY_MODE, // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to WSA_COMPATIBILITY_MODE struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);
int WSPIoctl(
  (socket) s,             // descriptor identifying a socket
  SIO_SET_COMPATIBILITY_MODE, // dwIoControlCode
  (LPVOID) lpvInBuffer,    // pointer to WSA_COMPATIBILITY_MODE struct
  (DWORD) cbInBuffer,      // length of input buffer
  NULL,         // output buffer
  0,       // size of output buffer
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped,   // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
  (LPWSATHREADID) lpThreadId,   // a WSATHREADID structure
  (LPINT) lpErrno   // a pointer to the error code.
);

Parameter

s

Ein Deskriptor, der einen Socket identifiziert.

dwIoControlCode

Der Steuerelementcode für den Vorgang. Verwenden Sie für diesen Vorgang SIO_SET_COMPATIBILITY_MODE .

lpvInBuffer

Ein Zeiger auf den Eingabepuffer. Dieser Parameter sollte auf eine WSA_COMPATIBILITY_MODE-Struktur verweisen.

cbInBuffer

Die Größe des Eingabepuffers in Bytes. Dieser Parameter sollte größer oder gleich der Größe der WSA_COMPATIBILITY_MODE Struktur entsprechen, auf die der lpvInBuffer-Parameter verweist.

lpvOutBuffer

Ein Zeiger auf den Ausgabepuffer. Dieser Parameter wird für diesen Vorgang nicht verwendet.

cbOutBuffer

Die Größe des Ausgabepuffers in Bytes. Dieser Parameter muss auf 0 festgelegt werden.

lpcbBytesReturned

Ein Zeiger auf eine Variable, die die Größe der im Ausgabepuffer gespeicherten Daten in Bytes empfängt. Dieser zurückgegebene Parameter zeigt für diesen Vorgang auf den DWORD-Wert 0 (null), da keine Ausgabe vorhanden ist.

lpvOverlapped

Ein Zeiger auf eine WSAOVERLAPPED-Struktur .

Wenn Socket s ohne das überlappende Attribut erstellt wurde, wird der lpOverlapped-Parameter ignoriert.

Wenn s mit dem überlappenden Attribut geöffnet wurde und der lpOverlapped-Parameter nicht NULL ist, wird der Vorgang als überlappender (asynchroner) Vorgang ausgeführt. In diesem Fall muss der lpOverlapped-Parameter auf eine gültige WSAOVERLAPPED-Struktur verweisen.

Bei überlappenden Vorgängen wird die WSAIoctl - oder WSPIoctl-Funktion sofort zurückgegeben, und die entsprechende Abschlussmethode wird nach Abschluss des Vorgangs signalisiert. Andernfalls wird die Funktion erst zurückgegeben, wenn der Vorgang abgeschlossen wurde oder ein Fehler auftritt.

lpCompletionRoutine

Typ: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

Ein Zeiger auf die Abschlussroutine, die aufgerufen wird, wenn der Vorgang abgeschlossen wurde (bei nicht überlappenden Sockets ignoriert).

lpThreadId

Ein Zeiger auf eine WSATHREADID-Struktur , die vom Anbieter in einem nachfolgenden Aufruf von WPUQueueApc verwendet werden soll. Der Anbieter sollte die referenzierte WSATHREADID-Struktur (nicht den Zeiger auf dieselbe) speichern, bis die WPUQueueApc-Funktion zurückgegeben wird.

Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .

lpErrno

Ein Zeiger auf den Fehlercode.

Hinweis Dieser Parameter gilt nur für die WSPIoctl-Funktion .

Rückgabewert

Wenn der Vorgang erfolgreich abgeschlossen wird, gibt die WSAIoctl - oder WSPIoctl-Funktion null zurück.

Wenn der Vorgang fehlschlägt oder aussteht, gibt die WSAIoctl - oder WSPIoctl-FunktionSOCKET_ERROR zurück. Rufen Sie WSAGetLastError auf, um erweiterte Fehlerinformationen zu erhalten.

Fehlercode Bedeutung
WSA_IO_PENDING Ein überlappender Vorgang wurde erfolgreich initiiert, und der Abschluss wird zu einem späteren Zeitpunkt angezeigt.
WSA_OPERATION_ABORTED Ein überlappender Vorgang wurde aufgrund des Schließens des Sockets oder der Ausführung des SIO_FLUSH IOCTL-Befehls abgebrochen.
WSAEFAULT Der LpOverlapped- oder lpCompletionRoutine-Parameter ist nicht vollständig in einem gültigen Teil des Benutzeradressraums enthalten.
WSAEINPROGRESS Die Funktion wird aufgerufen, wenn ein Rückruf ausgeführt wird.
WSAEINTR Ein blockierende Vorgang wurde unterbrochen.
WSAEINVAL Der dwIoControlCode-Parameter ist kein gültiger Befehl, oder ein angegebener Eingabeparameter ist nicht akzeptabel, oder der Befehl gilt nicht für den angegebenen Sockettyp. Dieser Fehler wird zurückgegeben, wenn der cbInBuffer-Parameter kleiner als die Größe der WSA_COMPATIBILITY_MODE-Struktur ist.
WSAENETDOWN Fehler beim Netzwerksubsystem.
WSAENOPROTOOPT Die Socketoption wird im angegebenen Protokoll nicht unterstützt.
WSAENOTCONN Der Socket s ist nicht verbunden.
WSAENOTSOCK Der Deskriptor s ist kein Socket.
WSAEOPNOTSUPP Der angegebene IOCTL-Befehl wird nicht unterstützt. Dieser Fehler wird zurückgegeben, wenn die SIO_SET_COMPATIBILITY_MODE IOCTL vom Transportanbieter nicht unterstützt wird. Dieser Fehler wird auch zurückgegeben, wenn versucht wird, die SIO_SET_COMPATIBILITY_MODE IOCTL für einen Datagrammsocket zu verwenden.

Bemerkungen

die SIO_SET_COMPATIBILITY_MODE IOCTL fordert an, wie der Netzwerkstapel bestimmte Verhaltensweisen behandeln soll, für die sich die Standardbehandlung des Verhaltens von Windows-Versionen unterscheiden kann. Die Eingabeargumentstruktur für SIO_SET_COMPATIBILITY_MODE wird in der WSA_COMPATIBILITY_MODE-Struktur angegeben, die in der Mswsockdef.h-Headerdatei definiert ist. Im cbInBuffer-Parameter wird ein Zeiger auf die WSA_COMPATIBILITY_MODE-Struktur übergeben. Diese Struktur ist wie folgt definiert:

// Need to #include <mswsock.h>

/* Argument structure for SIO_SET_COMPATIBILITY_MODE */
typedef struct _WSA_COMPATIBILITY_MODE {
    WSA_COMPATIBILITY_BEHAVIOR_ID BehaviorId;
    ULONG TargetOsVersion;
} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;

Der im BehaviorId-Member angegebene Wert gibt das angeforderte Verhalten an. Der im TargetOsVersion-Member angegebene Wert gibt die Windows-Version an, die für das Verhalten angefordert wird.

Der BehaviorId-Member kann einer der Werte aus dem WSA_COMPATIBILITY_BEHAVIOR_ID Enumerationstyp sein, der in der Mswsockdef.h-Headerdatei definiert ist. Die möglichen Werte für das BehaviorId-Element sind wie folgt:

Begriff Beschreibung
WsaBehaviorAll Dies entspricht dem Anfordern aller möglichen kompatiblen Verhaltensweisen, die für WSA_COMPATIBILITY_BEHAVIOR_ID definiert sind.
WsaBehaviorReceiveBuffering Wenn das TargetOsVersion-Element auf einen Wert für Windows Vista oder höher festgelegt ist, sind Reduzierungen der TCP-Empfangspuffergröße für diesen Socket mithilfe der Socketoption SO_RCVBUF möglich, auch nachdem eine TCP-Verbindung hergestellt wurde. Wenn das TargetOsVersion-Element auf einen Wert vor Windows Vista festgelegt ist, sind Reduzierungen der TCP-Empfangspuffergröße in diesem Socket mithilfe der Socketoption SO_RCVBUF nach verbindungsaufbau nicht zulässig.
WsaBehaviorAutoTuning Wenn das TargetOsVersion-Element auf einen Wert für Windows Vista oder höher festgelegt ist, wird die automatische Optimierung des Empfangsfensters aktiviert, und der TCP-Fensterskalierungsfaktor wird vom Standardwert 8 auf 2 reduziert. Wenn TargetOsVersion auf einen Wert vor Windows Vista festgelegt ist, ist die automatische Optimierung des Empfangsfensters deaktiviert. Die TCP-Fensterskalierungsoption ist ebenfalls deaktiviert, und die maximale Größe des Empfangsfensters ist auf 65.535 Bytes beschränkt. Die TCP-Fensterskalierungsoption kann nicht für die Verbindung ausgehandelt werden, auch wenn die SO_RCVBUF Socketoption für diesen Socket aufgerufen wurde, wobei ein Wert größer als 65.535 Byte angegeben wurde, bevor die Verbindung hergestellt wurde.

Das TargetOsVersion-Element kann eine der NTDDI-Versionskonstanten sein, die in der Sdkddkver.h-Headerdatei definiert sind. Einige der möglichen Werte für das TargetOsVersion-Element sind wie folgt:

Begriff Beschreibung
NTDDI_LONGHORN Das Zielverhalten ist die Standardeinstellung für Windows Vista.
NTDDI_WS03 Das Zielverhalten ist die Standardeinstellung für Windows Server 2003.
NTDDI_WINXP Das Zielverhalten ist die Standardeinstellung für Windows XP.
NTDDI_WIN2K Das Zielverhalten ist die Standardeinstellung für Windows 2000.

Die primäre Auswirkung des TargetOsVersion-Members besteht darin, ob dieses Element auf einen Wert festgelegt ist, der gleich oder größer als NTDDI_LONGHORN ist.

Die TCP-Leistung hängt nicht nur von der Übertragungsrate selbst ab, sondern vom Produkt der Übertragungsrate und der Roundtripverzögerungszeit. Dieses Produkt zur Bandbreitenverzögerung misst die Datenmenge, die "die Pipeline füllen" würde. Dieses Produkt zur Bandbreitenverzögerung ist der Pufferspeicher, der beim Absender und Empfänger erforderlich ist, um den maximalen Durchsatz für die TCP-Verbindung über den Pfad zu erhalten. Dieser Pufferspeicherplatz stellt die Menge nicht bestätigter Daten dar, die TCP verarbeiten muss, um die Pipeline voll zu halten. TCP-Leistungsprobleme treten auf, wenn das Bandbreitenverzögerungsprodukt groß ist. Ein Netzwerkpfad, der unter diesen Bedingungen ausgeführt wird, wird häufig als "long, fat pipe" bezeichnet. Beispiele hierfür sind Satellitenverbindungen mit hoher Kapazität, Drahtlose Hochgeschwindigkeitsverbindungen und terrestrische glasfaseroptische Verbindungen über große Entfernungen.

Der TCP-Header verwendet ein 16-Bit-Datenfeld (das Fensterfeld im TCP-Paketheader), um die Größe des Empfangsfensters an den Absender zu melden. Daher ist das größte Fenster, das verwendet werden kann, 65.535 Bytes. Um diese Einschränkung zu umgehen, wurde eine TCP-Erweiterungsoption , TCP-Fensterskala, für hochleistungsfähiges TCP hinzugefügt, um Fenster mit einer Größe von mehr als 65.535 Bytes zuzulassen. Die TCP-Fensterskalierungsoption (WSopt) ist in RFC 1323 definiert, die auf der IETF-Website verfügbar ist. Die WSopt-Erweiterung erweitert die Definition des TCP-Fensters auf 32 Bits mithilfe eines logarithmischen Skalierungsfaktors von 1 Byte, um das 16-Bit-Fensterfeld im TCP-Header zu erweitern. Die WSopt-Erweiterung definiert einen impliziten Skalierungsfaktor (2 bis zu einer gewissen Leistung), der verwendet wird, um den Wert der Fenstergröße in einem TCP-Header zu multiplizieren, um die tatsächliche Fenstergröße zu erhalten. Ein Fensterskalierungsfaktor von 8 würde also zu einer echten Fenstergröße führen, die dem Wert im Fensterfeld im TCP-Header multipliziert mit 2^8 oder 256 entspricht. Wenn also das Fensterfeld im TCP-Header auf den maximalen Wert von 65.535 Bytes festgelegt und der WSopt-Skalierungsfaktor auf einen Wert von 8 ausgehandelt wurde, beträgt die tatsächliche Fenstergröße 16.776.960 Bytes.

Die tatsächliche Empfangsfenstergröße und damit der Skalierungsfaktor wird durch den maximalen Empfangspufferraum bestimmt. Dieser maximale Pufferspeicher ist die Datenmenge, die ein TCP-Empfänger einem TCP-Absender senden kann, bevor er auf eine Bestätigung warten muss. Nachdem die Verbindung hergestellt wurde, wird die Empfangsfenstergröße in jedem TCP-Segment angekündigt (das Fensterfeld im TCP-Header). Das Anzeigen der maximalen Datenmenge, die der Absender senden kann, ist ein empfängerseitiger Flusssteuerungsmechanismus, der verhindert, dass der Absender Daten sendet, die der Empfänger nicht speichern kann. Ein sendende Host kann nur die maximale Datenmenge senden, die vom Empfänger angekündigt wird, bevor er auf eine Bestätigung und eine Aktualisierung der Empfangsfenstergröße wartet.

Unter Windows Server 2003 und Windows XP hat der maximale Empfangspufferspeicherplatz, der die Empfangsfenstergröße für den TCP/IP-Stapel darstellt, einen Standardwert, der auf der Linkgeschwindigkeit der sendenden Schnittstelle basiert. Der tatsächliche Wert wird automatisch an gleichmäßige Inkremente der maximalen Segmentgröße (MSS) angepasst, die während der TCP-Verbindungsherstellung ausgehandelt wurde. Bei einem Link mit 10 Mbit/s wird die Standardgröße des Empfangsfensters normalerweise auf 16.000 Bytes festgelegt, während bei einem Link mit 100 MBit/s die Standardgröße des Empfangsfensters auf 65.535 Bytes festgelegt wird.

Unter Windows Server 2003 und Windows XP kann die maximale Empfangsfenstergröße für den TCP/IP-Stapel manuell mithilfe der folgenden Registrierungswerte auf einer bestimmten Schnittstelle oder für das gesamte System konfiguriert werden:

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\TCPWindowSize

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Interface\TCPWindowSize

Der Registrierungswert für TCPWindowSize kann auf maximal 65.535 Bytes festgelegt werden, wenn die WSopt-Erweiterung nicht verwendet wird, oder auf maximal 1.073.741.823 Bytes, wenn die WSopt-Erweiterung verwendet wird (ein maximaler Skalierungsfaktor von 4 wird unterstützt). Ohne Fensterskalierung kann eine Anwendung nur einen Durchsatz von ungefähr 5 Megabit pro Sekunde (MBit/s) auf einem Pfad mit einer Roundtripzeit von 100 Millisekunden (RTT) erzielen, unabhängig von der Pfadbandbreite. Dieser Durchsatz kann mit einer Fensterskalierung auf mehr als ein Gigabit pro Sekunde (GBit/s) skaliert werden, sodass TCP den Skalierungsfaktor für die Fenstergröße während der Verbindungsherstellung aushandeln kann.

Unter Windows Server 2003 und Windows XP kann die WSopt-Erweiterung durch Festlegen des folgenden Registrierungswerts aktiviert werden.

HKEY_LOCAL_MACHINE\SYSTEM\Current Control Set\Services\Tcpip\Parameters\Tcp1323Opts

Der Tcp1323Opts-Registrierungswert ist ein DWORD-codiert , sodass die TCP-WSopt-Erweiterung aktiviert ist, wenn Bit 0 festgelegt ist. Wenn Bit 1 festgelegt ist, wird die in RFC 1323 definierte TCP-Zeitstempeloption (TSopt) aktiviert. Ein Wert von 1 oder 3 aktiviert also die WSopt-Erweiterung.

Unter Windows Server 2003 und Windows XP ist die Standardeinstellung, dass die Registrierungswerte TCPWindowSize und Tcp1323Opts nicht erstellt werden. Daher ist die Standardeinstellung, dass die WSopt-Erweiterung deaktiviert ist und die TCP-Empfangsfenstergröße vom System auf den maximalen Wert von bis zu 65.535 Bytes basierend auf der Verbindungsgeschwindigkeit festgelegt wird. Wenn die Fensterskalierung unter Windows Server 2003 und Windows XP durch Festlegen des Tcp1323Opts-Registrierungswerts aktiviert ist, wird die Fensterskalierung für eine TCP-Verbindung weiterhin nur verwendet, wenn sowohl der Absender als auch der Empfänger eine TCP-Fensterskalierungsoption im SYN-Segment (Synchronize) enthalten, das aneinander gesendet wird, um einen Fensterskalierungsfaktor auszuhandeln. Wenn die Fensterskalierung für eine Verbindung verwendet wird, wird das Fensterfeld im TCP-Header auf 65.535 Byte festgelegt, und der Fensterskalierungsfaktor wird verwendet, um die tatsächliche Empfangsfenstergröße durch den Beim Herstellen der Verbindung ausgehandelten Fensterskalierungsfaktor nach oben anzupassen.

Eine Anwendung kann die TCP-Empfangsfenstergröße für eine Verbindung mithilfe der Socketoption SO_RCVBUF angeben. Die TCP-Empfangsfenstergröße für einen Socket kann jederzeit mithilfe von SO_RCVBUF erhöht werden, aber sie kann nur vor dem Herstellen einer Verbindung verringert werden. Um die Fensterskalierung verwenden zu können, muss eine Anwendung eine Fenstergröße von mehr als 65.535 Byte angeben, wenn die Socketoption SO_RCVBUF verwendet wird, bevor die Verbindung hergestellt wird.

Der ideale Wert für die TCP-Empfangsfenstergröße ist häufig schwer zu bestimmen. Um die Kapazität des Netzwerks zwischen Sender und Empfänger zu füllen, sollte die Größe des Empfangsfensters auf das Produkt für Bandbreitenverzögerung für die Verbindung festgelegt werden, d. h. die Bandbreite multipliziert mit der Roundtripzeit. Selbst wenn eine Anwendung das Bandbreitenverzögerungsprodukt korrekt ermitteln kann, ist immer noch nicht bekannt, wie schnell die empfangende Anwendung Daten aus dem eingehenden Datenpuffer (die Abrufrate der Anwendung) abruft. Trotz der Unterstützung für die TCP-Fensterskalierung kann die maximale Empfangsfenstergröße in Windows Server 2003 und Windows XP den Durchsatz weiterhin einschränken, da es sich um eine feste maximale Größe für alle TCP-Verbindungen handelt (sofern nicht pro Anwendung mit SO_RCVBUF angegeben), was den Durchsatz für einige Verbindungen verbessern und den Durchsatz für andere verringern kann. Darüber hinaus variiert die feste maximale Empfangsfenstergröße für eine TCP-Verbindung nicht mit den sich ändernden Netzwerkbedingungen.

Um das Problem der korrekten Bestimmung des Werts der maximalen Empfangsfenstergröße für eine TCP-Verbindung basierend auf den aktuellen Bedingungen des Netzwerks zu beheben, unterstützt der TCP/IP-Stapel in Windows Vista ein Feature zur automatischen Optimierung des Empfangsfensters. Wenn dieses Feature aktiviert ist, bestimmt die automatische Optimierung des Empfangsfensters kontinuierlich die optimale Größe des Empfangsfensters, indem das Produkt zur Bandbreitenverzögerung und die Abrufrate der Anwendung gemessen wird, und passt die tatsächliche maximale Empfangsfenstergröße basierend auf sich ändernden Netzwerkbedingungen an. Die automatische Optimierung des Empfangsfensters aktiviert standardmäßig die TCP-WSopt-Erweiterung, sodass bis zu 16.776.960 Bytes für die tatsächliche Fenstergröße zugelassen werden. Während die Daten über die Verbindung fließen, überwacht der TCP/IP-Stapel die Verbindung, misst das aktuelle Bandbreitenverzögerungsprodukt für die Verbindung und die Empfangsrate der Anwendung und passt die tatsächliche Empfangsfenstergröße an, um den Durchsatz zu optimieren. Der TCP/IP-Stapel ändert den Wert des Fensterfelds im TCP-Header basierend auf den Netzwerkbedingungen, da der WSopt-Skalierungsfaktor beim ersten Herstellen der Verbindung festgelegt wird.

Der TCP/IP-Stapel in Windows Vista verwendet die TCPWindowSize-Registrierungswerte nicht mehr. Mit einem besseren Durchsatz zwischen TCP-Peers erhöht sich die Auslastung der Netzwerkbandbreite während der Datenübertragung. Wenn alle Anwendungen für den Empfang von TCP-Daten optimiert sind, kann sich die Gesamtauslastung des Netzwerks erheblich erhöhen, wodurch die Verwendung von Quality of Service (QoS) in Netzwerken, die mit oder in der Nähe von Kapazität betrieben werden, wichtiger wird.

Das Standardverhalten unter Windows Vista für die Empfangspufferung, wenn SIO_SET_COMPATIBILITY_MODE nicht mithilfe von WsaBehaviorReceiveBuffering angegeben wird, besteht darin, dass nach dem Herstellen einer Verbindung keine Größenreduzierungen des Empfangsfensters mit SO_RCVBUF Socketoption zulässig sind.

Das Standardverhalten unter Windows Vista für die automatische Optimierung, wenn SIO_SET_COMPATIBILITY_MODE nicht mithilfe von WsaBehaviorAutoTuning angegeben wird, besteht darin, dass der Stapel die automatische Fensteroptimierung mit einem Fensterskalierungsfaktor von 8 erhält. Wenn eine Anwendung eine gültige Empfangsfenstergröße mit der Option SO_RCVBUF Socket festlegt, verwendet der Stapel die angegebene Größe, und die automatische Optimierung des Fensterempfangs wird deaktiviert. Windows Autotuning kann auch mit dem folgenden Befehl vollständig deaktiviert werden. netsh interface tcp set global autotuninglevel=disabledIn diesem Fall hat die Angabe von WsaBehaviorAutoTuning keine Auswirkungen. Die automatische Einstellung des Fenster empfangens kann auch basierend auf der unter Windows Server 2008 festgelegten Gruppenrichtlinie deaktiviert werden.

Die WsaBehaviorAutoTuning-Option wird unter Windows Vista für einige Internetgatewaygeräte und Firewalls benötigt, die datenflüsse für TCP-Verbindungen, die die WSopt-Erweiterung und einen Windows-Skalierungsfaktor verwenden, nicht ordnungsgemäß unterstützen. Unter Windows Vista handelt ein Empfänger standardmäßig einen Fensterskalierungsfaktor von 8 für eine maximale true Fenstergröße von 16.776.960 Bytes aus. Wenn Daten über eine schnelle Verknüpfung fließen, beginnt Windows zunächst mit einer True-Fenstergröße von 64 Kilobyte, indem das Fensterfeld des TCP-Headers auf 256 festgelegt und der Fensterskalierungsfaktor in den TCP-Optionen auf 8 festgelegt wird (256*2^8=64 KB). Einige Internetgatewaygeräte und Firewalls ignorieren den Fensterskalierungsfaktor und sehen sich nur das angekündigte Fensterfeld im TCP-Header an, der als 256 angegeben ist, und löschen eingehende Pakete für die Verbindung, die mehr als 256 Byte an TCP-Daten enthalten. Zur Unterstützung der TCP-Empfangsfensterskalierung muss ein Gatewaygerät oder eine Firewall den TCP-Handshake überwachen und den ausgehandelten Fensterskalierungsfaktor als Teil der TCP-Verbindungsdaten nachverfolgen. Außerdem ignorieren einige Anwendungen und TCP-Stapelimplementierungen auf anderen Plattformen die TCP-WSopt-Erweiterung und den Fensterskalierungsfaktor. Daher kann der Remotehost, der die Daten sendet, Daten mit der im Fensterfeld des TCP-Headers angekündigten Rate (256 Bytes) senden. Dies kann dazu führen, dass Daten sehr langsam vom Empfänger empfangen werden.

Wenn Sie das BehaviorId-Element auf WsaBehaviorAutoTuning und targetOsVersion auf Windows Vista festlegen, wird der Fensterskalierungsfaktor auf 2 reduziert, sodass das Fensterfeld im TCP-Header zunächst auf 16.384 Byte und der Fensterskalierungsfaktor auf 2 für eine anfängliche True-Fenster-Empfangsgröße von 64.000 Byte festgelegt ist. Das Feature zur automatischen Fensteroptimierung kann dann die Empfangsgröße des wahren Fensters auf bis zu 262.140 Bytes erhöhen, indem das Fensterfeld im TCP-Header auf 65.535 Bytes festgelegt wird. Eine Anwendung sollte die SIO_SET_COMPATIBILITY_MODE IOCTL festlegen, sobald ein Socket erstellt wird, da diese Option nach dem Senden eines SYN nicht sinnvoll ist oder angewendet wird. Das Festlegen dieser Option hat die gleichen Auswirkungen wie der folgende Befehl: netsh interface tcp set global autotuninglevel=highlyrestricted

Beachten Sie, dass die Headerdatei "Mswsockdef.h " automatisch in "Mswsock.h" oder " Netiodef.h" enthalten ist und nicht direkt verwendet werden sollte.

Siehe auch

Socket

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW