이 섹션에서는 메시지 흐름을 설명합니다. 4 개가 있습니다 상태에 따라 다른 유형의 흐름 연결 : 시작, 쿼리, 기능 호출 및 종료. 알림 응답에 대한 특별 조항도 있습니다 명령 취소. 시작 단계.
처음에는 프론트 토토 핫가 startuppacket을 보냅니다. 서버 이 정보와의 내용을 사용합니다.pg_hba.conf파일을 결정하려면 인증 방법 프론트 엔드를 사용해야합니다. 그러면 서버 다음 메시지 중 하나로 응답합니다.
서버가 즉시 연결을 닫습니다.
인증 교환이 완료되었습니다.
프론트 엔드는 Kerberos v4에 참여해야합니다. 인증 대화 상자 (여기에 설명되지 않음, 일부 Kerberos 사양) 서버와 함께. 이것이 있다면 성공적으로 서버는 Authenticationok으로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.
프론트 엔드는 Kerberos v5에 참여해야합니다. 인증 대화 상자 (여기에 설명되지 않음, 일부 Kerberos 사양) 서버와 함께. 이것이 있다면 성공적으로 서버는 Authenticationok으로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.
프론트 엔드는 PasswordPacket을 보내야합니다 Clear-Text 양식으로 비밀번호를 포함합니다. 이것이 있다면 올바른 비밀번호, 서버는 다음에 응답합니다 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.
프론트 엔드는 PasswordPacket을 보내야합니다 Crypt (3)를 통해 암호화 된 암호를 포함합니다 2에 지정된 2- 특성 소금 AuthenticationCryptPassword 패킷. 이것이라면 올바른 비밀번호, 서버는 An에서 응답합니다 Authenticationok, 그렇지 않으면 응답합니다 ErrorResponse.
프론트 엔드는 PasswordPacket을 보내야합니다 MD5를 통해 암호화 된 암호를 포함합니다 4- 특성 소금 AuthenticationMd5password 패킷. 이것이 맞다면 비밀번호, 서버는 AuthenticationOk으로 응답합니다. 그렇지 않으면 ErrorResponse로 응답합니다.
이 방법은 로컬 유닉스 도메인에만 가능합니다 SCM 자격 증명을 지원하는 플랫폼의 연결 메시지. 프론트 엔드는 SCM 자격 증명을 발행해야합니다 메시지를 보내서 단일 데이터 바이트를 보내십시오. (내용 데이터 바이트는 흥미롭지 않습니다. 익숙합니다 서버가 자격 증명 메시지.) 자격 증명이 허용되는 경우 서버는 Authenticationok으로 응답합니다 ErrorResponse로 응답합니다.
프론트 엔드가 인증 방법을 지원하지 않는 경우 서버에서 요청한 다음 즉시 닫아야합니다. 연결.
Authenticationok을받은 후, 프론트 엔드 서버에서 추가 메시지를 기다립니다. 가능 이 단계의 백엔드의 메시지는 다음과 같습니다.
이 메시지는 비밀 키 데이터를 제공합니다 취소를 발행하려면 프론트 토토 핫를 저장해야합니다. 나중에 요청합니다. 프론트 토토 핫는 이에 응답해서는 안됩니다 메시지이지만 계속 듣어야합니다 readyforquery 메시지.
시작이 완료되었습니다. 프론트 토토 핫는 이제 발행 될 수 있습니다 쿼리 또는 기능 전화 메시지.
시작이 실패했습니다. 연결이 닫힙니다 이 메시지 보내기.
경고 메시지가 발행되었습니다. 프론트 엔드 메시지를 표시하지만 계속 듣습니다 ReadyForquery 또는 ErrorResponse.
ReadyForquery 메시지는 백엔드와 동일합니다. 각 쿼리주기 후에 발행됩니다. 코딩에 따라 프론트 엔드의 필요, 고려해야 할 것이 합리적입니다 쿼리주기를 시작하는 데 readyforquery (그리고 그런 다음 BackendKeyData는 시작의 성공적인 결론을 나타냅니다 위상), 또는 신생 기업을 종식시키는 것으로 간주합니다 단계 및 각 후속 쿼리주기.
쿼리주기는 쿼리를 보내는 프론트 엔드에 의해 시작됩니다. 백엔드에 대한 메시지. 그런 다음 백엔드는 하나 이상을 보냅니다 쿼리의 내용에 따라 응답 메시지 명령 문자열과 마지막으로 ReadyForquery 응답 메시지. ReadyForquery는 프론트 엔드에게 안전하게 보낼 수 있음을 알려줍니다. 새 쿼리 또는 기능 호출.
백엔드의 가능한 응답 메시지는 다음과 같습니다.
정상적으로 완료된 SQL 명령.
백엔드는 프론트 엔드에서 데이터를 복사 할 준비가되었습니다. 테이블. 그런 다음 프론트 엔드는 카피 다타 로우를 보내야합니다 메시지. 그런 다음 백엔드는 a로 응답합니다 태그가있는 완료된 응답 메시지COPY.
백엔드는 테이블에서 데이터를 복사 할 준비가되었습니다. 프론트 엔드. 그런 다음 CopyDatarows 메시지를 보냅니다 의 태그가 포함 된 완료된 응답 메시지copy.
a에 대한 응답의 시작select, fetch, 삽입, 업데이트또는삭제쿼리. 에서fetch이름을 케이스하십시오 페치하는 커서가 메시지. 그렇지 않으면 메시지는 항상를 언급합니다."blank"커서.
행이 반환 될 것임을 나타냅니다 A에 대한 응답select또는Fetch쿼리. 메시지 내용은 설명합니다 행의 레이아웃. 다음으로 이어질 것입니다 asciirow 또는 binaryrow 메시지 (a 이진 커서가 지정되었습니다 프론트 엔드에.
빈 쿼리 문자열이 인식되었습니다.
오류가 발생했습니다.
쿼리 문자열의 처리가 완료되었습니다. 별도 쿼리 문자열이 있으므로이를 표시하기 위해 메시지가 전송됩니다. 여러 SQL 명령을 포함 할 수 있습니다. (완료된 응답 하나의 SQL 명령을 처리하는 종료가 전체 문자열.) ReadyForquery는 항상 전송됩니다 처리 처리는 성공적으로 또는 오류가 발생합니다.
경고 메시지가 질문. 통지는 다른 응답에 추가됩니다. 백토토 핫는 계속해서 명령을 처리합니다.
A에 대한 응답select또는Fetch쿼리는 일반적으로 CursorResponse로 구성됩니다. rowdescription, 0 이상의 asciirow 또는 binaryrow 메시지, 그리고 마지막으로 완료되었습니다.삽입, 업데이트및삭제쿼리는 cursorResponse를 생성 한 다음 이어집니다 완료 응답.COPY에서 또는 Frontend는 위에서 언급 한 것처럼 특수 프로토콜을 호출합니다. 다른 모든 것 쿼리 유형은 일반적으로 완성 된 응답 만 생성합니다 메시지.
쿼리 문자열에는 여러 쿼리가 포함될 수 있으므로 (세미콜론으로 분리), 그러한 반응이 몇 가지있을 수 있습니다 백엔드가 쿼리 처리를 완료하기 전에 시퀀스 끈. 전체 문자열이있을 때 ReadyForquery가 발행됩니다 처리되고 백엔드는 새 쿼리를 수락 할 준비가되었습니다. 끈.
완전히 비어있는 경우 (공백 이외의 내용 없음) 쿼리 문자열이 수신되고 응답은 emptyQueryResponse입니다 ReadyForquery가 뒤 따릅니다. (특별히 구별해야 할 필요성 이 사례는 역사적입니다.)
오류가 발생하면 ErrorResponse가 발행됩니다. readyforquery에 의해. 쿼리 문자열의 모든 추가 처리는 다음과 같습니다 ErrorResponse에 의해 중단됩니다 (더 많은 쿼리가 남아 있더라도). 이것은 순서를 통해 부분적으로 발생할 수 있습니다. 개별 쿼리에 의해 생성 된 메시지.
프론트 엔드는 ErrorResponse를 수락 할 준비를해야합니다 다른 유형이 예상 될 때마다 alicerponse 메시지 메시지의.
실제로, 주도적 인 반응이 도착할 수 있습니다 프론트 토토 핫가 어떤 종류의 메시지도 기대하지 않을 때 백토토 핫는 명목상 유휴 상태입니다. (특히 백토토 핫 부모 과정에 의해 종료되도록 명령 할 수 있습니다. 그것에 CASE는 닫기 전에 주석에 반응을 보냅니다 연결.) 프론트 토토 핫를 확인하는 것이 좋습니다. 새로운 명령을 발행하기 직전에 비동기 통지.
또한 프론트 토토 핫가 발행하는 경우듣기명령을 준비해야합니다 언제든지 NotificationResponse 메시지를 수락합니다. 보다 아래에.
권장되는 관행은 State-Machine의 Frontendend를 코딩하는 것입니다 언제든지 모든 메시지 유형을 수락하는 스타일 에 대한 가정의 배선보다는 의미가있을 수 있습니다. 정확한 메시지 순서.
기능 호출주기는 전면 엔드에 의해 시작됩니다. 백엔드에 대한 기능을하는 메시지. 그런 다음 백엔드는 하나를 보냅니다 또는 결과에 따라 더 많은 응답 메시지 기능 호출 및 마지막으로 ReadyForquery 응답 메시지. ReadyForquery는 프론트 엔드에게 안전하게 보낼 수 있음을 알려줍니다. 새 쿼리 또는 기능 호출.
백엔드의 가능한 응답 메시지는 다음과 같습니다.
오류가 발생했습니다.
함수 호출이 실행되어 반환되었습니다 결과.
함수 호출이 실행되어 반환되었습니다 결과.
함수 호출 처리가 완료되었습니다. 처리 여부에 관계없이 ReadyForquery는 항상 전송됩니다 성공적으로 종료되거나 오류가 발생합니다.
경고 메시지가 기능 호출. 통지는 다른 것도 추가됩니다 응답, 즉 백토토 핫는 계속 처리됩니다 명령.
프론트 엔드는 ErrorResponse를 수락 할 준비를해야합니다 다른 유형이 예상 될 때마다 alicerponse 메시지 메시지의. 또한 문제가 발생하면듣기명령을 준비해야합니다 언제든지 NotificationResponse 메시지를 수락합니다. 보다 아래에.
프론트 토토 핫가 A 발행하는 경우듣기명령에 따라 백토토 핫는 alkificationResponse를 보냅니다 메시지 (alicerponse와 혼동하지 말아야합니다!) a마다Notify명령이 동일하게 실행됩니다 알림 이름.
통지 응답은 어느 시점에서나 허용됩니다 다른 백토토 핫를 제외하고 프로토콜 (시작 후) 메시지. 따라서 프론트 토토 핫는 a 예상 할 때마다 NotificationResponse 메시지 메시지. 실제로, 그것은 처리 할 수 있어야합니다 NotificationResponse 메시지가 참여하지 않더라도 질문.
aNotify명령이 있습니다 이전 이름을 위해 실행듣기명령이 실행되었습니다. 알림 언제든지 전송 될 수 있습니다.
듣는 데 사용 된 이름이들을 가치가있을 수 있습니다. 그리고 명령은 이름과 관련이 없을 필요가 없습니다. SQL 데이터베이스의 관계 (테이블). 알림 이름입니다 단순히 임의로 선택한 조건 이름.
쿼리 처리 중에 프론트 토토 핫가 요청할 수 있습니다. 쿼리 취소. 취소 요청은 전송되지 않습니다 이유 때문에 백토토 핫에 대한 공개 연결에 직접 구현 효율성 : 우리는 백토토 핫를 원하지 않습니다 지속적으로 프론트 토토 핫에서 새로운 입력을 확인합니다 쿼리 처리. 취소 요청은 비교적이어야합니다 드물게, 우리는 그들을 약간 번거롭게 만듭니다. 정상적인 경우 형벌을 피하십시오.
취소 요청을 발행하려면 Frontend가 새로 열립니다. 서버에 연결하고 CancelRequest 메시지를 보냅니다. 일반적으로 STARTUPPACKET 메시지보다는 새로운 연결을 통해 보냈습니다. 서버는 이것을 처리합니다 요청한 다음 연결을 닫습니다. 보안상의 이유로, 아니요 취소 요청 메시지에 대한 직접 답장이 이루어집니다.
ConcelRequest 메시지가 포함되지 않으면 무시됩니다 동일한 키 데이터 (PID 및 비밀 키)가 프론트 엔드로 전달되었습니다. 연결 시동 중. 요청이 PID와 일치하는 경우 현재 실행중인 백엔드, 처리에 대한 비밀 키 현재 쿼리가 중단되었습니다. (기존 구현에서 이것은 백엔드 프로세스에 특수 신호를 보내어 수행됩니다. 쿼리 처리입니다.)
취소 신호는 어떤 영향을 미칠 수도 있고 아닐 수도 있습니다 --- 예를 들어 백엔드가 완료된 후 도착하면 쿼리를 처리하면 효과가 없습니다. 만약 취소가 효과적이며 현재 명령을 초래합니다 오류 메시지로 일찍 종료됩니다.
이 모든 것의 상향은 두 보안의 이유로 그리고 효율성, 프론트 엔드는 취소 요청이 성공했습니다. 계속 기다려야합니다 쿼리에 응답하는 백엔드. 간단히 취소 현재 쿼리가 곧 완료 될 확률을 향상시키고 오류 메시지로 실패 할 확률이 향상됩니다. 성공하는 대신.
취소 요청이 새로운 연결을 통해 전송되기 때문에 정규 프론트 토토 핫/백토토 핫가 아닌 서버 통신 링크, 취소 요청이 가능합니다. 쿼리가있는 프론트 토토 핫뿐만 아니라 모든 프로세스에 의해 발행됩니다. 취소됩니다. 이것은 유연성의 이점이있을 수 있습니다 다중 프로세스 응용 프로그램 구축. 또한 a 승인되지 않은 사람이 취소하려고 할 수있는 보안 위험 쿼리. 보안 위험은 a 취소 중에 제공 할 비밀 키를 동적으로 생성합니다 요청.
정상적이고 우아한 종료 절차는 그 것입니다 프론트 토토 핫는 종료 메시지를 보내고 즉시 닫습니다 연결. 메시지를 받으면 즉시 백토토 핫가 있습니다 연결을 닫고 종료합니다.
소프트웨어 고장으로 인해 격렬한 종료가 발생할 수 있습니다 양쪽 끝에서 (즉, 코어 덤프). 프론트 엔드 또는 백엔드 인 경우 연결의 예기치 않은 폐쇄를 봅니다. 위로 그리고 종료하십시오. 프론트 엔드는 a 원하지 않는 경우 서버를 다시 연락하여 새로운 백엔드 스스로 종료.
정상 또는 비정상 종료의 경우, 개방 거래는 롤백되어 커밋되지 않습니다. 주목해야합니다 그러나 쿼리가있는 동안 프론트 엔드가 연결이 끊어지면 처리 된 백엔드는 이전에 쿼리를 완료 할 것입니다 단절을 알아 차립니다. 쿼리가 외부에있는 경우 트랜잭션 블록 (시작 ... 커밋시퀀스) 그러면 결과 일 수 있습니다 단절이 인식되기 전에 커밋되었습니다.
최근 릴리스postgresql프론트 토토 핫/백토토 핫 허용 SSL을 사용하여 암호화 할 커뮤니케이션. 이것은 제공합니다 공격자가있을 수있는 환경에서의 커뮤니케이션 보안 세션 트래픽을 캡처 할 수 있습니다.
SSL 암호화 연결을 시작하려면 프론트 엔드 처음에는 a가 아닌 sslrequest 메시지를 보냅니다 startuppacket. 그런 다음 서버는 단일 바이트로 응답합니다 포함y또는nSSL을 각각 수행하십시오. 프론트 토토 핫가 닫을 수 있습니다 이 시점에서 연결이 불만족하면 응답. 계속하려면y, 수행 SSL 스타트 업 핸드 셰이크 (여기에 설명되지 않음, SSL의 일부 사양) 서버. 이것이 성공하면 계속하십시오 일반적인 startuppacket을 전송합니다. 이 경우 startuppacket 및 모든 후속 데이터는 SSL 암호화됩니다. 에게 계속 계속n, 평소를 보내십시오 startuppacket 및 암호화없이 진행하십시오.
프론트 엔드도 처리 할 준비를해야합니다 서버에서 sslrequest에 대한 errormessage 응답. 이것은 할 것입니다 서버가 SSL 지원 추가를 선행하는 경우에만 발생합니다. 에게PostgreSQL. 이 경우 연결은 닫아야하지만 프론트 토토 핫는 새로운 연결을 열고 SSL을 요청하지 않고 진행하십시오.
초기 sslrequest도 다음과 관련하여 사용될 수 있습니다. CancelRequest 메시지를 보내기 위해 열리고 있습니다.
프로토콜 자체가 SSL 암호화를 강제로 제공하면 관리자가 구성 할 수 있습니다 암호화되지 않은 세션을 부산물로 거부하는 서버 인증 점검.