네트워크 연결 집합 관리(연결)
Windows 2000부터 RPC 런타임은 클라이언트와 서버 간에 둘 이상의 연결을 유지할 수 있습니다. 이렇게 하면 연결을 다시 설정하지 않고 클라이언트 ID 변경을 지원하지 않는 전송, 다중 스레드 클라이언트 및 비동기 클라이언트에 대한 작업이 용이합니다. 클라이언트 프로세스와 서버 엔드포인트 간의 연결 집합을 RPC 용어의 연결 이라고 합니다. 연결을 이해하면 RPC의 구현이 향상될 수 있습니다.
단일 스레드 단일 클라이언트 ID 시나리오에서 RPC는 클라이언트 프로세스와 서버 엔드포인트 간에 하나의 연결을 열어 RPC를 호출합니다. 동기 RPC 호출이 수행되면 클라이언트는 이 연결의 서버에 요청을 보내고 이에 대한 회신도 받습니다. 클라이언트 프로세스에서 RPC 호출을 하는 스레드 수가 증가하면 클라이언트의 보안 ID가 변경됩니다. 비동기/파이프 호출이 클라이언트의 동기 호출과 혼합된 경우 RPC에는 둘 이상의 네트워크 연결이 필요할 수 있습니다. 집합의 모든 연결은 연결이라는 연결 풀에 배치됩니다.
동기 원격 프로시저 호출은 RPC 표준을 준수하기 위해 지정된 연결을 단독으로 사용합니다. 동기 RPC 호출에서 사용하는 연결은 요청이 전송되었지만 응답을 받지 못한 경우 사용 중인 것으로 간주됩니다. 응답이 수신될 때까지 해당 연결에서 다른 트래픽이 허용되지 않습니다. RPC 런타임은 동일한 연결에서 비동기 및 파이프 RPC 호출을 멀티플렉싱하려고 시도합니다. 동기 및 비동기/파이프 호출은 동일한 연결에서 혼합할 수 없습니다. 즉, 지정된 연결을 동기 RPC 호출 또는 비동기/파이프 RPC 호출에 사용할 수 있습니다.
RPC는 적극적으로 풀에서 연결을 다시 사용하려고 시도합니다. 새 RPC 호출이 이루어지면 RPC는 풀에서 적절한 연결을 찾으려고 시도하고 적절한 연결을 찾을 수 없는 경우에만 새 연결을 만듭니다. 연결이 적합한 것으로 간주되려면 다음을 수행해야 합니다.
- 적절한 형식(동기 또는 비동기/파이프)이어야 합니다.
- 무료입니다.
- 호출이 이루어지는 바인딩 핸들과 동일한 보안 ID를 갖습니다. 동적 ID 추적을 사용하는 경우 바인딩 핸들의 ID는 호출 시작 시 스레드 토큰에서 새로 고쳐집니다. 정적 ID 추적을 사용하는 경우 바인딩 핸들에 스탬프가 지정된 클라이언트 ID가 사용됩니다.
호출이 완료되면 응답이 수신되면 연결이 무료로 표시되고 다른 RPC 호출에 사용할 수 있습니다.
연결의 보안 ID는 변경할 수 없습니다. 예를 들어 동일한 서버에 대한 많은 수의 호출이 서로 다른 보안 ID로 이루어지면 스레드 풀의 연결 수가 증가합니다. 연결 자체는 참조로 계산되며 모든 참조가 사라지면 모든 연결을 중지하고 닫습니다. 모든 바인딩 핸들과 모든 컨텍스트 핸들은 연결에 대한 참조를 보유합니다. 모두 닫으면 연결이 사라집니다. Windows XP에서 연결이 즉시 사라지는 것은 아닙니다. 짧은 기간 동안 남아 있을 수 있습니다(대상 기간은 20초이지만 RPC 런타임은 작업을 실행할 수 있는 스레드가 없는 경우 연결 삭제를 지연하도록 선택할 수 있음). 마지막 컨텍스트 핸들/바인딩 핸들을 닫은 후 연결을 활성 상태로 유지하지 않으려면 RPC_C_OPT_DONT_LINGER 옵션을 사용하여 RPC 런타임이 연결을 즉시 닫도록 합니다.