SIO_SET_COMPATIBILITY_MODE 제어 코드

설명

SIO_SET_COMPATIBILITY_MODE 제어 코드는 네트워킹 스택이 Windows 버전에서 동작을 처리하는 기본 방법이 다를 수 있는 특정 동작을 처리하는 방법을 요청합니다.

이 작업을 수행하려면 다음 매개 변수를 사용하여 WSAIoctl 또는 WSPIoctl 함수를 호출합니다.

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.
);

매개 변수

소켓을 식별하는 설명자입니다.

dwIoControlCode

작업을 위한 제어 코드입니다. 이 작업에 는 SIO_SET_COMPATIBILITY_MODE 사용합니다.

lpvInBuffer

입력 버퍼에 대한 포인터입니다. 이 매개 변수는 WSA_COMPATIBILITY_MODE 구조를 가리킵니다.

cbInBuffer

입력 버퍼의 크기(바이트)입니다. 이 매개 변수는 lpvInBuffer 매개 변수가 가리키는 WSA_COMPATIBILITY_MODE 구조체의 크기와 같거나 커야 합니다.

lpvOutBuffer

출력 버퍼에 대한 포인터입니다. 이 매개 변수는 이 작업에 사용되지 않습니다.

cbOutBuffer

출력 버퍼의 크기(바이트)입니다. 이 매개 변수는 0으로 설정해야 합니다.

lpcbBytesReturned

출력 버퍼에 저장된 데이터의 크기(바이트)를 수신하는 변수에 대한 포인터입니다. 이 반환된 매개 변수는 출력이 없으므로 이 작업에 대한 DWORD 값 0을 가리킵니다.

lpvOverlapped

WSAOVERLAPPED 구조체에 대한 포인터입니다.

소켓 겹치는 특성 없이 만들어진 경우 lpOverlapped 매개 변수는 무시됩니다.

겹치는 특성으로 열렸고 lpOverlapped 매개 변수가 NULL이 아닌 경우 작업은 겹치는(비동기) 작업으로 수행됩니다. 이 경우 lpOverlapped 매개 변수는 유효한 WSAOVERLAPPED 구조를 가리킵니다.

겹치는 작업의 경우 WSAIoctl 또는 WSPIoctl 함수는 즉시 반환되고 작업이 완료되면 적절한 완료 메서드가 신호를 보냅니다. 그렇지 않으면 작업이 완료되거나 오류가 발생할 때까지 함수가 반환되지 않습니다.

lpCompletionRoutine

형식: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

작업이 완료되었을 때 호출되는 완료 루틴에 대한 포인터입니다(겹치지 않는 소켓의 경우 무시됨).

lpThreadId

WPUQueueApc에 대한 후속 호출에서 공급자가 사용할 WSATHREADID 구조체에 대한 포인터입니다. 공급자는 WPUQueueApc 함수가 반환될 때까지 참조된 WSATHREADID 구조체(동일한 포인터가 아님)를 저장해야 합니다.

참고 이 매개 변수는 WSPIoctl 함수에 만 적용됩니다.

lpErrno

오류 코드에 대한 포인터입니다.

참고 이 매개 변수는 WSPIoctl 함수에 만 적용됩니다.

반환 값

작업이 성공적으로 완료되면 WSAIoctl 또는 WSPIoctl 함수는 0을 반환합니다.

작업이 실패하거나 보류 중인 경우 WSAIoctl 또는 WSPIoctl 함수는 SOCKET_ERROR 반환합니다. 확장된 오류 정보를 얻으려면 WSAGetLastError를 호출합니다.

오류 코드 의미
WSA_IO_PENDING 겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됩니다.
WSA_OPERATION_ABORTED 소켓의 닫기 또는 SIO_FLUSH IOCTL 명령 실행으로 인해 겹치는 작업이 취소되었습니다.
WSAEFAULT lpOverlapped 또는 lpCompletionRoutine 매개 변수는 사용자 주소 공간의 유효한 부분에 완전히 포함되지 않습니다.
WSAEINPROGRESS 콜백이 진행 중일 때 함수가 호출됩니다.
WSAEINTR 차단 작업이 중단되었습니다.
WSAEINVAL dwIoControlCode 매개 변수가 유효한 명령이 아니거나 지정된 입력 매개 변수를 사용할 수 없거나 지정된 소켓 유형에 명령을 적용할 수 없습니다. cbInBuffer 매개 변수가 WSA_COMPATIBILITY_MODE 구조체의 size보다 작으면 이 오류가 반환됩니다.
WSAENETDOWN 네트워크 하위 시스템이 실패했습니다.
WSAENOPROTOOPT 소켓 옵션은 지정된 프로토콜에서 지원되지 않습니다.
WSAENOTCONN 소켓이 연결되어 있지 않습니다.
WSAENOTSOCK 설명자 소켓이 아닙니다.
WSAEOPNOTSUPP 지정된 IOCTL 명령은 지원되지 않습니다. 이 오류는 SIO_SET_COMPATIBILITY_MODE IOCTL이 전송 공급자에서 지원되지 않는 경우 반환됩니다. 이 오류는 데이터그램 소켓에서 SIO_SET_COMPATIBILITY_MODE IOCTL을 사용하려고 할 때도 반환됩니다.

설명

SIO_SET_COMPATIBILITY_MODE IOCTL은 네트워킹 스택이 Windows 버전마다 동작을 처리하는 기본 방법이 다를 수 있는 특정 동작을 처리하는 방법을 요청합니다. SIO_SET_COMPATIBILITY_MODE 대한 입력 인수 구조는 Mswsockdef.h 헤더 파일에 정의된 WSA_COMPATIBILITY_MODE 구조체에 지정됩니다. WSA_COMPATIBILITY_MODE 구조체에 대한 포인터는 cbInBuffer 매개 변수에 전달됩니다. 이 구조체는 다음과 같이 정의됩니다.

// 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;

BehaviorId 멤버에 지정된 값은 요청된 동작을 나타냅니다. TargetOsVersion 멤버에 지정된 값은 동작에 대해 요청되는 Windows 버전을 나타냅니다.

BehaviorId 멤버는 Mswsockdef.h 헤더 파일에 정의된 WSA_COMPATIBILITY_BEHAVIOR_ID 열거형 형식의 값 중 하나일 수 있습니다. BehaviorId 멤버에 사용할 수 있는 값은 다음과 같습니다.

용어 설명
WsaBehaviorAll 이는 WSA_COMPATIBILITY_BEHAVIOR_ID 대해 정의된 가능한 모든 호환 동작을 요청하는 것과 같습니다.
WsaBehaviorReceiveBuffering TargetOsVersion 멤버를 Windows Vista 이상의 값으로 설정하면 TCP 연결이 설정된 후에도 SO_RCVBUF 소켓 옵션을 사용하여 이 소켓의 TCP 수신 버퍼 크기 축소가 허용됩니다. TargetOsVersion 멤버가 Windows Vista 이전 값으로 설정된 경우 연결 설정 후 SO_RCVBUF 소켓 옵션을 사용하여 이 소켓에서 TCP 수신 버퍼 크기로 축소할 수 없습니다.
WsaBehaviorAutoTuning TargetOsVersion 멤버를 Windows Vista 이상의 값으로 설정하면 수신 창 자동 튜닝이 사용하도록 설정되고 TCP 창 배율 인수가 기본값 8에서 2로 줄어듭니다. TargetOsVersion이 Windows Vista 이전 값으로 설정되면 수신 창 자동 튜닝이 사용하지 않도록 설정됩니다. TCP 창 크기 조정 옵션도 사용하지 않도록 설정되며 최대 실제 수신 창 크기는 65,535바이트로 제한됩니다. 연결이 설정되기 전에 65,535바이트보다 큰 값을 지정하는 이 소켓에서 SO_RCVBUF 소켓 옵션을 호출한 경우에도 연결에서 TCP 창 크기 조정 옵션을 협상할 수 없습니다.

TargetOsVersion 멤버는 Sdkddkver.h 헤더 파일에 정의된 NTDDI 버전 상수 중 하나일 수 있습니다. TargetOsVersion 멤버에 대해 가능한 값 중 일부는 다음과 같습니다.

용어 설명
NTDDI_LONGHORN 대상 동작은 Windows Vista의 기본값입니다.
NTDDI_WS03 대상 동작은 Windows Server 2003의 기본값입니다.
NTDDI_WINXP 대상 동작은 Windows XP의 기본값입니다.
NTDDI_WIN2K 대상 동작은 Windows 2000의 기본값입니다.

TargetOsVersion 멤버의 주요 영향은 이 멤버가 NTDDI_LONGHORN 보다 크거나 같은 값으로 설정되었는지 여부입니다.

TCP 성능은 전송 속도 자체뿐만 아니라 전송 속도 및 왕복 지연 시간의 산물에 따라 달라집니다. 이 대역폭 지연 제품은 "파이프를 채우는" 데이터의 양을 측정합니다. 이 대역폭 지연 제품은 경로를 통해 TCP 연결에서 최대 처리량을 얻기 위해 보낸 사람 및 수신기에 필요한 버퍼 공간입니다. 이 버퍼 공간은 파이프라인을 가득 채우기 위해 TCP가 처리해야 하는 승인되지 않은 데이터의 양을 나타냅니다. 대역폭 지연 제품이 큰 경우 TCP 성능 문제가 발생합니다. 이러한 조건에서 작동하는 네트워크 경로를 종종 "길고 뚱뚱한 파이프"라고 합니다. 예를 들어 대용량 패킷 위성 링크, 고속 무선 링크 및 장거리 지상 광섬유 광학 링크가 있습니다.

TCP 헤더는 16비트 데이터 필드(TCP 패킷 헤더의 창 필드)를 사용하여 수신 창 크기를 보낸 사람에게 보고합니다. 따라서 사용할 수 있는 가장 큰 창은 65,535바이트입니다. 이 제한을 피하기 위해 65,535바이트보다 큰 창을 허용하도록 고성능 TCP에 대해 TCP 확장 옵션인 TCP 창 크기 조정이 추가되었습니다. TCP 창 크기 조정 옵션(WSopt)은 IETF 웹 사이트에서 사용할 수 있는 RFC 1323에 정의되어 있습니다. WSopt 확장은 1 바이트 로그 배율 인수를 사용하여 TCP 창의 정의를 32비트로 확장하여 TCP 헤더의 16비트 창 필드를 확장합니다. WSopt 확장은 TCP 헤더에 있는 창 크기 값을 곱하여 실제 창 크기를 가져오는 데 사용되는 암시적 배율 인수(2~일부 전원)를 정의합니다. 따라서 창 배율 인수가 8이면 TCP 헤더의 창 필드 값과 같은 실제 창 크기가 2^8 또는 256으로 곱됩니다. 따라서 TCP 헤더의 창 필드가 최대값 65,535바이트로 설정되고 WSopt 배율 인수가 8 값으로 협상된 경우 실제 창 크기는 16,776,960바이트입니다.

실제 수신 창 크기이므로 배율 인수는 최대 수신 버퍼 공간에 따라 결정됩니다. 이 최대 버퍼 공간은 TCP 수신기가 승인을 기다리기 전에 TCP 발신자가 보낼 수 있는 데이터의 양입니다. 연결이 설정되면 수신 창 크기가 각 TCP 세그먼트(TCP 헤더의 창 필드)에 보급됩니다. 발신자가 보낼 수 있는 최대 데이터 양을 보급하는 것은 발신자가 저장할 수 없는 데이터를 보내는 것을 방지하는 수신자 쪽 흐름 제어 메커니즘입니다. 송신 호스트는 승인 및 수신 창 크기 업데이트를 기다리기 전에 수신자가 보급한 최대 데이터 양만 보낼 수 있습니다.

Windows Server 2003 및 Windows XP에서 TCP/IP 스택의 수신 창 크기를 나타내는 최대 수신 버퍼 공간은 송신 인터페이스의 링크 속도에 따라 기본값을 가합니다. 실제 값은 TCP 연결 설정 중에 협상된 MSS(최대 세그먼트 크기)의 짝수 증가로 자동으로 조정됩니다. 따라서 10Mbit/초 링크의 경우 기본 수신 창 크기는 일반적으로 16K 바이트로 설정되고 100MBit/초 링크에서는 기본 수신 창 크기가 65,535바이트로 설정됩니다.

Windows Server 2003 및 Windows XP에서 TCP/IP 스택의 실제 최대 수신 창 크기는 특정 인터페이스 또는 전체 시스템에 대해 다음 레지스트리 값을 사용하여 수동으로 구성할 수 있습니다.

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

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

WSopt 확장을 사용하지 않을 경우 TCPWindowSize 의 레지스트리 값을 최대 65,535바이트 또는 WSopt 확장을 사용할 때 최대 1,073,741,823바이트로 설정할 수 있습니다(최대 배율 4가 지원됨). 창 크기 조정이 없으면 애플리케이션은 경로 대역폭에 관계없이 RTT(왕복 시간)가 100밀리초인 경로에서 초당 약 5메가비트(Mbps)의 처리량만 달성할 수 있습니다. 이 처리량은 창 크기 조정을 사용하여 초당 기가비트(Gbps)를 초과하여 확장할 수 있으며, 이를 통해 TCP는 연결 설정 중에 창 크기에 대한 배율 인수를 협상할 수 있습니다.

Windows Server 2003 및 Windows XP에서는 다음 레지스트리 값을 설정하여 WSopt 확장을 사용하도록 설정할 수 있습니다.

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

Tcp1323Opts 레지스트리 값은 DWORD로 인코딩되어 비트 0이 설정되면 TCP WSopt 확장을 사용하도록 설정합니다. 비트 1이 설정되면 RFC 1323에 정의된 TSopt(TCP 타임스탬프 옵션)가 사용하도록 설정됩니다. 따라서 값이 1 또는 3이면 WSopt 확장을 사용할 수 있습니다.

Windows Server 2003 및 Windows XP에서 기본값은 TCPWindowSize 및 Tcp1323Opts 레지스트리 값이 만들어지지 않는다는 것입니다. 따라서 기본값은 WSopt 확장을 사용하지 않도록 설정하고 시스템에서 TCP 수신 창 크기를 링크 속도에 따라 최대 65,535바이트 값으로 설정하는 것입니다. Tcp1323Opts 레지스트리 값을 설정하여 Windows Server 2003 및 Windows XP에서 창 크기 조정을 사용하도록 설정한 경우, 보낸 사람 및 수신기가 서로 전송된 동기화(SYN) 세그먼트에 TCP 창 크기 조정 옵션을 포함하는 경우에만 TCP 연결의 창 크기 조정이 사용됩니다. 연결에서 창 크기 조정을 사용하는 경우 TCP 헤더의 창 필드는 65,535바이트로 설정되고 창 배율 인수는 연결이 설정될 때 협상된 창 배율 인수에 의해 실제 수신 창 크기를 위쪽으로 조정하는 데 사용됩니다.

애플리케이션은 SO_RCVBUF 소켓 옵션을 사용하여 연결에 대한 TCP 수신 창 크기를 지정할 수 있습니다. 소켓에 대한 TCP 수신 창 크기는 SO_RCVBUF 사용하여 언제든지 늘릴 수 있지만 연결을 설정하기 전에만 줄일 수 있습니다. 창 크기 조정을 사용하려면 애플리케이션이 연결이 설정되기 전에 SO_RCVBUF 소켓 옵션을 사용할 때 65,535바이트보다 큰 창 크기를 지정해야 합니다.

TCP 수신 창 크기에 이상적인 값은 종종 결정하기 어렵습니다. 발신자와 수신자 간의 네트워크 용량을 채우려면 수신 창 크기를 연결에 대한 대역폭 지연 제품으로 설정해야 하며, 이는 왕복 시간을 곱한 대역폭입니다. 애플리케이션이 대역폭 지연 제품을 올바르게 확인할 수 있더라도 수신 애플리케이션이 들어오는 데이터 버퍼(애플리케이션 검색 속도)에서 데이터를 얼마나 빨리 검색할지는 아직 알 수 없습니다. TCP 창 크기 조정에 대한 지원에도 불구하고 Windows Server 2003 및 Windows XP의 최대 수신 창 크기는 일부 연결에 대한 처리량을 향상시키고 다른 연결의 처리량을 줄일 수 있는 모든 TCP 연결에 대해 고정된 최대 크기( SO_RCVBUF 사용하는 애플리케이션당 지정되지 않은 경우)이므로 처리량을 제한할 수 있습니다. 또한 TCP 연결에 대한 고정 최대 수신 기간 크기는 네트워크 조건 변경에 따라 달라지지 않습니다.

네트워크의 현재 조건에 따라 TCP 연결의 최대 수신 창 크기 값을 올바르게 결정하는 문제를 해결하기 위해 Windows Vista의 TCP/IP 스택은 수신 창 자동 조정 기능을 지원합니다. 이 기능을 사용하도록 설정하면 수신 창 자동 튜닝은 대역폭 지연 제품 및 애플리케이션 검색 속도를 측정하여 최적의 실제 수신 창 크기를 지속적으로 결정하고 변화하는 네트워크 조건에 따라 실제 최대 수신 기간 크기를 조정합니다. 수신 창 자동 튜닝을 사용하면 기본적으로 TCP WSopt 확장을 사용하도록 설정하여 실제 창 크기에 대해 최대 16,776,960바이트를 허용합니다. 데이터가 연결을 통해 흐르는 동안 TCP/IP 스택은 연결을 모니터링하고, 연결 및 애플리케이션 수신 속도에 대한 현재 대역폭 지연 제품을 측정하고, 처리량을 최적화하도록 실제 수신 창 크기를 조정합니다. 연결이 처음 설정될 때 WSopt 배율 인수가 고정되므로 TCP/IP 스택은 네트워크 조건에 따라 TCP 헤더의 창 필드 값을 변경합니다.

Windows Vista의 TCP/IP 스택은 더 이상 TCPWindowSize 레지스트리 값을 사용하지 않습니다. TCP 피어 간의 처리량이 향상되면 데이터 전송 중에 네트워크 대역폭 사용률이 증가합니다. 모든 애플리케이션이 TCP 데이터를 수신하도록 최적화된 경우 네트워크의 전반적인 사용률이 크게 증가하여 용량 또는 거의 용량에서 작동하는 네트워크에서 QoS(서비스 품질)를 더 중요하게 사용할 수 있습니다.

WsaBehaviorReceiveBuffering을 사용하여 SIO_SET_COMPATIBILITY_MODE 지정하지 않은 경우 수신 버퍼링에 대한 Windows Vista의 기본 동작은 연결이 설정된 후 SO_RCVBUF 소켓 옵션을 사용하는 수신 창 크기 축소가 허용되지 않는다는 것입니다.

WsaBehaviorAutoTuning을 사용하여 SIO_SET_COMPATIBILITY_MODE 지정하지 않은 경우 자동 튜닝에 대한 Windows Vista의 기본 동작은 스택이 창 배율 인수 8을 사용하여 창 자동 튜닝을 수신한다는 것입니다. 애플리케이션이 SO_RCVBUF 소켓 옵션을 사용하여 유효한 수신 창 크기를 설정하는 경우 스택은 지정된 크기를 사용하고 창 수신 자동 조정은 사용하지 않도록 설정됩니다. 다음 명령을 netsh interface tcp set global autotuninglevel=disabled사용하여 Windows 자동 조정을 완전히 사용하지 않도록 설정할 수도 있습니다. 이 경우 WsaBehaviorAutoTuning 을 지정해도 아무런 영향을 주지 않습니다. Windows Server 2008에서 설정된 그룹 정책에 따라 창 수신 자동 조정을 사용하지 않도록 설정할 수도 있습니다.

WsaBehaviorAutoTuning 옵션은 WSopt 확장 및 Windows 배율 인수를 사용하는 TCP 연결에 대한 데이터 흐름을 올바르게 지원하지 않는 일부 인터넷 게이트웨이 디바이스 및 방화벽의 경우 Windows Vista에 필요합니다. Windows Vista에서 수신기는 기본적으로 최대 실제 창 크기가 16,776,960바이트인 8의 창 배율 인수를 협상합니다. 빠른 링크에서 데이터가 흐르기 시작하면 Windows는 처음에 TCP 헤더의 창 필드를 256으로 설정하고 TCP 옵션(256*2^8=64KB)에서 창 배율 인수를 8로 설정하여 64Kb true 창 크기로 시작합니다. 일부 인터넷 게이트웨이 디바이스 및 방화벽은 창 배율 인수를 무시하고 256으로 지정된 TCP 헤더에서 보급된 창 필드만 살펴보고 256바이트 이상의 TCP 데이터가 포함된 연결에 대해 들어오는 패킷을 삭제합니다. TCP 수신 창 크기 조정을 지원하려면 게이트웨이 디바이스 또는 방화벽이 TCP 핸드셰이크를 모니터링하고 TCP 연결 데이터의 일부로 협상된 창 배율 인수를 추적해야 합니다. 또한 다른 플랫폼의 일부 애플리케이션 및 TCP 스택 구현은 TCP WSopt 확장 및 창 배율 인수를 무시합니다. 따라서 데이터를 보내는 원격 호스트는 TCP 헤더의 창 필드에 보급된 속도로 데이터를 보낼 수 있습니다(256바이트). 이로 인해 수신자가 데이터를 매우 느리게 수신할 수 있습니다.

BehaviorId 멤버를 WsaBehaviorAutoTuning으로 설정하고 TargetOsVersion을 Windows Vista로 설정하면 창 배율 인수가 2로 줄어들므로 TCP 헤더의 Window 필드는 처음에 16,384바이트로 설정되고 초기 실제 창 수신 크기는 64K바이트인 창 배율 인수를 2로 설정합니다. 창 자동 튜닝 기능은 TCP 헤더의 창 필드를 65,535바이트로 설정하여 실제 창 수신 크기를 최대 262,140바이트까지 늘릴 수 있습니다. 이 옵션은 SYN을 보낸 후 의미가 없거나 적용되지 않으므로 소켓이 만들어지는 즉시 애플리케이션에서 SIO_SET_COMPATIBILITY_MODE IOCTL을 설정해야 합니다. 이 옵션을 설정하면 다음 명령과 동일한 영향을 미칩니다. netsh interface tcp set global autotuninglevel=highlyrestricted

Mswsockdef.h 헤더 파일은 Mswsock.h 또는 Netiodef.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

추가 정보

소켓

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW