Windows 소켓 스위치는 세션 프로토콜을 사용하여 SAN 연결을 통해 데이터를 전송합니다. 스위치가 소량의 데이터를 전송하는 경우 제어 메시지 내에서 해당 데이터를 전송합니다. 각 컨트롤 메시지는 헤더와 애플리케이션 데이터의 선택적 페이로드로 구성됩니다. 스위치가 많은 양의 데이터를 전송하는 경우 RDMA 작업을 사용하여 해당 데이터를 전송합니다.
이 섹션에서는 데이터 전송을 설정하고 수행하는 방법을 설명합니다.
메모 스위치를 로드하는 애플리케이션의 동작에 따라 스위치는 세션 프로토콜을 최적화하여 애플리케이션 데이터 전송과 관련된 오버헤드를 줄입니다.
이 섹션에서는 스위치의 세션 프로토콜이 데이터 전송을 수행하는 방법의 예제도 제공합니다. 그러나 이러한 예제에는 이러한 작업에 대한 명확한 설명이 포함되지 않습니다.
데이터 전송 설정
스위치는 연결된 각 소켓에 대한 제어 메시지 버퍼 풀을 할당합니다. 그런 다음 스위치는 SAN 서비스 공급자의 WSPRegisterMemory 함수를 호출하여 해당 메시지 버퍼를 실제 메모리 영역에 등록합니다. 스위치는 SAN 서비스 공급자의 WSPSend 함수를 호출할 때 버퍼 풀의 일부를 사용하여 원격 피어에 흐름 제어 정보를 보냅니다. 스위치는 SAN 서비스 공급자의 WSPRecv 함수를 호출할 때 풀의 다른 부분을 사용하여 메시지 버퍼를 게시하여 원격 피어에서 흐름 제어 정보를 수신합니다. 스위치는 제어 메시지를 수신한 후 즉시 처리합니다. 제어 메시지를 사용한 후 스위치는 SAN 서비스 공급자의 WSPRecv 함수를 호출하고 수신 버퍼를 전달하여 원격 피어에서 추가 제어 메시지를 받을 수 있도록 다시 게시합니다.
애플리케이션 데이터 전송
데이터 전송의 크기는 스위치가 데이터 전송 작업을 처리하는 방법에 영향을 줍니다.
애플리케이션이 소량의 데이터를 보내도록 요청하는 경우 스위치는 SAN에서 긴급 데이터 보내기에 설명된 대로 해당 데이터를 전송합니다.
애플리케이션이 많은 양의 데이터를 보내도록 요청하는 경우 스위치는 데이터의 초기 부분을 보내는 데 사용되는 제어 메시지 버퍼에 복사합니다. 이 컨트롤 메시지의 헤더에는 애플리케이션 데이터의 양을 지정하는 정보가 포함되어 있습니다. 그런 다음 스위치는 SAN 서비스 공급자의 WSPSend 함수를 호출하여 이 제어 메시지를 SAN 소켓의 원격 피어로 보냅니다.
스위치가 애플리케이션 데이터 전송을 완료하는 방법은 서비스 공급자가 WSPRdmaRead 함수를 지원하는지 여부에 따라 달라집니다.
WSPRdmaRead 함수를 지원하는 공급자로 데이터 전송
다음 그림에서는 원격 피어의 SAN 서비스 공급자가 WSPRdmaRead 함수를 지원하는 경우 스위치가 애플리케이션 데이터 전송을 완료하는 방법에 대한 개요를 보여 줍니다. 다음 시퀀스는 애플리케이션 데이터를 보다 자세히 전송하는 것을 설명합니다.
원격 피어가 WSPRdmaRead를 지원할 때 데이터를 전송하려면
- 로컬 스위치는 SAN 서비스 공급자의 WSPRegisterRdmaMemory 함수를 호출하여 읽기 액세스를 위해 RDMA 메모리를 등록해야 합니다. 이 경우 메시지 버퍼의 컨트롤 헤더는 애플리케이션의 나머지 데이터를 보유하는 RDMA 메모리에 대한 설명자도 식별합니다.
- 원격 피어의 스위치는 그런 다음 WSPRdmaRead를 호출하여, RDMA 메모리에서 애플리케이션 데이터를 이전에 WSPRegisterMemory 호출로 등록한 수신 버퍼로 전송합니다. SAN 서비스 공급자는 버퍼링된 데이터를 백그라운드에서 전송합니다. 이렇게 하면 SAN 서비스 공급자가 버퍼링된 데이터를 보내는 동안 한 번에 둘 이상의 보내기를 게시하지 않는 애플리케이션에서 다른 보내기 요청을 게시할 수 있습니다.
- 그런 다음 원격 피어의 스위치는 WSPSend 를 호출하여 로컬 스위치에 제어 메시지를 보내 전송이 완료되었음을 나타냅니다.
- 로컬 스위치는 WSPDeregisterRdmaMemory 함수를 호출하여 RDMA 메모리를 해제합니다.
- 로컬 스위치는 애플리케이션의 보내기 요청을 완료합니다. 스위치가 애플리케이션의 데이터 버퍼에 대한 메모리를 등록할 수 없거나 임시 메모리를 완전히 할당할 수 없는 경우 WSAENOBUFS 오류 코드를 사용하여 애플리케이션의 송신 요청을 완료합니다.
WSPRdmaRead 함수를 지원하지 않는 공급자로 데이터 전송
다음 그림에서는 원격 피어의 SAN 서비스 공급자가 WSPRdmaRead 함수를 지원하지 않는 경우 스위치가 애플리케이션 데이터 전송을 완료하는 방법에 대한 개요를 보여 줍니다. 다음 시퀀스는 애플리케이션 데이터를 보다 자세히 전송하는 것을 설명합니다.
원격 피어가 WSPRdmaRead를 지원하지 않는 경우 데이터를 전송하려면
- 원격 피어의 스위치는 WSPRegisterRdmaMemory 를 호출하여 쓰기 액세스를 위해 RDMA 메모리를 등록합니다.
- 그런 다음 원격 피어의 스위치는 WSPSend 를 호출하여 로컬 스위치가 쓸 수 있는 RDMA 메모리의 위치를 나타내는 제어 메시지를 로컬 스위치에 보냅니다.
- 로컬 스위치는 WSPRdmaWrite 함수를 호출하여 애플리케이션 데이터를 RDMA 메모리로 전송합니다. SAN 서비스 공급자는 버퍼링된 데이터를 백그라운드에서 전송합니다. 이렇게 하면 SAN 서비스 공급자가 버퍼링된 데이터를 보내는 동안 한 번에 둘 이상의 보내기를 게시하지 않는 애플리케이션에서 다른 보내기 요청을 게시할 수 있습니다.
- 로컬 스위치는 WSPGetOverlappedResult 함수를 호출하여 전송 결과를 가져옵니다. 자세한 내용은 데이터 전송 요청 완료를 참조하세요.
- 로컬 스위치는 WSPSend 를 호출하여 원격 피어에 제어 메시지를 보내 전송이 완료되었음을 나타냅니다.
- 원격 피어의 스위치는 WSPDeregisterRdmaMemory 를 호출하여 RDMA 메모리를 해제합니다.
- 로컬 스위치는 애플리케이션의 보내기 요청을 완료합니다. 스위치가 애플리케이션의 데이터 버퍼에 대한 메모리를 등록할 수 없거나 임시 메모리를 할당할 수 없는 경우 WSAENOBUFS 오류 코드를 사용하여 애플리케이션의 송신 요청을 완료합니다.
관련 항목
SAN 데이터 전송