이 섹션에서는 메시지 흐름과 각 메시지 유형의 의미를 설명합니다. (각 메시지의 정확한 표현에 대한 자세한 내용은 다음에 나와 있습니다.PostgreSQL : 문서 : 11 : 53.7. 토토 캔 형식.) 연결 상태에 따라 시작, 쿼리, 함수 호출 등 여러 가지 하위 프로토콜이 있습니다.복사및 종료. 또한 시작 단계 이후 언제든지 발생할 수 있는 비동기 작업(알림 응답 및 명령 취소 포함)에 대한 특별 조항도 있습니다.
세션을 시작하기 위해 프런트엔드는 서버에 대한 연결을 열고 시작 메시지를 보냅니다. 이 메시지에는 사용자의 이름과 사용자가 연결하려는 데이터베이스의 이름이 포함됩니다. 또한 사용할 특정 프로토콜 버전을 식별합니다. (선택적으로 시작 메시지에 런타임 매개변수에 대한 추가 설정이 포함될 수 있습니다.) 그런 다음 서버는 이 정보와 구성 파일의 내용(예:pg_hba.conf) 연결이 잠정적으로 허용되는지 여부와 필요한 추가 인증(있는 경우)을 확인합니다.
그런 다음 서버는 적절한 인증 요청 메시지를 보내고 프런트엔드는 이에 적절한 인증 응답 메시지(예: 비밀번호)로 응답해야 합니다. GSSAPI, SSPI 및 SASL을 제외한 모든 인증 방법에는 최대 하나의 요청과 하나의 응답이 있습니다. 일부 방법에서는 프런트엔드의 응답이 전혀 필요하지 않으므로 인증 요청이 발생하지 않습니다. GSSAPI, SSPI 및 SASL의 경우 인증을 완료하려면 여러 번의 패킷 교환이 필요할 수 있습니다.
인증 주기는 서버가 연결 시도를 거부하거나(ErrorResponse) AuthenticationOk를 보내는 것으로 끝납니다.
이 단계에서 서버로부터 가능한 메시지는 다음과 같습니다:
연결 시도가 거부되었습니다. 그런 다음 서버는 즉시 연결을 닫습니다.
인증 교환이 성공적으로 완료되었습니다.
프런트엔드는 이제 서버와의 Kerberos V5 인증 대화상자(여기서는 설명되지 않음, Kerberos 사양의 일부)에 참여해야 합니다. 이것이 성공하면 서버는 AuthenticationOk로 응답하고, 그렇지 않으면 ErrorResponse로 응답합니다. 이는 더 이상 지원되지 않습니다.
이제 프런트엔드는 비밀번호가 포함된 비밀번호 스포츠 토토를 일반 텍스트 형식으로 보내야 합니다. 이것이 올바른 비밀번호이면 서버는 AuthenticationOk로 응답하고, 그렇지 않으면 ErrorResponse로 응답합니다.
이제 프런트엔드는 MD5를 통해 암호화된 비밀번호(사용자 이름 포함)가 포함된 PasswordMessage를 보내야 하며 그런 다음 AuthenticationMD5Password 메시지에 지정된 4바이트 무작위 솔트를 사용하여 다시 암호화됩니다. 이것이 올바른 비밀번호이면 서버는 AuthenticationOk로 응답하고, 그렇지 않으면 ErrorResponse로 응답합니다. 실제 PasswordMessage는 SQL에서 다음과 같이 계산될 수 있습니다.concat('md5', md5(concat(md5(concat(비밀번호, 사용자 이름)), 무작위-소금))). ( 명심하세요md5()함수는 결과를 16진수 문자열로 반환합니다.)
이 응답은 SCM 자격 증명 메시지를 지원하는 플랫폼의 로컬 Unix 도메인 연결에만 가능합니다. 프런트엔드는 SCM 자격 증명 메시지를 발행한 다음 단일 데이터 바이트를 보내야 합니다. (데이터 바이트의 내용은 흥미롭지 않습니다. 이는 서버가 자격 증명 메시지를 받을 수 있을 만큼 오래 기다리는지 확인하는 데만 사용됩니다.) 자격 증명이 허용되면 서버는 AuthenticationOk로 응답하고, 그렇지 않으면 ErrorResponse로 응답합니다. (이 메시지 유형은 9.1 이전 서버에서만 발행됩니다. 결국 프로토콜 사양에서 제거될 수 있습니다.)
이제 프런트엔드가 GSSAPI 협상을 시작해야 합니다. 프런트엔드는 이에 대한 응답으로 GSSAPI 데이터 스트림의 첫 번째 부분과 함께 GSSResponse 스포츠 토토를 보냅니다. 추가 스포츠 토토가 필요한 경우 서버는 AuthenticationGSSContinue로 응답합니다.
이제 프런트엔드는 SSPI 협상을 시작해야 합니다. 프런트엔드는 이에 대한 응답으로 SSPI 데이터 스트림의 첫 번째 부분과 함께 GSSResponse를 보냅니다. 추가 스포츠 토토가 필요한 경우 서버는 AuthenticationGSSContinue로 응답합니다.
이 메시지에는 GSSAPI 또는 SSPI 협상의 이전 단계(AuthenticationGSS, AuthenticationSSPI 또는 이전 AuthenticationGSSContinue)의 응답 데이터가 포함되어 있습니다. 이 메시지의 GSSAPI 또는 SSPI 데이터가 인증을 완료하는 데 더 많은 데이터가 필요함을 나타내는 경우 프런트엔드는 해당 데이터를 다른 GSSResponse 메시지로 보내야 합니다. 이 메시지로 GSSAPI 또는 SSPI 인증이 완료되면 서버는 인증 성공을 나타내기 위해 AuthenticationOk를 보내거나 실패를 나타내기 위해 ErrorResponse를 보냅니다.
이제 프런트엔드는 스포츠 토토에 나열된 SASL 메커니즘 중 하나를 사용하여 SASL 협상을 시작해야 합니다. 프런트엔드는 선택한 메커니즘의 이름과 이에 대한 응답으로 SASL 데이터 스트림의 첫 번째 부분이 포함된 SASLInitialResponse를 보냅니다. 추가 스포츠 토토가 필요한 경우 서버는 AuthenticationSASLContinue로 응답합니다. 보다PostgreSQL : 문서 : 11 : 53.3. SASL 롤 토토자세한 내용은.
이 메시지에는 SASL 협상의 이전 단계(AuthenticationSASL 또는 이전 AuthenticationSASLContinue)의 챌린지 데이터가 포함되어 있습니다. 프런트엔드는 SASLResponse 메시지로 응답해야 합니다.
클라이언트에 대한 추가 메커니즘별 데이터로 SASL 인증이 완료되었습니다. 다음으로 서버는 인증 성공을 나타내기 위해 AuthenticationOk를 보내거나 실패를 나타내기 위해 ErrorResponse를 보냅니다. 이 메시지는 SASL 메커니즘이 완료 시 서버에서 클라이언트로 전송될 추가 데이터를 지정하는 경우에만 전송됩니다.
서버는 클라이언트가 요청한 마이너 프로토콜 버전을 지원하지 않지만 이전 버전의 프로토콜은 지원합니다. 이 메시지는 지원되는 가장 높은 부 버전을 나타냅니다. 이 메시지는 클라이언트가 지원되지 않는 프로토콜 옵션(예: 다음으로 시작)을 요청한 경우에도 전송됩니다._pq_.)을 시작 패킷에 넣습니다. 이 스포츠 토토 뒤에는 ErrorResponse 또는 인증 성공 또는 실패를 나타내는 스포츠 토토가 표시됩니다.
프런트엔드가 서버에서 요청한 인증 방법을 지원하지 않으면 즉시 연결을 종료해야 합니다.
AuthenticationOk를 받은 후 프런트엔드는 서버로부터 추가 메시지를 기다려야 합니다. 이 단계에서는 백엔드 프로세스가 시작되고 프론트엔드는 단지 관심 있는 방관자일 뿐입니다. 시작 시도가 실패하거나(ErrorResponse) 서버가 요청된 부 프로토콜 버전(NegotiateProtocolVersion)에 대한 지원을 거부할 가능성은 여전히 있지만 일반적인 경우 백엔드는 일부 ParameterStatus 메시지, BackendKeyData 및 마지막으로 ReadyForQuery를 보냅니다.
이 단계 동안 백엔드는 시작 스포츠 토토에 제공된 추가 런타임 매개변수 설정을 적용하려고 시도합니다. 성공하면 이 값이 세션 기본값이 됩니다. 오류로 인해 ErrorResponse가 발생하고 종료됩니다.
이 단계에서 백엔드에서 가능한 메시지는 다음과 같습니다:
이 스포츠 토토는 나중에 취소 요청을 발행할 수 있기를 원하는 경우 프런트엔드가 저장해야 하는 비밀 키 데이터를 제공합니다. 프런트엔드는 이 스포츠 토토에 응답해서는 안 되지만 ReadyForQuery 스포츠 토토를 계속 수신해야 합니다.
이 메시지는 다음과 같은 백엔드 매개변수의 현재(초기) 설정에 대해 프런트엔드에 알립니다.client_encoding또는날짜 스타일. 프런트엔드는 이 스포츠 토토를 무시하거나 나중에 사용할 수 있도록 설정을 기록할 수 있습니다. 보다섹션 53.2.721412_21540
시작이 완료되었습니다. 이제 프런트엔드에서 명령을 실행할 수 있습니다.
시작에 실패했습니다. 이 스포츠 토토를 보낸 후 연결이 종료됩니다.
경고 메시지가 발행되었습니다. 프런트엔드는 메시지를 표시하지만 ReadyForQuery 또는 ErrorResponse를 계속 수신해야 합니다.
ReadyForQuery 메시지는 각 명령 주기 후에 백엔드가 발행하는 메시지와 동일합니다. 프런트엔드의 코딩 요구 사항에 따라 ReadyForQuery를 명령 주기 시작으로 간주하거나 ReadyForQuery를 시작 단계 및 각 후속 명령 주기 종료로 간주하는 것이 합리적입니다.
간단한 쿼리 주기는 프런트엔드가 쿼리 메시지를 백엔드에 전송함으로써 시작됩니다. 메시지에는 텍스트 문자열로 표현된 SQL 명령이 포함됩니다. 그런 다음 백엔드는 쿼리 명령 문자열의 내용에 따라 하나 이상의 응답 메시지를 보내고 마지막으로 ReadyForQuery 응답 메시지를 보냅니다. ReadyForQuery는 프런트엔드에 새 명령을 안전하게 보낼 수 있음을 알립니다. (실제로 프런트엔드가 다른 명령을 실행하기 전에 ReadyForQuery를 기다릴 필요는 없지만, 프런트엔드는 이전 명령이 실패하고 이미 실행된 이후 명령이 성공할 경우 어떤 일이 발생하는지 파악하는 책임을 져야 합니다.)
백엔드에서 가능한 응답 메시지는 다음과 같습니다:
SQL 명령이 정상적으로 완료되었습니다.
백엔드가 프런트엔드에서 테이블로 데이터를 복사할 준비가 되었습니다. 보다섹션 53.2.6.
백엔드가 테이블에서 프런트엔드로 데이터를 복사할 준비가 되었습니다. 보다섹션 53.2.6.
다음에 대한 응답으로 행이 곧 반환될 것임을 나타냅니다.선택, 가져오기등의 쿼리를 수행합니다. 이 메시지의 내용은 행의 열 레이아웃을 설명합니다. 그 다음에는 프런트엔드에 반환되는 각 행에 대한 DataRow 메시지가 옵니다.
a에 의해 반환된 행 집합 중 하나선택, 가져오기등의 쿼리를 수행합니다.
빈 쿼리 문자열이 인식되었습니다.
오류가 발생했습니다.
쿼리 문자열 처리가 완료되었습니다. 쿼리 문자열에 여러 SQL 명령이 포함될 수 있으므로 이를 나타내기 위해 별도의 메시지가 전송됩니다. (CommandComplete는 전체 문자열이 아닌 하나의 SQL 명령 처리 종료를 표시합니다.) ReadyForQuery는 처리가 성공적으로 종료되거나 오류와 함께 종료되는지 여부에 관계없이 항상 전송됩니다.
문의와 관련하여 경고 스포츠 토토가 발행되었습니다. 알림은 다른 응답에 추가됩니다. 즉, 백엔드가 명령을 계속 처리합니다.
a에 대한 응답선택쿼리(또는 다음과 같은 행 집합을 반환하는 기타 쿼리)설명또는표시)는 일반적으로 RowDescription, 0개 이상의 DataRow 메시지, CommandComplete로 구성됩니다.복사프런트엔드에서 또는 프런트엔드에서 설명된 대로 특수 프로토콜을 호출합니다.섹션 53.2.6. 다른 모든 쿼리 유형은 일반적으로 CommandComplete 스포츠 토토만 생성합니다.
쿼리 문자열에는 여러 쿼리(세미콜론으로 구분)가 포함될 수 있으므로 백엔드가 쿼리 문자열 처리를 완료하기 전에 이러한 응답 시퀀스가 여러 개 있을 수 있습니다. ReadyForQuery는 전체 문자열이 처리되고 백엔드가 새 쿼리 문자열을 받아들일 준비가 되면 발행됩니다.
완전히 비어 있는(공백 이외의 내용 없음) 쿼리 문자열이 수신되면 응답은 EmptyQueryResponse 다음에 ReadyForQuery가 됩니다.
오류 발생 시 ErrorResponse가 발행되고 ReadyForQuery가 발행됩니다. 쿼리 문자열에 대한 모든 추가 처리는 ErrorResponse에 의해 중단됩니다(더 많은 쿼리가 남아 있더라도). 이는 개별 쿼리에 의해 생성된 메시지 시퀀스 도중에 발생할 수 있습니다.
간단한 쿼리 모드에서 검색된 값의 형식은 주어진 명령이 a인 경우를 제외하고 항상 텍스트입니다.가져오기다음으로 선언된 커서에서바이너리옵션. 이 경우 검색된 값은 이진 형식입니다. RowDescription 스포츠 토토에 제공된 형식 코드는 사용 중인 형식을 알려줍니다.
프런트엔드는 다른 유형의 스포츠 토토가 필요할 때마다 ErrorResponse 및 NoticeResponse 스포츠 토토를 수락할 준비가 되어 있어야 합니다. 또한 참조하세요섹션 53.2.7외부 이벤트로 인해 백엔드가 생성할 수 있는 스포츠 토토에 관한 것입니다.
권장되는 방법은 스포츠 토토의 정확한 순서에 대한 가정을 연결하기보다는 언제든지 의미가 있는 모든 스포츠 토토 유형을 허용하는 상태 시스템 스타일로 프런트엔드를 코딩하는 것입니다.
간단한 쿼리 메시지에 둘 이상의 SQL 문(세미콜론으로 구분)이 포함되어 있는 경우, 다른 동작을 강제하기 위해 명시적인 트랜잭션 제어 명령이 포함되지 않는 한 해당 문은 단일 트랜잭션으로 실행됩니다. 예를 들어 메시지에 다음이 포함된 경우
INSERT INTO mytable VALUES(1); 1/0 선택; mytable VALUES(2)에 삽입;
그러면 0으로 나누기 실패선택첫 번째 항목을 강제로 롤백합니다.삽입. 게다가 첫 번째 오류가 발생하면 스포츠 토토 실행이 중단되므로 두 번째는삽입전혀 시도되지 않습니다.
대신 메시지에 다음이 포함되어 있는 경우
시작; INSERT INTO mytable VALUES(1); 저지르다; INSERT INTO mytable VALUES(2); 1/0을 선택하세요.
그다음 첫 번째삽입명시적인 내용에 의해 커밋됨커밋명령. 두 번째삽입그리고선택여전히 단일 트랜잭션으로 처리되므로 0으로 나누기 실패로 인해 두 번째 트랜잭션이 롤백됩니다.삽입, 하지만 첫 번째는 아닙니다.
이 동작은 다중 문 쿼리 스포츠 토토의 문을 실행하여 구현됩니다.암시적 트랜잭션 블록실행할 명시적인 트랜잭션 블록이 없는 한. 암시적 트랜잭션 블록과 일반 트랜잭션 블록의 주요 차이점은 암시적 블록이 오류가 없는 경우 암시적 커밋에 의해, 오류가 있는 경우 암시적 롤백을 통해 쿼리 메시지 끝에서 자동으로 닫히는 것입니다. 이는 트랜잭션 블록에 있지 않은 경우 자체적으로 실행된 문에 대해 발생하는 암시적 커밋 또는 롤백과 유사합니다.
다음의 결과로 세션이 이미 트랜잭션 블록에 있는 경우시작일부 이전 메시지에서 쿼리 메시지는 메시지에 하나의 명령문이 포함되어 있든 여러 개가 포함되어 있든 상관없이 단순히 해당 트랜잭션 블록을 계속합니다. 그러나 쿼리 메시지에커밋또는롤백기존 트랜잭션 블록을 닫으면 암시적 트랜잭션 블록에서 다음 명령문이 실행됩니다. 반대로 만약 a시작다중 문 쿼리 메시지에 나타난 다음 명시적인 명령에 의해서만 종료되는 일반 트랜잭션 블록을 시작합니다.커밋또는롤백, 이 쿼리 메시지에 표시되는지 아니면 이후 메시지에 표시되는지 여부. 만약시작암시적 트랜잭션 블록으로 실행된 일부 명령문을 따르며 해당 명령문은 즉시 커밋되지 않습니다. 사실상 새로운 일반 거래 블록에 소급하여 포함됩니다.
A 커밋또는롤백암시적 트랜잭션 블록에 나타나는 것은 정상적으로 실행되어 암시적 블록을 닫습니다. 그러나 다음 이후에는 경고가 발행됩니다.커밋또는롤백이전 없음시작실수를 나타낼 수 있습니다. 더 많은 문이 뒤따르면 새로운 암시적 트랜잭션 블록이 시작됩니다.
저장점은 오류 발생 시 자동으로 블록을 닫는 동작과 충돌하기 때문에 암시적 트랜잭션 블록에서 허용되지 않습니다.
존재할 수 있는 트랜잭션 제어 명령에 관계없이 쿼리 스포츠 토토 실행이 첫 번째 오류에서 중지된다는 점을 기억하십시오. 따라서 예를 들어 주어진
시작; 1/0 선택; 롤백;
단일 쿼리 스포츠 토토에서 세션은 실패한 일반 트랜잭션 블록 내부에 남게 됩니다.롤백32331_32389롤백세션을 사용 가능한 상태로 복원하려면 필요합니다.
또 다른 주목할만한 동작은 전체 쿼리 문자열이 실행되기 전에 초기 어휘 및 구문 분석이 수행된다는 것입니다. 따라서 이후 명령문의 간단한 오류(예: 철자가 틀린 키워드)로 인해 명령문이 실행되지 않을 수 있습니다. 암시적 트랜잭션 블록으로 수행되면 문이 모두 롤백되므로 이는 일반적으로 사용자에게 표시되지 않습니다. 그러나 다중 문 쿼리 내에서 여러 트랜잭션을 수행하려고 하면 표시될 수 있습니다. 예를 들어, 오타로 인해 이전 예가 다음과 같이 바뀌었다면
시작; INSERT INTO mytable VALUES(1); 저지르다; INSERT INTO mytable VALUES(2); 1/0을 선택하세요.
그러면 어떤 명령문도 실행되지 않아 첫 번째 명령문과 눈에 띄는 차이가 발생합니다.삽입커밋되지 않았습니다. 철자가 틀린 테이블이나 열 이름과 같이 의미 분석 이상에서 감지된 오류는 이 효과를 갖지 않습니다.
확장 쿼리 프로토콜은 위에서 설명한 단순 쿼리 프로토콜을 여러 단계로 나눕니다. 준비 단계의 결과는 효율성 향상을 위해 여러 번 재사용될 수 있습니다. 또한 데이터 값을 쿼리 문자열에 직접 삽입하는 대신 별도의 매개변수로 제공할 수 있는 기능과 같은 추가 기능을 사용할 수 있습니다.
확장 프로토콜에서 프런트엔드는 먼저 텍스트 쿼리 문자열, 선택적으로 매개변수 자리 표시자의 데이터 유형에 대한 일부 정보 및 대상 준비된 명령문 객체의 이름이 포함된 구문 분석 메시지를 보냅니다(빈 문자열은 이름이 없는 준비된 명령문을 선택합니다). 응답은 ParseComplete 또는 ErrorResponse입니다. 매개변수 데이터 유형은 OID로 지정할 수 있습니다. 지정되지 않은 경우 파서는 유형이 지정되지 않은 리터럴 문자열 상수에 대해 수행하는 것과 동일한 방식으로 데이터 유형을 추론하려고 시도합니다.
매개변수 데이터 유형은 0으로 설정하거나 매개변수 유형 OID 배열을 매개변수 기호 수보다 짧게 만들어 지정되지 않은 상태로 둘 수 있습니다($n)이 쿼리 문자열에 사용됩니다. 또 다른 특별한 경우는 매개변수 유형을 다음과 같이 지정할 수 있다는 것입니다.무효(즉, OID는공허의사 유형). 이는 실제로 OUT 매개변수인 기능 매개변수에 대해 매개변수 기호를 사용할 수 있도록 하기 위한 것입니다. 일반적으로 a공허매개변수를 사용할 수 있지만 이러한 매개변수 기호가 함수의 매개변수 목록에 나타나면 사실상 무시됩니다. 예를 들어, 다음과 같은 함수 호출은foo($1,$2,$3,$4)인 경우 두 개의 IN 및 두 개의 OUT 인수가 있는 함수와 일치할 수 있습니다.$3그리고$4유형이 있는 것으로 지정됨공허.
구문 분석 스포츠 토토에 포함된 쿼리 문자열은 하나 이상의 SQL 문을 포함할 수 없습니다. 그렇지 않으면 구문 오류가 보고됩니다. 이 제한은 단순 쿼리 프로토콜에는 존재하지 않지만 확장 프로토콜에는 존재합니다. 왜냐하면 준비된 문이나 포털에 여러 명령을 포함하도록 허용하면 프로토콜이 과도하게 복잡해지기 때문입니다.
성공적으로 생성되면 명명된 준비된 명령문 개체는 명시적으로 삭제되지 않는 한 현재 세션이 끝날 때까지 지속됩니다. 이름 없는 준비된 문은 이름 없는 문을 대상으로 지정하는 다음 Parse 문이 실행될 때까지만 지속됩니다. (간단한 쿼리 메시지는 이름이 지정되지 않은 문도 삭제한다는 점에 유의하세요.) 이름이 지정된 준비된 문은 다른 구문 분석 메시지에 의해 재정의되기 전에 명시적으로 닫혀야 하지만 이름이 지정되지 않은 문에는 필요하지 않습니다. 명명된 준비된 문은 다음을 사용하여 SQL 명령 수준에서 생성하고 액세스할 수도 있습니다.준비그리고실행.
준비된 명령문이 존재하면 바인드 메시지를 사용하여 실행할 준비를 할 수 있습니다. Bind 메시지는 소스 준비된 문의 이름(빈 문자열은 이름이 없는 준비된 문을 나타냄), 대상 포털의 이름(빈 문자열은 이름이 없는 포털을 나타냄) 및 준비된 문에 있는 매개 변수 자리 표시자에 사용할 값을 제공합니다. 제공된 매개변수 세트는 준비된 문에 필요한 것과 일치해야 합니다. (당신이 선언한 경우)공허파라미터 메시지의 매개변수는 바인드 메시지에서 해당 매개변수에 대해 NULL 값을 전달합니다.) 바인드는 또한 쿼리에서 반환된 모든 데이터에 사용할 형식을 지정합니다. 형식은 전체 또는 열별로 지정할 수 있습니다. 응답은 BindComplete 또는 ErrorResponse입니다.
텍스트와 바이너리 출력 사이의 선택은 관련된 SQL 명령에 관계없이 바인드에 제공된 형식 코드에 의해 결정됩니다. 그만큼바이너리커서 선언의 속성은 확장 쿼리 프로토콜을 사용할 때 관련이 없습니다.
쿼리 계획은 일반적으로 바인드 메시지가 처리될 때 발생합니다. 준비된 문에 매개변수가 없거나 반복적으로 실행되는 경우 서버는 생성된 계획을 저장하고 동일한 준비된 문에 대한 후속 바인딩 메시지 중에 이를 다시 사용할 수 있습니다. 그러나 제공된 특정 매개변수 값에 의존하는 계획보다 효율성이 떨어지지 않는 일반 계획을 생성할 수 있는 경우에만 그렇게 합니다. 이는 프로토콜에 관한 한 투명하게 발생합니다.
성공적으로 생성되면 명명된 포털 개체는 명시적으로 파괴되지 않는 한 현재 트랜잭션이 끝날 때까지 지속됩니다. 이름 없는 포털은 트랜잭션이 끝날 때 또는 이름 없는 포털을 대상으로 지정하는 다음 Bind 문이 실행되자마자 삭제됩니다. (간단한 쿼리 메시지는 이름이 없는 포털도 삭제한다는 점에 유의하세요.) 이름이 지정된 포털은 다른 바인드 메시지에 의해 재정의되기 전에 명시적으로 닫혀야 하지만 이름이 없는 포털에는 이것이 필요하지 않습니다. 명명된 포털은 다음을 사용하여 SQL 명령 수준에서 생성하고 액세스할 수도 있습니다.커서 선언그리고가져오기.
포털이 존재하면 실행 메시지를 사용하여 실행할 수 있습니다. 실행 메시지는 포털 이름(빈 문자열은 이름이 지정되지 않은 포털을 나타냄)과 최대 결과 행 수(0의 의미)를 지정합니다.“모든 행 가져오기”). 결과 행 수는 행 세트를 반환하는 명령이 포함된 포털에만 의미가 있습니다. 다른 경우에는 명령이 항상 실행되어 완료되며 행 수가 무시됩니다. Execute에 대한 가능한 응답은 Execute가 ReadyForQuery 또는 RowDescription을 실행하지 않는다는 점을 제외하면 단순 쿼리 프로토콜을 통해 실행된 쿼리에 대해 위에서 설명한 것과 동일합니다.
포털 실행을 완료하기 전에 실행이 종료되는 경우(0이 아닌 결과 행 개수에 도달하여) PortalSuspended 메시지를 보냅니다. 이 메시지의 표시는 작업을 완료하기 위해 동일한 포털에 대해 다른 실행을 실행해야 함을 프런트엔드에 알려줍니다. 소스 SQL 명령의 완료를 나타내는 CommandComplete 메시지는 포털의 실행이 완료될 때까지 전송되지 않습니다. 따라서 실행 단계는 항상 CommandComplete, EmptyQueryResponse(포탈이 빈 쿼리 문자열에서 생성된 경우), ErrorResponse 또는 PortalSuspended 메시지 중 정확히 하나가 나타나면 종료됩니다.
각 확장 쿼리 메시지 시리즈가 완료되면 프런트엔드는 동기화 메시지를 발행해야 합니다. 이 매개변수 없는 메시지로 인해 백엔드는 현재 트랜잭션이 a 내부에 없는 경우 닫힙니다.시작/커밋트랜잭션 차단(“닫기”오류가 없으면 커밋하고, 오류가 있으면 롤백을 의미합니다.) 그런 다음 ReadyForQuery 응답이 발행됩니다. 동기화의 목적은 오류 복구를 위한 재동기화 지점을 제공하는 것입니다. 확장 쿼리 메시지를 처리하는 동안 오류가 감지되면 백엔드는 ErrorResponse를 발행한 다음 동기화에 도달할 때까지 메시지를 읽고 삭제한 다음 ReadyForQuery를 발행하고 일반 메시지 처리로 돌아갑니다. (단, 오류가 감지되면 건너뛰기가 발생하지 않는다는 점에 유의하세요.그동안동기화 처리 중 — 이는 각 동기화에 대해 단 하나의 ReadyForQuery가 전송되도록 보장합니다.)
동기화로 인해 트랜잭션 블록이 열리지 않습니다.시작폐쇄됩니다. ReadyForQuery 메시지에는 트랜잭션 상태 정보가 포함되어 있으므로 이러한 상황을 감지할 수 있습니다.
이러한 기본 필수 작업 외에도 확장 쿼리 프로토콜과 함께 사용할 수 있는 몇 가지 선택적 작업이 있습니다.
설명 메시지(포털 변형)는 기존 포털의 이름(또는 이름이 지정되지 않은 포털의 경우 빈 문자열)을 지정합니다. 응답은 포털을 실행하여 반환될 행을 설명하는 RowDescription 메시지입니다. 또는 포털에 행을 반환하는 쿼리가 포함되어 있지 않은 경우 NoData 메시지입니다. 또는 그러한 포털이 없는 경우 ErrorResponse입니다.
설명 메시지(문 변형)는 기존 준비된 문의 이름(또는 이름이 없는 준비된 문의 경우 빈 문자열)을 지정합니다. 응답은 명령문에 필요한 매개변수를 설명하는 ParameterDescription 메시지와 명령문이 최종적으로 실행될 때 반환될 행을 설명하는 RowDescription 메시지(또는 명령문이 행을 반환하지 않는 경우 NoData 메시지)입니다. 준비된 명령문이 없으면 ErrorResponse가 발행됩니다. Bind가 아직 실행되지 않았으므로 반환된 열에 사용할 형식은 아직 백엔드에 알려지지 않았습니다. 이 경우 RowDescription 메시지의 형식 코드 필드는 0이 됩니다.
대부분의 시나리오에서 프런트엔드는 Execute를 실행하기 전에 하나 이상의 설명 변형을 실행하여 반환될 결과를 해석하는 방법을 알고 있는지 확인해야 합니다.
닫기 메시지는 기존의 준비된 명령문 또는 포털을 닫고 리소스를 해제합니다. 존재하지 않는 문이나 포털 이름에 대해 Close를 실행하는 것은 오류가 아닙니다. 응답은 일반적으로 CloseComplete이지만 리소스를 해제하는 동안 문제가 발생하면 ErrorResponse가 될 수 있습니다. 준비된 문을 닫으면 해당 문으로 구성된 모든 열려 있는 포털이 암시적으로 닫힙니다.
플러시 메시지는 특정 출력을 생성하지 않지만 백엔드가 출력 버퍼에 보류 중인 모든 데이터를 전달하도록 강제합니다. 프런트엔드가 추가 명령을 실행하기 전에 해당 명령의 결과를 검사하려는 경우 Sync를 제외한 모든 확장 쿼리 명령 후에 Flush를 전송해야 합니다. 플러시가 없으면 백엔드에서 반환된 메시지는 가능한 최소 패킷 수로 결합되어 네트워크 오버헤드를 최소화합니다.
간단한 쿼리 메시지는 이름이 지정되지 않은 준비된 명령문과 포털 개체를 사용하고 매개변수 없이 구문 분석, 바인드, 포털 설명, 실행, 닫기, 동기화 시리즈와 거의 동일합니다. 한 가지 차이점은 쿼리 문자열에 여러 SQL 문을 허용하여 각 문에 대해 자동으로 바인딩/설명/실행 시퀀스를 연속적으로 수행한다는 것입니다. 또 다른 차이점은 ParseComplete, BindComplete, CloseComplete 또는 NoData 메시지를 반환하지 않는다는 것입니다.
확장 쿼리 프로토콜을 사용하면 허용됩니다.파이프라인, 이는 이전 쿼리가 완료될 때까지 기다리지 않고 일련의 쿼리를 보내는 것을 의미합니다. 이렇게 하면 특정 일련의 작업을 완료하는 데 필요한 네트워크 왕복 횟수가 줄어듭니다. 그러나 단계 중 하나가 실패할 경우 사용자는 필요한 동작을 신중하게 고려해야 합니다. 이후 쿼리가 이미 서버로 이동 중이기 때문입니다.
이를 처리하는 한 가지 방법은 전체 쿼리 시리즈를 단일 트랜잭션으로 만드는 것입니다. 즉, 이를 래핑하는 것입니다.시작 ... 커밋. 그러나 일부 명령을 다른 명령과 독립적으로 커밋하려는 경우에는 도움이 되지 않습니다.
확장 쿼리 프로토콜은 이 문제를 관리하는 또 다른 방법을 제공합니다. 이는 종속된 단계 간에 동기화 메시지 전송을 생략하는 것입니다. 오류가 발생한 후 백엔드는 동기화를 찾을 때까지 명령 메시지를 건너뛰기 때문에 클라이언트가 명시적으로 관리할 필요 없이 이전 명령이 실패할 때 파이프라인의 이후 명령을 자동으로 건너뛸 수 있습니다.시작그리고커밋. 파이프라인의 독립적으로 커밋 가능한 세그먼트는 동기화 메시지로 분리될 수 있습니다.
클라이언트가 명시적인 명령을 발행하지 않은 경우시작, 그러면 각 동기화는 일반적으로 암시적커밋이전 단계가 성공했거나 암시적인 경우롤백실패한 경우. 그러나 몇 가지 DDL 명령(예:데이터베이스 생성)은 트랜잭션 블록 내에서 실행될 수 없습니다. 이들 중 하나가 파이프라인에서 실행되는 경우 파이프라인의 첫 번째 명령이 아니면 실패합니다. 또한 성공하면 데이터베이스 일관성을 유지하기 위해 즉시 커밋을 강제합니다. 따라서 이러한 명령 중 하나 바로 뒤에 오는 동기화는 ReadyForQuery로 응답하는 것 외에는 아무런 효과가 없습니다.
이 방법을 사용할 때 파이프라인 완료는 ReadyForQuery 메시지를 계산하고 전송된 동기화 수에 도달할 때까지 기다려야 합니다. 일부 명령을 건너뛰어 완료 메시지를 생성하지 않을 수 있으므로 명령 완료 응답 계산은 신뢰할 수 없습니다.
함수 호출 하위 프로토콜을 통해 클라이언트는 데이터베이스에 존재하는 모든 함수의 직접 호출을 요청할 수 있습니다.pg_proc시스템 카탈로그. 클라이언트에는 함수에 대한 실행 권한이 있어야 합니다.
함수 호출 하위 프로토콜은 새 코드에서는 피하는 것이 가장 좋은 레거시 기능입니다. 다음과 같은 준비된 문을 설정하면 비슷한 결과를 얻을 수 있습니다.선택 함수($1, ...). 그런 다음 함수 호출 주기를 바인딩/실행으로 대체할 수 있습니다.
함수 호출 주기는 프론트엔드가 백엔드에 FunctionCall 메시지를 전송함으로써 시작됩니다. 그런 다음 백엔드는 함수 호출 결과에 따라 하나 이상의 응답 메시지를 보내고 마지막으로 ReadyForQuery 응답 메시지를 보냅니다. ReadyForQuery는 새로운 쿼리나 함수 호출을 안전하게 보낼 수 있음을 프런트엔드에 알립니다.
백엔드에서 가능한 응답 메시지는 다음과 같습니다:
오류가 발생했습니다.
함수 호출이 완료되었으며 스포츠 토토에 제공된 결과를 반환했습니다. (함수 호출 프로토콜은 행 유형이나 결과 집합이 아닌 단일 스칼라 결과만 처리할 수 있습니다.)
함수 호출 처리가 완료되었습니다. ReadyForQuery는 처리가 성공적으로 종료되었거나 오류로 종료되었는지 여부에 관계없이 항상 전송됩니다.
함수 호출과 관련하여 경고 스포츠 토토가 발행되었습니다. 알림은 다른 응답에 추가됩니다. 즉, 백엔드가 명령을 계속 처리합니다.
그복사명령을 사용하면 서버와의 고속 대량 데이터 전송이 가능합니다. 복사 및 복사 작업은 각각 작업이 완료될 때까지 지속되는 별도의 하위 프로토콜로 연결을 전환합니다.
복사 모드(서버로의 데이터 전송)는 백엔드가 다음을 실행할 때 시작됩니다.STDIN에서 복사SQL문. 백엔드는 CopyInResponse 메시지를 프런트엔드로 보냅니다. 그런 다음 프런트엔드는 0개 이상의 CopyData 메시지를 보내 입력 데이터 스트림을 형성해야 합니다. (메시지 경계는 행 경계와 관련이 있을 필요는 없지만 종종 합리적인 선택입니다.) 프런트엔드는 CopyDone 메시지(성공적인 종료 허용) 또는 CopyFail 메시지(다음을 유발함)를 전송하여 복사 모드를 종료할 수 있습니다.복사SQL 문이 오류로 인해 실패했습니다). 그런 다음 백엔드는 이전의 명령 처리 모드로 되돌아갑니다.복사시작되었으며 이는 단순 또는 확장 쿼리 프로토콜이 됩니다. 다음으로 CommandComplete(성공한 경우) 또는 ErrorResponse(성공하지 않은 경우)를 보냅니다.
복사 모드 중 백엔드에서 오류가 감지된 경우(CopyFail 메시지 수신 포함) 백엔드는 ErrorResponse 메시지를 발행합니다. 만약복사명령이 확장 쿼리 메시지를 통해 실행되면 백엔드는 이제 동기화 메시지가 수신될 때까지 프런트엔드 메시지를 삭제한 다음 ReadyForQuery를 실행하고 일반 처리로 돌아갑니다. 만약복사명령이 간단한 쿼리 메시지에서 실행되었으며 해당 메시지의 나머지 부분은 삭제되고 ReadyForQuery가 실행되었습니다. 두 경우 모두 프런트엔드에서 발행된 모든 후속 CopyData, CopyDone 또는 CopyFail 메시지는 삭제됩니다.
백엔드는 복사 모드 중에 수신된 플러시 및 동기화 메시지를 무시합니다. 기타 비복사 메시지 유형을 수신하면 위에서 설명한 대로 복사 상태가 중단되는 오류가 됩니다. (Flush 및 Sync에 대한 예외는 실행될 명령이 a인지 확인하지 않고 항상 Execute 메시지 후에 Flush 또는 Sync를 보내는 클라이언트 라이브러리의 편의를 위한 것입니다.STDIN에서 복사.)
백엔드가 다음을 실행할 때 복사 모드(서버에서 데이터 전송)가 시작됩니다.STDOUT에 복사SQL문. 백엔드는 CopyOutResponse 메시지를 프런트엔드에 보낸 다음 0개 이상의 CopyData 메시지(항상 행당 하나), CopyDone을 보냅니다. 그런 다음 백엔드는 이전의 명령 처리 모드로 되돌아갑니다.복사시작하고 CommandComplete를 보냅니다. 프런트엔드는 연결을 닫거나 취소 요청을 실행하는 경우를 제외하고 전송을 중단할 수 없지만 원치 않는 CopyData 및 CopyDone 메시지를 삭제할 수 있습니다.
복사 모드 중 백엔드에서 오류가 감지된 경우 백엔드는 ErrorResponse 메시지를 발행하고 일반 처리로 되돌아갑니다. 프런트엔드는 ErrorResponse 수신을 복사 모드 종료로 처리해야 합니다.
NoticeResponse 및 ParameterStatus 메시지가 CopyData 메시지 사이에 삽입될 수 있습니다. 프런트엔드는 이러한 경우를 처리해야 하며 다른 비동기 메시지 유형에 대해서도 준비해야 합니다(참조섹션 53.2.7). 그렇지 않으면 CopyData 또는 CopyDone 이외의 모든 메시지 유형이 복사 모드 종료로 처리될 수 있습니다.
copy-both라는 또 다른 복사 관련 모드가 있는데, 이를 통해 다음으로 고속 대량 데이터 전송이 가능합니다.그리고서버에서. 모두 복사 모드는 walsender 모드의 백엔드가 다음을 실행할 때 시작됩니다.START_REPLICATION문. 백엔드는 CopyBothResponse 메시지를 프런트엔드로 보냅니다. 그러면 백엔드와 프런트엔드 모두 한쪽 끝이 CopyDone 메시지를 보낼 때까지 CopyData 메시지를 보낼 수 있습니다. 클라이언트가 CopyDone 메시지를 보낸 후 연결은 모두 복사 모드에서 복사 모드로 전환되고 클라이언트는 더 이상 CopyData 메시지를 보낼 수 없습니다. 마찬가지로 서버가 CopyDone 메시지를 보내면 연결은 복사 모드로 전환되고 서버는 더 이상 CopyData 메시지를 보낼 수 없습니다. 양쪽에서 CopyDone 메시지를 보낸 후 복사 모드가 종료되고 백엔드는 명령 처리 모드로 되돌아갑니다. 모두 복사 모드 중에 백엔드에서 오류가 감지된 경우 백엔드는 ErrorResponse 메시지를 발행하고 동기화 메시지가 수신될 때까지 프런트엔드 메시지를 삭제한 다음 ReadyForQuery를 발행하고 일반 처리로 돌아갑니다. 프런트엔드는 ErrorResponse 수신을 양방향에서 복사본을 종료하는 것으로 처리해야 합니다. 이 경우 CopyDone을 보내서는 안 됩니다. 보다PostgreSQL : 문서 : 11 : 53.4. 토토 핫 복제 프로토콜복사 모드를 통해 전송된 하위 프로토콜에 대한 자세한 내용은.
CopyInResponse, CopyOutResponse 및 CopyBothResponse 메시지에는 행당 열 수와 각 열에 사용되는 형식 코드를 프런트엔드에 알리는 필드가 포함되어 있습니다. (현재 구현 기준으로 특정 열의 모든 열은복사작업은 동일한 형식을 사용하지만 메시지 디자인에서는 이를 가정하지 않습니다.)
백엔드가 프런트엔드의 명령 스트림에 의해 구체적으로 프롬프트되지 않은 메시지를 보내는 경우가 몇 가지 있습니다. 프런트엔드는 쿼리에 참여하지 않는 경우에도 언제든지 이러한 메시지를 처리할 준비가 되어 있어야 합니다. 최소한 쿼리 응답을 읽기 시작하기 전에 이러한 사례를 확인해야 합니다.
외부 활동으로 인해 NoticeResponse 메시지가 생성될 수 있습니다. 예를 들어, 데이터베이스 관리자가 다음 명령을 내리는 경우“빠르게”데이터베이스가 종료되면 백엔드는 연결을 닫기 전에 이 사실을 나타내는 NOTICEResponse를 보냅니다. 따라서 연결이 명목상 유휴 상태인 경우에도 프런트엔드는 항상 통지 응답 메시지를 수락하고 표시할 준비가 되어 있어야 합니다.
ParameterStatus 메시지는 프론트엔드가 알아야 한다고 백엔드가 믿는 매개변수에 대한 활성 값이 변경될 때마다 생성됩니다. 가장 일반적으로 이는 a에 대한 응답으로 발생합니다.SET프런트엔드에서 실행된 SQL 명령. 이 경우는 사실상 동기적입니다. 그러나 관리자가 구성 파일을 변경한 다음 다음을 전송했기 때문에 매개변수 상태 변경이 발생할 수도 있습니다.SIGHUP서버에 신호를 보냅니다. 또한, 만일 aSET명령이 롤백되면 적절한 ParameterStatus 메시지가 생성되어 현재 유효 값을 보고합니다.
현재 ParameterStatus가 생성될 고정된 매개변수 세트가 있습니다. 그들은 다음과 같습니다.서버_버전, 서버_인코딩, 클라이언트_인코딩, 응용프로그램_이름, is_superuser, 세션_승인, 날짜 스타일, 간격 스타일, 시간대, integer_datetimes및standard_conforming_strings. (서버_인코딩, 시간대및integer_datetimes8.0 이전 릴리스에서는 보고되지 않았습니다.standard_conforming_strings8.1 이전 릴리스에서는 보고되지 않았습니다.간격 스타일8.4 이전 릴리스에서는 보고되지 않았습니다.응용프로그램_이름9.0 이전 릴리스에서는 보고되지 않았습니다.) 참고서버_버전, 서버_인코딩그리고integer_datetimes은 시작 후에 변경할 수 없는 의사 매개변수입니다. 이 세트는 나중에 변경되거나 구성 가능해질 수도 있습니다. 따라서 프런트엔드는 이해하지 못하거나 관심을 두지 않는 매개변수에 대해 ParameterStatus를 무시해야 합니다.
프런트엔드가 a를 발행하는 경우듣기명령을 실행하면 백엔드는 다음과 같은 상황이 발생할 때마다 알림 응답 메시지(NoticeResponse와 혼동하지 마십시오!)를 보냅니다.알림동일한 채널 이름에 대해 명령이 실행됩니다.
현재 알림 응답은 트랜잭션 외부에서만 보낼 수 있으므로 명령-응답 시리즈 중간에는 발생하지 않지만 ReadyForQuery 직전에는 발생할 수 있습니다. 그러나 이를 가정하는 프런트엔드 로직을 설계하는 것은 현명하지 않습니다. 좋은 방법은 프로토콜의 어느 지점에서나 알림 응답을 수락할 수 있다는 것입니다.
쿼리를 처리하는 동안 프런트엔드가 쿼리 취소를 요청할 수 있습니다. 취소 요청은 구현 효율성 때문에 백엔드에 대한 열려 있는 연결에서 직접 전송되지 않습니다. 우리는 쿼리 처리 중에 백엔드가 프런트엔드의 새로운 입력을 지속적으로 확인하도록 하고 싶지 않습니다. 취소 요청은 상대적으로 드물기 때문에 일반적인 경우 페널티를 피하기 위해 약간 번거롭게 처리합니다.
취소 요청을 발행하기 위해 프런트엔드는 서버에 대한 새 연결을 열고 일반적으로 새 연결을 통해 전송되는 StartupMessage 메시지 대신 CancelRequest 메시지를 보냅니다. 서버는 이 요청을 처리한 다음 연결을 닫습니다. 보안상의 이유로 취소 요청 메시지에는 직접적인 회신이 이루어지지 않습니다.
CancelRequest 메시지는 연결 시작 중 프런트엔드에 전달된 동일한 키 데이터(PID 및 비밀 키)가 포함되어 있지 않으면 무시됩니다. 요청이 현재 실행 중인 백엔드의 PID 및 비밀 키와 일치하면 현재 쿼리 처리가 중단됩니다. (기존 구현에서는 쿼리를 처리하는 백엔드 프로세스에 특수 신호를 전송하여 이를 수행했습니다.)
취소 신호는 효과가 있을 수도 있고 없을 수도 있습니다. 예를 들어 백엔드가 쿼리 처리를 마친 후에 도착하면 아무런 효과가 없습니다. 취소가 유효하면 오류 메시지와 함께 현재 명령이 조기에 종료됩니다.
이 모든 것의 결과는 보안과 효율성 모두의 이유로 프런트엔드에서 취소 요청이 성공했는지 여부를 직접 알 수 있는 방법이 없다는 것입니다. 백엔드가 쿼리에 응답할 때까지 계속 기다려야 합니다. 취소를 실행하면 현재 쿼리가 곧 완료될 확률이 높아지고 쿼리가 성공하는 대신 오류 메시지와 함께 실패할 확률도 높아집니다.
취소 요청은 일반 프런트엔드/백엔드 통신 링크를 통하지 않고 서버에 대한 새로운 연결을 통해 전송되므로 쿼리가 취소되는 프런트엔드뿐만 아니라 모든 프로세스에서 취소 요청을 발행할 수 있습니다. 이는 다중 프로세스 애플리케이션을 구축할 때 추가적인 유연성을 제공할 수 있습니다. 또한 권한이 없는 사람이 쿼리를 취소하려고 시도할 수 있다는 점에서 보안 위험이 발생합니다. 보안 위험은 취소 요청에 동적으로 생성된 비밀 키를 제공하도록 요구하여 해결됩니다.
일반적이고 정상적인 종료 절차는 프런트엔드가 종료 스포츠 토토를 보내고 즉시 연결을 닫는 것입니다. 이 스포츠 토토를 받으면 백엔드는 연결을 닫고 종료합니다.
드문 경우(관리자가 명령한 데이터베이스 종료 등)에는 프런트엔드 요청 없이 백엔드 연결이 끊어질 수 있습니다. 이러한 경우 백엔드는 연결을 닫기 전에 연결 해제 이유를 설명하는 오류 또는 알림 메시지를 보내려고 시도합니다.
다른 종료 시나리오는 한쪽 끝의 코어 덤프, 통신 링크 손실, 메시지 경계 동기화 손실 등과 같은 다양한 실패 사례에서 발생합니다. 프런트엔드 또는 백엔드에서 예기치 않은 연결 종료가 확인되면 정리하고 종료해야 합니다. 프런트엔드에는 자체 종료를 원하지 않는 경우 서버에 다시 연결하여 새 백엔드를 시작할 수 있는 옵션이 있습니다. 인식할 수 없는 메시지 유형이 수신된 경우에도 연결을 닫는 것이 좋습니다. 이는 메시지 경계 동기화가 손실되었음을 의미할 수 있기 때문입니다.
정상 또는 비정상 종료의 경우 열려 있는 모든 트랜잭션은 커밋되지 않고 롤백됩니다. 그러나 비- 동안 프런트엔드의 연결이 끊어지면 주의해야 합니다.선택쿼리가 처리 중이면 백엔드는 아마도 연결 끊김을 알기 전에 쿼리를 완료할 것입니다. 쿼리가 트랜잭션 블록 외부에 있는 경우(시작 ... 커밋시퀀스) 연결 해제가 인식되기 전에 해당 결과가 커밋될 수 있습니다.
만약PostgreSQL함께 만들어졌습니다SSL지원, 프런트엔드/백엔드 통신은 다음을 사용하여 암호화될 수 있습니다.SSL. 이는 공격자가 세션 트래픽을 캡처할 수 있는 환경에서 통신 보안을 제공합니다. 암호화에 대한 자세한 내용은포스트그레SQL다음 사용자와의 세션SSL, 참조섹션 18.9.
시작하려면SSL-암호화된 연결인 경우 프런트엔드는 처음에 StartupMessage가 아닌 SSLRequest 메시지를 보냅니다. 그런 다음 서버는 다음을 포함하는 단일 바이트로 응답합니다.S또는N, 수행할 의향이 있음 또는 수행할 의지가 없음을 나타냄SSL입니다. 프런트엔드는 응답이 만족스럽지 않으면 이 시점에서 연결을 닫을 수 있습니다. 이후에 계속하려면S, 수행SSL시작 핸드셰이크(여기에는 설명되지 않음,SSL사양)을 서버와 연결합니다. 성공하면 일반적인 StartupMessage 전송을 계속합니다. 이 경우 StartupMessage 및 모든 후속 데이터는SSL-암호화되었습니다. 이후에 계속하려면N, 일반적인 StartupMessage를 보내고 암호화 없이 진행합니다.
프런트엔드는 서버의 SSLRequest에 대한 ErrorMessage 응답을 처리할 준비도 되어 있어야 합니다. 이는 서버가 추가되기 이전인 경우에만 발생합니다.SSL지원포스트그레SQL. (이러한 서버는 현재 매우 오래되었으며 더 이상 존재하지 않을 가능성이 높습니다.) 이 경우 연결을 닫아야 하지만 프런트엔드는 새로운 연결을 열고 요청 없이 진행하도록 선택할 수 있습니다.SSL.
언제SSL암호화가 수행될 수 있으며 서버는 단일 항목만 보낼 것으로 예상됩니다.S바이트를 입력한 다음 프런트엔드가 시작될 때까지 기다립니다.SSL악수. 이 시점에서 읽을 수 있는 추가 바이트가 있다면 중간자(man-in-the-middle)가 버퍼 스터핑 공격을 시도하고 있음을 의미할 가능성이 높습니다(CVE-2021-23222). 소켓을 SSL 라이브러리로 넘기기 전에 소켓에서 정확히 1바이트를 읽거나 추가 바이트를 읽었다는 사실을 발견하면 이를 프로토콜 위반으로 처리하도록 프런트엔드를 코딩해야 합니다.
초기 SSLRequest는 CancelRequest 메시지를 보내기 위해 열려 있는 연결에서도 사용될 수 있습니다.
프로토콜 자체는 서버가 강제로 수행할 수 있는 방법을 제공하지 않지만SSL암호화를 통해 관리자는 인증 확인의 부산물로 암호화되지 않은 세션을 거부하도록 서버를 구성할 수 있습니다.