### 6.2 The meta-protocol

The meta protocol is used to tie all tinc daemons together, and exchange information about which tinc daemon serves which virtual subnet.

The meta protocol consists of requests that can be sent to the other side. Each request has a unique number and several parameters. All requests are represented in the standard ASCII character set. It is possible to use tools such as telnet or netcat to connect to a tinc daemon started with the –bypass-security option and to read and write requests by hand, provided that one understands the numeric codes sent.

The authentication scheme is described in Authentication protocol. After a successful authentication, the server and the client will exchange all the information about other tinc daemons and subnets they know of, so that both sides (and all the other tinc daemons behind them) have their information synchronised.

    message
    ------------------------------------------------------------------
    ADD_EDGE node1 node2 21.32.43.54 655 222 0
              |     |        |       |   |  +-> options
              |     |        |       |   +----> weight
              |     |        |       +--------> UDP port of node2
              |     |        +----------------> real address of node2
              |     +-------------------------> name of destination node
              +-------------------------------> name of source node

    ADD_SUBNET node 192.168.1.0/24
                |         |     +--> prefixlength
                |         +--------> network address
                +------------------> owner of this subnet
    ------------------------------------------------------------------

The ADD_EDGE messages are to inform other tinc daemons that a connection between two nodes exist. The address of the destination node is available so that VPN packets can be sent directly to that node.

The ADD_SUBNET messages inform other tinc daemons that certain subnets belong to certain nodes. tinc will use it to determine to which node a VPN packet has to be sent.

    message
    ------------------------------------------------------------------
    DEL_EDGE node1 node2
               |     +----> name of destination node
               +----------> name of source node

    DEL_SUBNET node 192.168.1.0/24
                 |         |     +--> prefixlength
                 |         +--------> network address
                 +------------------> owner of this subnet
    ------------------------------------------------------------------

In case a connection between two daemons is closed or broken, DEL_EDGE messages are sent to inform the other daemons of that fact. Each daemon will calculate a new route to the the daemons, or mark them unreachable if there isn’t any.

    message
    ------------------------------------------------------------------
    REQ_KEY origin destination
               |       +--> name of the tinc daemon it wants the key from
               +----------> name of the daemon that wants the key

    ANS_KEY origin destination 4ae0b0a82d6e0078 91 64 4
               |       |       \______________/ |  |  +--> MAC length
               |       |               |        |  +-----> digest algorithm
               |       |               |        +--------> cipher algorithm
               |       |               +--> 128 bits key
               |       +--> name of the daemon that wants the key
               +----------> name of the daemon that uses this key

    KEY_CHANGED origin
                  +--> daemon that has changed it's packet key
    ------------------------------------------------------------------

The keys used to encrypt VPN packets are not sent out directly. This is because it would generate a lot of traffic on VPNs with many daemons, and chances are that not every tinc daemon will ever send a packet to every other daemon. Instead, if a daemon needs a key it sends a request for it via the meta connection of the nearest hop in the direction of the destination.

    daemon	message
    ------------------------------------------------------------------
    origin	PING
    dest.	PONG
    ------------------------------------------------------------------

There is also a mechanism to check if hosts are still alive. Since network failures or a crash can cause a daemon to be killed without properly shutting down the TCP connection, this is necessary to keep an up to date connection list. PINGs are sent at regular intervals, except when there is also some other traffic. A little bit of salt (random data) is added with each PING and PONG message, to make sure that long sequences of PING/PONG messages without any other traffic won’t result in known plaintext.

This basically covers what is sent over the meta connection by tinc.