이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
당신은 다음과 같은 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

4.2. 프로토콜

이 섹션에서는 메시지 흐름을 설명합니다. 4개가 있다 상태에 따라 다양한 흐름 연결: 시작, 쿼리, 함수 호출 및 종료. 알림 응답에 대한 특별 조항도 있습니다. 명령 취소는 명령 실행 후 언제든지 발생할 수 있습니다. 시작 단계.

4.2.1. 시작

처음에는 프런트엔드가 StartupPacket을 보냅니다. 서버 이 정보와 내용을 사용합니다.pg_hba.conf파일을 통해 무엇을 결정하는지 프런트엔드에서 사용해야 하는 인증 방법입니다. 그러면 서버는 다음 메시지 중 하나로 응답합니다.

오류응답

그러면 서버는 즉시 연결을 종료합니다.

인증확인

인증 교환이 완료되었습니다.

인증KerberosV4

프런트엔드는 Kerberos V4에 참여해야 합니다. 인증 대화 상자(여기서는 설명되지 않음, Kerberos 사양)을 서버와 연결합니다. 이것이라면 성공하면 서버는 Au사설 토토enticationOk로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.

인증KerberosV5

프런트엔드는 Kerberos V5에 참여해야 합니다. 인증 대화 상자(여기서는 설명되지 않음, Kerberos 사양)을 서버와 연결합니다. 이것이라면 성공하면 서버는 Au사설 토토enticationOk로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.

인증일반텍스트비밀번호

프런트엔드는 PasswordPacket을 보내야 합니다 일반 텍스트 형식으로 비밀번호를 포함합니다. 이것이라면 올바른 비밀번호를 입력하면 서버는 다음과 같이 응답합니다. 인증Ok, 그렇지 않으면 다음과 같이 응답합니다. 오류응답.

인증암호비밀번호

프런트엔드는 PasswordPacket을 보내야 합니다 crypt(3)를 통해 암호화된 비밀번호를 포함하고 있습니다. 에 지정된 2자리 소금 AuthenticationCryptPassword 패킷입니다. 이것이라면 비밀번호가 정확하면 서버가 다음과 같이 응답합니다. 인증Ok, 그렇지 않으면 다음과 같이 응답합니다. 오류응답.

인증MD5비밀번호

프런트엔드는 PasswordPacket을 보내야 합니다 MD5를 통해 암호화된 비밀번호가 포함되어 있습니다. 에 지정된 4자리 소금 Au사설 토토enticationMD5Password 패킷입니다. 이것이 맞다면 비밀번호를 입력하면 서버가 인증으로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.

인증SCMCcredential

이 방법은 로컬 Unix 도메인에서만 가능합니다 SCM 자격 증명을 지원하는 플랫폼에서의 연결 메시지. 프런트엔드는 SCM 자격 증명을 발급해야 합니다. 메시지를 보낸 다음 단일 데이터 바이트를 보냅니다. (내용은 데이터 바이트의 내용은 흥미롭지 않습니다. 그것은 단지 익숙하다 서버가 메시지를 받을 때까지 충분히 기다려야 하는지 확인하세요. 자격 증명 메시지.) 자격 증명이 허용되는 경우 서버는 AuthenticationOk로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.

프런트엔드가 인증 방법을 지원하지 않는 경우 서버에서 요청하면 즉시 닫혀야 합니다. 연결.

인증을 받은 후 프런트엔드는 다음을 수행해야 합니다. 서버에서 추가 메시지를 기다립니다. 가능한 이 단계에서 백엔드의 메시지는 다음과 같습니다.

백사설 토토키데이터

이 메시지는 비밀 키 데이터를 제공합니다. 취소를 실행하려면 프런트사설 토토를 저장해야 합니다. 나중에 요청하세요. 프런트사설 토토는 이에 응답해서는 안 됩니다. 메시지를 계속 들어야 합니다. ReadyForQuery 메시지입니다.

ReadyForQuery

시작이 완료되었습니다. 이제 프런트사설 토토에서 문제가 발생할 수 있습니다. 쿼리 또는 함수 호출 메시지.

오류응답

시작에 실패했습니다. 다음 이후에 연결이 종료됩니다. 이 메시지를 보냅니다.

공지응답

경고 메시지가 발행되었습니다. 프런트엔드는 다음과 같이 해야 합니다. 메시지를 표시하지만 계속 듣고 있습니다. ReadyForQuery 또는 ErrorResponse.

ReadyForQuery 메시지는 백엔드와 동일합니다 각 쿼리 주기 후에 발행됩니다. 코딩에 따라 프론트엔드의 요구 사항을 고려하는 것이 합리적입니다. 쿼리 주기를 시작하는 ReadyForQuery(그런 다음 BackendKeyData는 시작이 성공적으로 완료되었음을 나타냅니다. 단계) 또는 ReadyForQuery를 시작 종료로 간주합니다. 단계 및 각 후속 쿼리 주기.

4.2.2. 쿼리

쿼리 주기는 쿼리를 보내는 프런트엔드에 의해 시작됩니다. 백엔드에 메시지를 보냅니다. 그러면 백엔드는 하나 이상의 메시지를 보냅니다. 쿼리 내용에 따른 응답 메시지 명령 문자열, 마지막으로 ReadyForQuery 응답 메시지입니다. ReadyForQuery는 프런트엔드에 안전하게 메시지를 보낼 수 있음을 알립니다. 새로운 쿼리 또는 함수 호출.

백엔드에서 가능한 응답 메시지는 다음과 같습니다:

완료응답

SQL 명령이 정상적으로 완료되었습니다.

CopyInResponse

백엔드가 프런트엔드에서 프런트엔드로 데이터를 복사할 준비가 되었습니다. 테이블. 그런 다음 프런트엔드는 CopyDataRows를 보내야 합니다. 메시지. 그러면 백엔드는 다음과 같이 응답합니다. 태그가 포함된 CompletedResponse 메시지복사.

CopyOutResponse

백엔드가 테이블에서 테이블로 데이터를 복사할 준비가 되었습니다. 프론트엔드. 그런 다음 CopyDataRows 메시지를 보낸 다음 태그가 있는 CompletedResponse 메시지복사.

커서응답

a에 대한 응답의 시작선택, 가져오기, 삽입, 업데이트또는삭제질의. 에서가져오기케이스 페치되는 커서의 이름이 메시지. 그렇지 않으면 메시지에 항상 다음이 언급됩니다."공백"커서.

행설명

행이 곧 반환될 것임을 나타냅니다. a에 대한 응답선택또는가져오기질의. 메시지 내용은 행의 레이아웃을 설명합니다. 이것은 그 뒤에는 AsciiRow 또는 BinaryRow 메시지가 옵니다(에 따라 다름). 각 행에 대한 바이너리 커서 지정 여부) 프런트엔드로 반환됩니다.

EmptyQueryResponse

빈 쿼리 문자열이 인식되었습니다.

오류응답

오류가 발생했습니다.

ReadyForQuery

쿼리 문자열 처리가 완료되었습니다. 별도의 쿼리 문자열이 이를 나타내기 위해 메시지가 전송됩니다. 여러 SQL 명령이 포함될 수 있습니다. (완료응답 하나의 SQL 명령 처리가 끝났음을 표시합니다. 전체 문자열.) ReadyForQuery는 항상 전송됩니다. 처리가 성공적으로 종료되었거나 오류가 발생했습니다.

공지응답

다음과 관련하여 경고 메시지가 발행되었습니다. 쿼리. 통지는 다른 응답에 추가됩니다. 즉, 백엔드는 명령을 계속 처리합니다.

a에 대한 응답선택또는가져오기쿼리는 일반적으로 다음으로 구성됩니다. CursorResponse, RowDescription, 0개 이상의 AsciiRow 또는 BinaryRow 메시지, 그리고 마지막으로 CompletedResponse.삽입, 업데이트삭제쿼리는 CursorResponse를 생성합니다. CompletedResponse가 뒤따릅니다.복사에 또는 프런트엔드에서 언급한 대로 특수 프로토콜을 호출합니다. 위. 다른 모든 쿼리 유형은 일반적으로 CompletedResponse 메시지입니다.

쿼리 문자열에는 여러 쿼리가 포함될 수 있으므로 (세미콜론으로 구분), 그러한 응답이 여러 개 있을 수 있습니다. 백엔드가 쿼리 처리를 완료하기 전의 시퀀스 문자열. ReadyForQuery는 전체 문자열이 완료되면 발행됩니다. 처리되었으며 백엔드가 새 쿼리를 수락할 준비가 되었습니다. 문자열.

완전히 비어 있는 경우(공백 이외의 내용 없음) 쿼리 문자열이 수신되면 응답은 EmptyQueryResponse입니다. 그 다음에는 ReadyForQuery가 있습니다. (특별히 구별할 필요가 있음 이 사건은 역사적 사건입니다.)

오류 발생 시 ErrorResponse가 발행됩니다. ReadyForQuery로. 쿼리 문자열의 모든 추가 처리는 다음과 같습니다. ErrorResponse에 의해 중단되었습니다(더 많은 쿼리가 남아 있더라도). 이는 시퀀스 도중에 발생할 수 있습니다. 개별 쿼리로 생성된 메시지입니다.

프런트사설 토토는 ErrorResponse를 수용할 준비가 되어 있어야 하며 다른 유형이 필요할 때마다 알림 응답 메시지 메시지.

Actually, it is possible for NoticeResponse to arrive even when 사설 토토e frontend is not expecting any kind of message, 사설 토토at is, 사설 토토e backend is nominally idle. (In particular, 사설 토토e backend can be commanded to terminate by its parent process. In 사설 토토at case it will send a NoticeResponse before closing 사설 토토e connection.) It is recommended 사설 토토at 사설 토토e frontend check for such asynchronous notices just before issuing any new command.

또한 프런트사설 토토에서 문제가 발생하는 경우듣기명령을 내린 다음에는 다음을 수행할 준비가 되어 있어야 합니다. 언제든지NotificationResponse 메시지를 수락합니다. 참조 아래.

권장되는 방법은 상태 머신에서 프런트사설 토토를 코딩하는 것입니다. 언제든지 모든 메시지 유형을 허용하는 스타일 에 대한 가정을 연결하는 것보다 의미가 있을 수 있습니다. 정확한 메시지 순서.

4.2.3. 함수 호출

함수 호출 주기는 프런트엔드가 다음을 전송하여 시작됩니다. 백엔드에 대한 FunctionCall 메시지입니다. 그런 다음 백엔드는 하나를 보냅니다. 또는 결과에 따라 더 많은 응답 메시지 함수 호출, 마지막으로 ReadyForQuery 응답 메시지입니다. ReadyForQuery는 프런트엔드에 안전하게 메시지를 보낼 수 있음을 알립니다. 새로운 쿼리 또는 함수 호출.

백엔드에서 가능한 응답 메시지는 다음과 같습니다:

오류응답

오류가 발생했습니다.

함수결과응답

함수 호출이 실행되었으며 다음을 반환했습니다. 결과.

함수VoidResponse

함수 호출이 실행되었으며 no를 반환했습니다. 결과.

ReadyForQuery

함수 호출 처리가 완료되었습니다. ReadyForQuery는 처리 여부에 관계없이 항상 전송됩니다. 성공적으로 종료되었거나 오류가 발생했습니다.

공지응답

다음과 관련하여 경고 메시지가 발행되었습니다. 함수 호출. 공지 사항은 기타 사항에 추가됩니다. 즉, 백엔드는 계속해서 응답을 처리합니다. 명령.

프런트사설 토토는 ErrorResponse를 수용할 준비가 되어 있어야 하며 다른 유형이 필요할 때마다 알림 응답 메시지 메시지. 또한 문제가 발생하는 경우듣기명령을 내린 다음에는 다음을 수행할 준비가 되어 있어야 합니다. 언제든지NotificationResponse 메시지를 수락합니다. 참조 아래.

4.2.4. 알림 응답

프런트사설 토토가 a를 발행하는 경우듣기명령을 실행하면 백사설 토토가 알림 응답을 보냅니다. 메시지(NoticeResponse와 혼동하지 마십시오!)알림명령은 다음에 대해 실행됩니다. 동일한 알림 이름입니다.

알림 응답은 언제든지 허용됩니다. 프로토콜(시작 후), 다른 백엔드 내 제외 메시지. 따라서 프런트엔드는 다음을 인식할 수 있도록 준비해야 합니다. 알림 응답 메시지가 나타날 때마다 메시지. 실제로 처리할 수 있어야 합니다. 참여하지 않은 경우에도 알림 응답 메시지가 표시됩니다. 쿼리.

알림응답

A 알림명령이 수행되었습니다. 이전의 이름에 대해 실행됨듣기명령이 실행되었습니다. 알림 언제든지 보낼 수 있습니다.

listen에 사용된 이름은 지적할 가치가 있습니다. 통지 명령은 이름과 관련이 있을 필요가 없습니다. SQL 데이터베이스의 관계(테이블). 알림 이름은 다음과 같습니다. 단순히 임의로 선택한 조건 이름입니다.

4.2.5. 진행 중인 요청 취소 중

쿼리를 처리하는 동안 프런트엔드에서 요청할 수 있습니다. 쿼리 취소. 취소 요청이 전송되지 않았습니다 다음과 같은 이유로 백엔드에 대한 열린 연결에서 직접 구현 효율성: 우리는 백엔드를 갖고 싶지 않습니다 작업하는 동안 프런트엔드에서 새로운 입력을 지속적으로 확인합니다. 쿼리 처리. 취소 요청은 상대적으로 이루어져야 합니다. 자주 발생하지 않으므로 약간 번거롭게 만듭니다. 일반적인 경우에는 페널티를 피하십시오.

취소 요청을 발행하기 위해 프런트엔드는 새 서버에 연결하고 CancelRequest 메시지를 보냅니다. 일반적으로 발생하는 StartupPacket 메시지 대신 새로운 연결을 통해 전송되었습니다. 서버가 이를 처리합니다. 요청한 다음 연결을 닫습니다. 보안상의 이유로 취소요청 메시지에는 직접 회신드립니다.

CancelRequest 메시지는 다음 내용이 포함되어 있지 않으면 무시됩니다. 프런트엔드에 전달된 동일한 키 데이터(PID 및 비밀 키) 연결 시작 중. 요청이 PID와 일치하는 경우 현재 실행 중인 백엔드의 비밀 키, 처리 현재 쿼리가 중단되었습니다. (기존 구현에서는 이는 백엔드 프로세스에 특수 신호를 전송하여 수행됩니다. 쿼리를 처리하고 있습니다.)

취소 신호는 효과가 있을 수도 있고 없을 수도 있습니다 --- 예를 들어 백엔드가 완료된 후에 도착하는 경우 쿼리를 처리하면 아무 효과가 없습니다. 만약 취소가 유효하면 현재 명령이 실행됩니다. 오류 메시지와 함께 조기 종료됩니다.

이 모든 것의 결과는 보안상의 이유로 효율성 측면에서는 프런트엔드에서 직접 여부를 알 수 있는 방법이 없습니다. 취소 요청이 성공했습니다. 계속해서 기다려야 한다 쿼리에 응답하는 백엔드. 간단히 취소 발행 현재 쿼리가 곧 완료될 확률이 향상됩니다. 오류 메시지와 함께 실패할 확률이 높아집니다. 성공하는 대신.

취소 요청이 새로운 연결을 통해 다음으로 전송되었기 때문에 일반 프런트엔드/백엔드가 아닌 서버 통신 링크에서는 취소 요청이 가능합니다. 쿼리를 수행하는 프런트엔드뿐만 아니라 모든 프로세스에서 발행됩니다. 취소됩니다. 이는 유연성의 이점을 가질 수 있습니다. 다중 프로세스 애플리케이션 구축. 그것은 또한 승인되지 않은 사람이 취소를 시도할 수 있다는 보안 위험 쿼리. 보안 위험은 다음을 요구하여 해결됩니다. 취소 시 제공될 동적으로 생성된 비밀 키 요청합니다.

4.2.6. 종료

정상적이고 정상적인 종료 절차는 다음과 같습니다. 프론트엔드는 Terminate 메시지를 보내고 즉시 닫힙니다. 연결. 메시지를 받으면 백엔드는 즉시 연결을 닫고 종료합니다.

소프트웨어 오류로 인해 비정상 종료가 발생할 수 있습니다. (즉, 코어 덤프). 프런트사설 토토나 백사설 토토 중 하나인 경우 연결이 예기치 않게 종료된 것을 확인하면 연결이 정리되어야 합니다. 올리고 종료합니다. 프론트사설 토토에는 원하지 않는 경우 서버에 다시 연결하여 새 백사설 토토 스스로 종료합니다.

정상 또는 비정상 종료의 경우 열려 있는 모든 트랜잭션은 커밋되지 않고 롤백됩니다. 주목해야 할 점 그러나 쿼리가 진행되는 동안 프런트엔드 연결이 끊어지면 처리되면 백엔드는 아마도 이전에 쿼리를 완료할 것입니다. 연결이 끊어진 것을 알아차립니다. 쿼리가 외부에 있는 경우 거래 블록(시작 ... 커밋시퀀스) 결과는 다음과 같습니다. 연결 끊김이 인식되기 전에 커밋됩니다.

4.2.7. SSL 세션 암호화

최근 릴리스PostgreSQL프런트엔드/백엔드 허용 SSL을 사용하여 통신을 암호화합니다. 이는 다음을 제공합니다 공격자가 있을 수 있는 환경에서의 통신 보안 세션 트래픽을 캡처할 수 있습니다.

SSL 암호화 연결을 시작하려면 프런트엔드 처음에는 SSLRequest 메시지가 아닌 SSLRequest 메시지를 보냅니다. StartupPacket. 그런 다음 서버는 단일 바이트로 응답합니다. 포함Y또는N, 의향이 있음 또는 의향이 없음을 나타냄 SSL을 각각 수행합니다. 프런트엔드가 만족스럽지 않다면 이 시점에서 연결을 끊으세요. 응답. 이후에 계속하려면Y, 수행하다 SSL 시작 핸드셰이크(여기서는 설명되지 않음, SSL의 일부) 사양) 서버와 함께. 성공하면 계속하세요 일반적인 StartupPacket을 전송합니다. 이 경우에는 StartupPacket 및 모든 후속 데이터는 SSL로 암호화됩니다. 받는 사람 이후 계속N, 평소대로 보내세요 StartupPacket을 실행하고 암호화 없이 진행합니다.

프런트엔드는 또한 다음을 처리할 준비가 되어 있어야 합니다. 서버의 SSLRequest에 대한 ErrorMessage 응답입니다. 이것은 서버가 SSL 지원을 추가하기 이전인 경우에만 발생합니다. 에PostgreSQL. 이 경우 연결은 닫혀야 하지만 프런트엔드는 다음을 선택할 수 있습니다. 새로운 연결을 열고 SSL을 요청하지 않고 진행하세요.

초기 SSLRequest는 다음 연결에서도 사용될 수 있습니다. CancelRequest 메시지를 보내기 위해 열려 있습니다.

프로토콜 자체는 다음을 위한 방법을 제공하지 않지만 서버가 SSL 암호화를 강제하도록 하려면 관리자가 구성할 수 있습니다. 서버는 암호화되지 않은 세션을 부산물로 거부합니다. 인증 확인 중입니다.