2008년 12월 21일 일요일

MySQL통신프로토콜 - 인증시의 패킷1

인증시의 패킷
인증시에는  다음과 같은 패킷을 주고 받는다. 

클라이언트                                                                서버
       ---------TCP또는 소켓통신------------------>
      <-------①Handshake Initialization Packet-----
       --------②Client Authentication Packet ------>
     <--------③Ok Packet 또는  ④Error Packet ----

※패킷헤더 
처음, 패킷헤더에 대해서 설명해 본다. 
패킷헤더라는 것은 모든 패킷의 선두에 할당되는 영역으로 4바이트로 구성된다. 
선두3바이트가 패킷의 길이(패킷헤더 길이는 빼고), 1바이트가 패킷의 연번이다. 
예를들어 Handshake Initialization Packet에서는 ox41 00 00 =65(10진수)이면 Handshake Initialization Packet의 총 바이트수가 65바이트라는 것을 의미한다. 
패킷의 내용은 전부 16진수로 표기한다. 

이 패킷길이처럼 수치를 16진수로 표현하는 게 있으면 문자열을 16진수로 표현하는 것이 있다. 
수치표현의 경우에는 전부 little endian이다. 
패킷번호는 00으로 시작해서 왔다갔다 할때마다 1개씩 증가한다. 
새로운 명령이 되면 또 00부터 번호가 할당된다.  클라이언트에서 1패킷보내면 서버에서 복수의 패킷이 되돌아오는 것도 있기 때문에 (검색할 때등) 그럴 때 사용하는 연번이다. 

3바이트는 24비트이기 때문에 다룰 수 있는 수치의 최대값은 16,777,215바이트(약 16MB)가 된다.  LONGTEXT형등의 거대한 필드에서는 열 크기가 이것을 넘는 경우도 있지만 그럴 때에는 다음처럼 2개이상의 패킷에 걸쳐서 송수신된다. 

FF FF FF 00 ...
FF FF FF 01 ...
13 01 00 02 ... 

패킷의 크기가 「0xFF FF FF」의 경우에는 그 패킷이 16MB이상의 되기 때문에 1패킷으로는 완결되지 못하고 후속의 패킷에 계속됨을 알려주고 있다.  이  경우에는 1개의 논리 패킷이 3개의 물리적인 패킷에 걸쳐져 있게 된다.