PostgreSQLa 프론트 엔드와의 통신을위한 메시지 기반 프로토콜 백엔드 (클라이언트 및 서버). 프로토콜이 지원됩니다TCP/IP그리고 또한 유닉스 도메인 소켓. 포트 번호 5432에 등록되었습니다 이를 지원하는 서버의 관례 TCP 포트 번호로 IANA 프로토콜이지만 실제로는 불리한 포트 번호가 사용된.
이 문서는 배트맨 토토의 버전 3.0을 설명합니다. 구현PostgreSQL7.4 그리고 나중에. 이전 프로토콜 버전에 대한 설명은 참조하십시오 이전 릴리스PostgreSQL문서. 단일 서버 여러 프로토콜 버전을 지원할 수 있습니다. 초기 STARTUP-Request 메시지는 서버에게 어떤 프로토콜 버전을 알려줍니다 클라이언트가 사용하려고 시도한 다음 서버가 다음을 따릅니다. 가능하다면 프로토콜.
이 배트맨 토토을 기반으로 한 높은 레벨 기능 (예 : 어떻게libpq특정 환경을 통과합니다 연결이 설정된 경우 변수) 다른 곳.
여러 클라이언트를 효율적으로 서비스하기 위해 서버 새로운 출시"백엔드"프로세스 각 고객. 현재 구현에서 새로운 아동 프로세스 들어오는 연결이 감지 된 직후에 생성됩니다. 그러나 이것은 프로토콜에 투명합니다. 목적을 위해 프로토콜, 용어"백엔드"and"Server"교환 가능합니다. 비슷하게"배트맨 토토"and"클라이언트"상호 교환 가능합니다.
프로토콜에는 시작 및 정상에 대한 별도의 단계가 있습니다 작업. 시작 단계에서 프론트 엔드는 a 서버에 연결하고 자체를 인증합니다 서버의 만족. (이것은 단일이 포함될 수 있습니다 인증에 따라 메시지 또는 여러 메시지 사용중인 방법.) 모든 것이 잘 진행되면 서버가 보냅니다. 프론트 엔드에 대한 지위 정보, 마지막으로 정상으로 들어갑니다 작업. 초기 스타트 업 요청 메시지를 제외하고는이입니다 프로토콜의 일부는 서버에 의해 구동됩니다.
정상 작동 중에 프론트 엔드는 쿼리를 보냅니다 백엔드에 대한 다른 명령 및 백엔드는 쿼리를 다시 보냅니다. 결과 및 기타 응답. 몇 가지 사례가 있습니다 (예 :Notify) 백엔드가 보낼 때 원치 않는 메시지이지만 대부분의 경우이 부분은 세션은 프론트 엔드 요청에 의해 주도됩니다.
세션 종료는 일반적으로 Frontend Choice에 의해 이루어집니다. 그러나 어떤 경우에는 백엔드에 의해 강요 될 수 있습니다. 어쨌든 백엔드가 연결을 닫으면 롤백됩니다. 종료하기 전의 (불완전한) 거래.
정상 작동 내에서 SQL 명령을 실행할 수 있습니다 두 개의 하위 배트맨 토토 중 하나를 통해. 에서"간단한 쿼리"배트맨 토토, 프론트 엔드가 방금 보냅니다 텍스트 쿼리 문자열은 즉시 구문 분석됩니다 백엔드에 의해 실행되었습니다. 에서"확장 질문"배트맨 토토, 쿼리 처리가 분리됩니다 다중 단계 : 구문 분석, 매개 변수 값의 바인딩 및 실행. 이것은 유연성과 성능 이점을 제공합니다 추가 복잡성 비용.
정상 작동에는 특별한 추가 서브 배트맨 토토이 있습니다 와 같은 작업COPY.
모든 커뮤니케이션은 메시지 흐름을 통해 이루어집니다. 그만큼 메시지의 첫 바이트는 메시지 유형을 식별합니다. 다음 4 바이트는 메시지의 나머지 길이를 지정합니다. (이 길이 수에는 자체가 포함되어 있지만 메시지 유형은 아닙니다 바이트). 메시지의 나머지 내용은 결정됩니다 메시지 유형에 따라. 역사적 이유로 첫 번째 클라이언트 (시작 메시지)가 보낸 메시지는 없습니다. 초기 메시지 유형 바이트.
메시지 스트림과 동기화를 잃지 않도록 서버와 클라이언트는 일반적으로 전체 메시지를 읽습니다 시도하기 전에 버퍼 (바이트 카운트 사용)로 내용을 처리하십시오. 오류가 발생하면 쉽게 복구 할 수 있습니다 내용을 처리하는 동안 감지됩니다. 극단적으로 상황 (예 : 버퍼링에 대한 메모리가 충분하지 않은 것과 같은 메시지), 수신기는 바이트 카운트를 사용하여 결정할 수 있습니다. 읽기가 재개되기 전에 건너 뛰는 입력의 양 메시지.
반대로, 서버와 클라이언트는 결코주의를 기울여야합니다 불완전한 메시지를 보내기 위해. 이것은 일반적으로 수행됩니다 시작하기 전에 버퍼에 전체 메시지를 마샬링합니다. 보내십시오. 커뮤니케이션 실패가 발생하는 경우 메시지를 보내거나받는 것은 유일한 현명한 응답은 희망이 거의 없기 때문에 연결을 포기하는 것 메시지마다 동기화 복구.
확장 쿼리 프로토콜에서 SQL 명령의 실행 여러 단계로 나뉩니다. 국가는 그 사이에 유지되었습니다 단계는 두 가지 유형의 객체로 표시됩니다.준비된 진술and포털. 준비된 진술은 구문 분석, 시맨틱 분석 및 계획의 결과 텍스트 쿼리 문자열. 준비된 진술이 반드시는 아닙니다 실행 준비,에 대한 특정 값이 부족할 수 있으므로매개 변수. 포털은 a를 나타냅니다 즉시 실행 가능 또는 이미 입증 된 진술, 누락 된 매개 변수 값이 채워져 있습니다. (forselect진술, 포털은 동등합니다 열린 커서이지만 우리는 그 이후로 다른 용어를 사용하도록 선택합니다. 커서는 비 처리하지 않습니다select진술.)
전체 실행주기는 A로 구성됩니다.Parse준비를 만듭니다 텍스트 쿼리 문자열의 문; 에이bindStep, 주어진 포털을 만듭니다 필요한 매개 변수에 대한 준비된 진술 및 값; 그리고execute포털을 실행하는 단계 질문. 행을 반환하는 쿼리의 경우 (select, show등), 실행 단계는 제한된 숫자 만 가져 오라고 말할 수 있습니다. 여러 실행 단계가 필요할 수 있도록 행의 작업을 완료하십시오.
백엔드는 여러 준비된 진술을 추적 할 수 있습니다 그리고 포털 (그러나 세션 내에 만 존재한다는 점에 유의하십시오. 세션에서 공유되지 않습니다). 기존 준비 진술과 포털은 언제 지정된 이름으로 참조됩니다 그들은 창조되었습니다. 또한"이름없는"준비된 진술과 포털이 존재합니다. 이것들은 이름이 지정된 객체와 거의 동일하게 행동하지만 그들에 대한 운영은 한 번만 쿼리 한 다음 버려지는 반면 이름이 지정된 객체는 다중의 기대에 따라 최적화됩니다 사용.
특정 데이터 유형의 데이터가 전송 될 수 있습니다. 몇 가지 다른형식. 기준PostgreSQL7.4 유일한 것 지원되는 형식은"텍스트"and"바이너리"이지만 프로토콜이 만듭니다 향후 확장을위한 조항. 원하는 형식 값은 A에 의해 지정됩니다.형식 코드. 클라이언트는 전송 된 각각의 형식 코드를 지정할 수 있습니다 매개 변수 값 및 각 쿼리 결과 열에 대해. 텍스트 형식 코드 Zero가 있고 Binary에는 형식 코드 1이 있으며 다른 형식 코드는 향후 정의를 위해 예약되어 있습니다.
값의 텍스트 표현은 문자열이 무엇이든간에 있습니다 입력/출력 변환에 의해 생성 및 허용됩니다 특정 데이터 유형의 기능. 전송에서 표현, 후행 널 캐릭터는 없습니다. 그만큼 프론트 엔드는 원하는 경우 수신 값에 하나를 추가해야합니다. 그것들을 C 줄로 처리하십시오. (텍스트 형식은 허용되지 않습니다 그건 그렇고 내재 된 널.)
정수에 대한 이진 표현은 네트워크 바이트 순서를 사용합니다 (가장 중요한 바이트는 먼저). 다른 데이터 유형에 대해서는 참조하십시오 이진에 대해 배우는 문서 또는 소스 코드 대표. 이진 표현을 명심하십시오 복잡한 데이터 유형은 서버 버전에서 변경 될 수 있습니다. 그만큼 텍스트 형식은 일반적으로 더 휴대용 선택입니다.