Skip to main content
Version: 0.8.0

Networking

The Skyhash protocol uses a very simple data exchange model.

This is for version 0.8.0!

This information on networking only corresponds to Skytable 0.8.0 (Octave). If you're using a different version consider looking for the appropriate document.

We use three connection stages:

  • Client handshake: The client sends a handshake packet
    • The handshake contains all necessary information to successfully establish a connection
    • The structure of the client handshake depends on the authentication plugin in use (since authentication data has to be exchanged before the connection can be established)
    • For the pwd plugin the client handshake looks like this:
      H00000<username length>\n<password length>\n<username><password>
  • Server handshake:
    • Accepted: If the server accepts the handshake information then it will respond with: H000
    • Rejected: If the server rejects the handshake information then it will respond with H01<8-bit error code>. You can find out what happened using the error code index
  • Data exchange: This is where the client and server exchange data

How to communicate:

  • Open a TCP connection to the server
  • Do the handshake (as described above) and handle any errors
  • Encode queries as described below

Client​

Data types​

The client side needs to send encoded data types to the server (in the form of parameters) so that the server can process them.

Types:

  • Null: Encoded as 0
  • Bool: Encoded as 1<0 or 1>\n
  • Unsigned integer: A 64-bit unsigned integer. Encoded as 2<integer>\n
  • Signed integer: A 64-bit unsigned integer. Encoded as 3<integer>\n
  • Float: A 64-bit (double precision) floating point value. Encoded as 4<float>\n
  • Binary: A binary blob. Encoded as 5<size>\n<payload>
  • String: An UTF-8 string. Encoded as 6<size>\n<payload>

Queries​

A query has three sections:

  • The metaframe:
    • Contains metadata about the query
    • Encoded as: <total packet size>\n (total size of the other two sections)
  • The dataframe header: Encoded as <query body size>\n
  • The dataframe:
    • First part contains the query body, encoded as: <query body> (the query body is simply appended here)
    • Second part contains the payload body with all the parameters, encoded as: <parameter>\n ... (repeat for all parameters)

Server​

Data types​

The server will respond with different data types, depending on the context. These include:

  • Null: Encoded as 0
  • Bool: encoded as 1<0 or 1>\n
  • Unsigned integers:
    • First byte: 2 -> 8-bit, 3 -> 16-bit, 4 -> 32-bit, 5 -> 64-bit
    • Payload: <integer>\n
  • Signed integers:
    • First byte: 6 -> 8-bit, 7 -> 16-bit, 8 -> 32-bit, 9 -> 64-bit
    • Payload: <integer>\n
  • Simple collections:
    • First byte: 10 -> binary, 11 -> string
    • Payload: <size>\n<body>
  • Complex collections:
    • First byte: 11 -> list
    • Payload: <size>\n<other server data types>

Responses​

The server can respond with any of the data types above, or it can respond with a special response type like these:

  • Error: Encoded as 0x10<16-bit error code>
  • Row: The server has returned a row. Encoded as 0x11<column cnt>\n<data type>
  • Empty: This indicates that the query ran successfully but nothing appropriate can be returned (like HTTP's 200 status). Encoded as 0x12
  • Multirow: The server has returned multiple rows. Encoded as 0x13<row count>\n<rows ...>