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