Internet Engineering Task Force (IETF)                     T. Richardson
Request for Comments: 6143                                     J. Levine
Category: Informational                                     RealVNC Ltd.
ISSN: 2070-1721                                               March 2011


                   The Remote Framebuffer Protocol

Abstract

  RFB ("remote framebuffer") is a simple protocol for remote access to
  graphical user interfaces that allows a client to view and control a
  window system on another computer.  Because it works at the
  framebuffer level, RFB is applicable to all windowing systems and
  applications.  This document describes the protocol used to
  communicate between an RFB client and RFB server.  RFB is the
  protocol used in VNC.

Status of This Memo

  This document is not an Internet Standards Track specification; it is
  published for informational purposes.

  This document is a product of the Internet Engineering Task Force
  (IETF).  It represents the consensus of the IETF community.  It has
  received public review and has been approved for publication by the
  Internet Engineering Steering Group (IESG).  Not all documents
  approved by the IESG are a candidate for any level of Internet
  Standard; see Section 2 of RFC 5741.

  Information about the current status of this document, any errata,
  and how to provide feedback on it may be obtained at
  http://www.rfc-editor.org/info/rfc6143.

Copyright Notice

  Copyright (c) 2011 IETF Trust and the persons identified as the
  document authors.  All rights reserved.

  This document is subject to BCP 78 and the IETF Trust's Legal
  Provisions Relating to IETF Documents
  (http://trustee.ietf.org/license-info) in effect on the date of
  publication of this document.  Please review these documents
  carefully, as they describe your rights and restrictions with respect
  to this document.  Code Components extracted from this document must
  include Simplified BSD License text as described in Section 4.e of
  the Trust Legal Provisions and are provided without warranty as
  described in the Simplified BSD License.



Richardson & Levine           Informational                     [Page 1]

RFC 6143             The Remote Framebuffer Protocol          March 2011


Table of Contents

  1.  Introduction . . . . . . . . . . . . . . . . . . . . . . . . .  3
  2.  Initial Connection . . . . . . . . . . . . . . . . . . . . . .  4
  3.  Display Protocol . . . . . . . . . . . . . . . . . . . . . . .  4
  4.  Input Protocol . . . . . . . . . . . . . . . . . . . . . . . .  5
  5.  Representation of Pixel Data . . . . . . . . . . . . . . . . .  5
  6.  Protocol Versions and Extensions . . . . . . . . . . . . . . .  6
  7.  Protocol Messages  . . . . . . . . . . . . . . . . . . . . . .  7
    7.1.  Handshake Messages . . . . . . . . . . . . . . . . . . . .  8
      7.1.1.  ProtocolVersion Handshake  . . . . . . . . . . . . . .  8
      7.1.2.  Security Handshake . . . . . . . . . . . . . . . . . .  8
      7.1.3.  SecurityResult Handshake . . . . . . . . . . . . . . . 10
    7.2.  Security Types . . . . . . . . . . . . . . . . . . . . . . 10
      7.2.1.  None . . . . . . . . . . . . . . . . . . . . . . . . . 10
      7.2.2.  VNC Authentication . . . . . . . . . . . . . . . . . . 10
    7.3.  Initialization Messages  . . . . . . . . . . . . . . . . . 11
      7.3.1.  ClientInit . . . . . . . . . . . . . . . . . . . . . . 11
      7.3.2.  ServerInit . . . . . . . . . . . . . . . . . . . . . . 11
    7.4.  Pixel Format Data Structure  . . . . . . . . . . . . . . . 12
    7.5.  Client-to-Server Messages  . . . . . . . . . . . . . . . . 13
      7.5.1.  SetPixelFormat . . . . . . . . . . . . . . . . . . . . 13
      7.5.2.  SetEncodings . . . . . . . . . . . . . . . . . . . . . 14
      7.5.3.  FramebufferUpdateRequest . . . . . . . . . . . . . . . 15
      7.5.4.  KeyEvent . . . . . . . . . . . . . . . . . . . . . . . 16
      7.5.5.  PointerEvent . . . . . . . . . . . . . . . . . . . . . 19
      7.5.6.  ClientCutText  . . . . . . . . . . . . . . . . . . . . 19
    7.6.  Server-to-Client Messages  . . . . . . . . . . . . . . . . 20
      7.6.1.  FramebufferUpdate  . . . . . . . . . . . . . . . . . . 20
      7.6.2.  SetColorMapEntries . . . . . . . . . . . . . . . . . . 21
      7.6.3.  Bell . . . . . . . . . . . . . . . . . . . . . . . . . 22
      7.6.4.  ServerCutText  . . . . . . . . . . . . . . . . . . . . 22
    7.7.  Encodings  . . . . . . . . . . . . . . . . . . . . . . . . 22
      7.7.1.  Raw Encoding . . . . . . . . . . . . . . . . . . . . . 23
      7.7.2.  CopyRect Encoding  . . . . . . . . . . . . . . . . . . 23
      7.7.3.  RRE Encoding . . . . . . . . . . . . . . . . . . . . . 23
      7.7.4.  Hextile Encoding . . . . . . . . . . . . . . . . . . . 24
      7.7.5.  TRLE . . . . . . . . . . . . . . . . . . . . . . . . . 27
      7.7.6.  ZRLE . . . . . . . . . . . . . . . . . . . . . . . . . 30
    7.8.  Pseudo-Encodings . . . . . . . . . . . . . . . . . . . . . 30
      7.8.1.  Cursor Pseudo-Encoding . . . . . . . . . . . . . . . . 30
      7.8.2.  DesktopSize Pseudo-Encoding  . . . . . . . . . . . . . 31
  8.  IANA Considerations  . . . . . . . . . . . . . . . . . . . . . 31
    8.1.  RFB Security Types . . . . . . . . . . . . . . . . . . . . 32
      8.1.1.  Registry Name  . . . . . . . . . . . . . . . . . . . . 32
      8.1.2.  Registry Contents  . . . . . . . . . . . . . . . . . . 32
    8.2.  Client-to-Server Message Types . . . . . . . . . . . . . . 32
      8.2.1.  Registry Name  . . . . . . . . . . . . . . . . . . . . 32



Richardson & Levine           Informational                     [Page 2]

RFC 6143             The Remote Framebuffer Protocol          March 2011


      8.2.2.  Registry Contents  . . . . . . . . . . . . . . . . . . 32
    8.3.  Server-to-Client Message Types . . . . . . . . . . . . . . 33
      8.3.1.  Registry Name  . . . . . . . . . . . . . . . . . . . . 33
      8.3.2.  Registry Contents  . . . . . . . . . . . . . . . . . . 33
    8.4.  RFB Encoding Types . . . . . . . . . . . . . . . . . . . . 34
      8.4.1.  Registry Name  . . . . . . . . . . . . . . . . . . . . 34
      8.4.2.  Registry Contents  . . . . . . . . . . . . . . . . . . 34
  9.  Security . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
  10. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 36
  11. References . . . . . . . . . . . . . . . . . . . . . . . . . . 36
    11.1. Normative References . . . . . . . . . . . . . . . . . . . 36
    11.2. Informative References . . . . . . . . . . . . . . . . . . 36
  Appendix A.  Differences in Earlier Protocol Versions  . . . . . . 38
    A.1.  Differences in the Version 3.3 Protocol  . . . . . . . . . 38
    A.2.  Differences in the Version 3.7 Protocol  . . . . . . . . . 38

1.  Introduction

  RFB ("remote framebuffer") is a simple protocol for remote access to
  graphical user interfaces.  Because it works at the framebuffer
  level, it is applicable to all windowing systems and applications,
  including X11, Windows, and Macintosh.  RFB is the protocol used in
  VNC.  The protocol is widely implemented and has had fairly good
  interoperability.

  The remote endpoint where the user sits (typically with a display,
  keyboard, and pointer) is called the RFB client or viewer.  The
  endpoint where changes to the framebuffer originate (i.e., the
  windowing system and applications) is known as the RFB server.

  RFB is a "thin client" protocol.  The emphasis in the design of the
  RFB protocol is to make very few requirements of the client.  In this
  way, clients can run on the widest range of hardware, and the task of
  implementing a client is made as simple as possible.

  The protocol also makes the client stateless.  If a client
  disconnects from a given server and subsequently reconnects to that
  same server, the state of the user interface is preserved.
  Furthermore, a different client endpoint can be used to connect to
  the same RFB server.  At the new endpoint, the user will see exactly
  the same graphical user interface as at the original endpoint.  In
  effect, the interface to the user's applications becomes completely
  mobile.  Wherever suitable network connectivity exists, the user can
  access their own personal applications, and the state of these
  applications is preserved between accesses from different locations.
  This provides the user with a familiar, uniform view of the computing
  infrastructure wherever they go.




Richardson & Levine           Informational                     [Page 3]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  The RFB protocol has evolved over the past decade, and has been
  implemented several times, including at least one open source
  version.  This document describes the RFB protocol as actually
  implemented, so that future implementers can interoperate with
  existing clients and servers.

2.  Initial Connection

  An RFB server is typically a long-lived process that maintains the
  state of a framebuffer.  RFB clients typically connect, communicate
  with the server for a period of time to use and manipulate the
  framebuffer, then disconnect.  A subsequent RFB session will then
  pick up where a prior session left off, with the state of the
  framebuffer intact.

  An RFB client contacts the server on TCP port 5900.  On systems with
  multiple RFB servers, server N typically listens on port 5900+N,
  analogous to the way that X Window servers listen on port 6000+N.

  Some browser-based clients use a Java application to run the RFB
  protocol.  RFB servers sometimes provide a simple HTTP server on port
  5800 that provides the requisite Java applet.

  In some cases, the initial roles of the client and server are
  reversed, with the RFB client listening on port 5500, and the RFB
  server contacting the RFB client.  Once the connection is
  established, the two sides take their normal roles, with the RFB
  server sending the first handshake message.

  Note that the only port number assigned by IANA for RFB is port 5900,
  so RFB clients and servers should avoid using other port numbers
  unless they are communicating with servers or clients known to use
  the non-standard ports.

3.  Display Protocol

  The display side of the protocol is based around a single graphics
  primitive: "put a rectangle of pixel data at a given x,y position".
  This might seem an inefficient way of drawing many user interface
  components.  However, allowing various different encodings for the
  pixel data gives us a large degree of flexibility in how to trade off
  various parameters such as network bandwidth, client drawing speed,
  and server processing speed.








Richardson & Levine           Informational                     [Page 4]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  A sequence of these rectangles makes a framebuffer update (simply
  referred to here as "update").  An update represents a change from
  one valid framebuffer state to another, so in some ways is similar to
  a frame of video.  The rectangles in an update are usually but not
  always disjoint.

  The update protocol is demand-driven by the client.  That is, an
  update is only sent from the server to the client in response to an
  explicit request from the client.  This gives the protocol an
  adaptive quality.  The slower the client and the network are, the
  lower the rate of updates.  With typical applications, changes to the
  same area of the framebuffer tend to happen soon after one another.
  With a slow client or network, transient states of the framebuffer
  can be ignored, resulting in less network traffic and less drawing
  for the client.

  After the initial handshake sequence, the protocol is asynchronous,
  with each side sending messages as needed.  The server must not send
  unsolicited updates.  An update must only be sent in response to a
  request from the client.  When several requests from the client are
  outstanding, a single update from the server may satisfy all of them.

4.  Input Protocol

  The input side of the protocol is based on a standard workstation
  model of a keyboard and multi-button pointing device.  Input events
  are simply sent to the server by the client whenever the user presses
  a key or pointer button, or whenever the pointing device is moved.
  These input events can also be synthesized from other non-standard
  I/O devices.  For example, a pen-based handwriting recognition engine
  might generate keyboard events.

5.  Representation of Pixel Data

  Initial interaction between the RFB client and server involves a
  negotiation of the format and encoding of the pixel data that will be
  sent.  This negotiation has been designed to make the job of the
  client as easy as possible.  The server must always be able to supply
  pixel data in the form the client wants.  However, if the client is
  able to cope equally with several different formats or encodings, it
  may choose one that is easier for the server to produce.

  Pixel format refers to the representation of individual colors by
  pixel values.  The most common pixel formats are 24-bit or 16-bit
  "true color", where bit-fields within the pixel value translate
  directly to red, green, and blue intensities, and 8-bit "color map"
  (palette) where the pixel values are indices into a 256-entry table
  that contains the actual RGB intensities.



Richardson & Levine           Informational                     [Page 5]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  Encoding refers to the way that a rectangle of pixel data will be
  sent to the client.  Every rectangle of pixel data is prefixed by a
  header giving the X,Y position of the rectangle on the screen, the
  width and height of the rectangle, and an encoding type which
  specifies the encoding of the pixel data.  The data itself then
  follows using the specified encoding.

  The encoding types defined at present are: Raw, CopyRect, RRE, TRLE,
  Hextile, and ZRLE.  In practice, current servers use the ZRLE, TRLE,
  and CopyRect encodings since they provide the best compression for
  typical desktops.  Clients generally also support Hextile, which was
  often used by older RFB servers that didn't support TRLE.  See
  Section 7.7 for a description of each of the encodings.

6.  Protocol Versions and Extensions

  The RFB protocol has evolved through three published versions: 3.3,
  3.7, and 3.8.  This document primarily documents the final version
  3.8; differences from the earlier versions, which are minor, are
  described in Appendix A.  Under no circumstances should an
  implementation use a protocol version number other than one defined
  in this document.  Over the years, different implementations of RFB
  have attempted to use different version numbers to add undocumented
  extensions, with the result being that to interoperate, any unknown
  3.x version must be treated as 3.3, so it is not possible to add a
  3.9 or higher version in a backward-compatible fashion.  Future
  evolution of RFB will use 4.x version numbers.

  It is not necessary to change the protocol version number to extend
  the protocol.  The protocol can be extended within an existing
  version by:

  New encodings
     A new encoding type can be added to the protocol relatively easily
     while maintaining compatibility with existing clients and servers.
     Existing servers will simply ignore requests for a new encoding
     that they don't support.  Existing clients will never request the
     new encoding so will never see rectangles encoded that way.

  Pseudo-encodings
     In addition to genuine encodings, a client can request a "pseudo-
     encoding" to declare to the server that it supports a certain
     extension to the protocol.  A server that does not support the
     extension will simply ignore the pseudo-encoding.  Note that this
     means the client must assume that the server does not support the
     extension until it gets some extension-specific confirmation from
     the server.  See Section 7.8 for a description of current pseudo-
     encodings.



Richardson & Levine           Informational                     [Page 6]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  New security types
     Adding a new security type gives full flexibility in modifying the
     behavior of the protocol without sacrificing compatibility with
     existing clients and servers.  A client and server that agree on a
     new security type can effectively talk whatever protocol they like
     after that -- it doesn't necessarily have to be anything like the
     RFB protocol.

  See Section 8 for information on obtaining an ID for a new encoding
  or security type.

7.  Protocol Messages

  The RFB protocol can operate over any reliable transport, either
  byte-stream or message based.  It usually operates over a TCP/IP
  connection.  There are three stages to the protocol.  First is the
  handshaking phase, the purpose of which is to agree upon the protocol
  version and the type of security to be used.  The second stage is an
  initialization phase where the client and server exchange ClientInit
  and ServerInit messages.  The final stage is the normal protocol
  interaction.  The client can send whichever messages it wants, and
  may receive messages from the server as a result.  All these messages
  begin with a message-type byte, followed by message-specific data.

  The following descriptions of protocol messages use the basic types
  U8, U16, U32, S8, S16, and S32.  These represent, respectively, 8-,
  16-, and 32-bit unsigned integers and 8-, 16-, and 32-bit signed
  integers.  All multiple-byte integers (other than pixel values
  themselves) are in big endian order (most significant byte first).
  Some messages use arrays of the basic types, with the number of
  entries in the array determined from fields preceding the array.

  The type PIXEL means a pixel value of bytesPerPixel bytes, where
  bytesPerPixel is the number of bits-per-pixel divided by 8.  The
  bits-per-pixel is agreed by the client and server, either in the
  ServerInit message (Section 7.3.2) or a SetPixelFormat message
  (Section 7.5.1).  See Section 7.4 for the detailed description of the
  pixel format.

  Several message formats include padding bits or bytes.  For maximum
  compatibility, messages should be generated with padding set to zero,
  but message recipients should not assume padding has any particular
  value.








Richardson & Levine           Informational                     [Page 7]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.1.  Handshake Messages

  When an RFB client and server first connect, they exchange a sequence
  of handshake messages that determine the protocol version, what type
  of connection security (if any) to use, a password check if the
  security type requires it, and some initialization information.

7.1.1.  ProtocolVersion Handshake

  Handshaking begins by the server sending the client a ProtocolVersion
  message.  This lets the client know which is the highest RFB protocol
  version number supported by the server.  The client then replies with
  a similar message giving the version number of the protocol that
  should actually be used (which may be different to that quoted by the
  server).  A client should never request a protocol version higher
  than that offered by the server.  It is intended that both clients
  and servers may provide some level of backwards compatibility by this
  mechanism.

  The only published protocol versions at this time are 3.3, 3.7, and
  3.8.  Other version numbers are reported by some servers and clients,
  but should be interpreted as 3.3 since they do not implement the
  different handshake in 3.7 or 3.8.  Addition of a new encoding or
  pseudo-encoding type does not require a change in protocol version,
  since a server can simply ignore encodings it does not understand.

  The ProtocolVersion message consists of 12 bytes interpreted as a
  string of ASCII characters in the format "RFB xxx.yyy\n" where xxx
  and yyy are the major and minor version numbers, left-padded with
  zeros:

      RFB 003.008\n (hex 52 46 42 20 30 30 33 2e 30 30 38 0a)

7.1.2.  Security Handshake

  Once the protocol version has been decided, the server and client
  must agree on the type of security to be used on the connection.  The
  server lists the security types that it supports:

  +--------------------------+-------------+--------------------------+
  | No. of bytes             | Type        | Description              |
  |                          | [Value]     |                          |
  +--------------------------+-------------+--------------------------+
  | 1                        | U8          | number-of-security-types |
  | number-of-security-types | U8 array    | security-types           |
  +--------------------------+-------------+--------------------------+





Richardson & Levine           Informational                     [Page 8]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  If the server listed at least one valid security type supported by
  the client, the client sends back a single byte indicating which
  security type is to be used on the connection:

             +--------------+--------------+---------------+
             | No. of bytes | Type [Value] | Description   |
             +--------------+--------------+---------------+
             | 1            | U8           | security-type |
             +--------------+--------------+---------------+

  If number-of-security-types is zero, then for some reason the
  connection failed (e.g., the server cannot support the desired
  protocol version).  This is followed by a string describing the
  reason (where a string is specified as a length followed by that many
  ASCII characters):

            +---------------+--------------+---------------+
            | No. of bytes  | Type [Value] | Description   |
            +---------------+--------------+---------------+
            | 4             | U32          | reason-length |
            | reason-length | U8 array     | reason-string |
            +---------------+--------------+---------------+

  The server closes the connection after sending the reason-string.

            The security types defined in this document are:

                     +--------+--------------------+
                     | Number | Name               |
                     +--------+--------------------+
                     | 0      | Invalid            |
                     | 1      | None               |
                     | 2      | VNC Authentication |
                     +--------+--------------------+

  Other security types exist but are not publicly documented.

  Once the security-type has been decided, data specific to that
  security-type follows (see Section 7.2 for details).  At the end of
  the security handshaking phase, the protocol normally continues with
  the SecurityResult message.

  Note that after the security handshaking phase, it is possible that
  further communication is over an encrypted or otherwise altered
  channel if the two ends agree on an extended security type beyond the
  ones described here.





Richardson & Levine           Informational                     [Page 9]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.1.3.  SecurityResult Handshake

  The server sends a word to inform the client whether the security
  handshaking was successful.

              +--------------+--------------+-------------+
              | No. of bytes | Type [Value] | Description |
              +--------------+--------------+-------------+
              | 4            | U32          | status:     |
              |              | 0            | OK          |
              |              | 1            | failed      |
              +--------------+--------------+-------------+

  If successful, the protocol passes to the initialization phase
  (Section 7.3).

  If unsuccessful, the server sends a string describing the reason for
  the failure, and then closes the connection:

            +---------------+--------------+---------------+
            | No. of bytes  | Type [Value] | Description   |
            +---------------+--------------+---------------+
            | 4             | U32          | reason-length |
            | reason-length | U8 array     | reason-string |
            +---------------+--------------+---------------+

7.2.  Security Types

  Two security types are defined here.

7.2.1.  None

  No authentication is needed.  The protocol continues with the
  SecurityResult message.

7.2.2.  VNC Authentication

  VNC authentication is to be used.  The server sends a random 16-byte
  challenge:

              +--------------+--------------+-------------+
              | No. of bytes | Type [Value] | Description |
              +--------------+--------------+-------------+
              | 16           | U8           | challenge   |
              +--------------+--------------+-------------+






Richardson & Levine           Informational                    [Page 10]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  The client encrypts the challenge with DES, using a password supplied
  by the user as the key.  To form the key, the password is truncated
  to eight characters, or padded with null bytes on the right.  The
  client then sends the resulting 16-byte response:

              +--------------+--------------+-------------+
              | No. of bytes | Type [Value] | Description |
              +--------------+--------------+-------------+
              | 16           | U8           | response    |
              +--------------+--------------+-------------+

  The protocol continues with the SecurityResult message.

  This type of authentication is known to be cryptographically weak and
  is not intended for use on untrusted networks.  Many implementations
  will want to use stronger security, such as running the session over
  an encrypted channel provided by IPsec [RFC4301] or SSH [RFC4254].

7.3.  Initialization Messages

  Once the client and server agree on and perhaps validate a security
  type, the protocol passes to the initialization stage.  The client
  sends a ClientInit message.  Then, the server sends a ServerInit
  message.

7.3.1.  ClientInit

              +--------------+--------------+-------------+
              | No. of bytes | Type [Value] | Description |
              +--------------+--------------+-------------+
              | 1            | U8           | shared-flag |
              +--------------+--------------+-------------+

  Shared-flag is non-zero (true) if the server should try to share the
  desktop by leaving other clients connected, and zero (false) if it
  should give exclusive access to this client by disconnecting all
  other clients.

7.3.2.  ServerInit

  After receiving the ClientInit message, the server sends a ServerInit
  message.  This tells the client the width and height of the server's
  framebuffer, its pixel format, and the name associated with the
  desktop:







Richardson & Levine           Informational                    [Page 11]

RFC 6143             The Remote Framebuffer Protocol          March 2011


     +--------------+--------------+------------------------------+
     | No. of bytes | Type [Value] | Description                  |
     +--------------+--------------+------------------------------+
     | 2            | U16          | framebuffer-width in pixels  |
     | 2            | U16          | framebuffer-height in pixels |
     | 16           | PIXEL_FORMAT | server-pixel-format          |
     | 4            | U32          | name-length                  |
     | name-length  | U8 array     | name-string                  |
     +--------------+--------------+------------------------------+

  Server-pixel-format specifies the server's natural pixel format.
  This pixel format will be used unless the client requests a different
  format using the SetPixelFormat message (Section 7.5.1).

7.4.  Pixel Format Data Structure

  Several server-to-client messages include a PIXEL_FORMAT, a 16-byte
  structure that describes the way a pixel is transmitted.

            +--------------+--------------+-----------------+
            | No. of bytes | Type [Value] | Description     |
            +--------------+--------------+-----------------+
            | 1            | U8           | bits-per-pixel  |
            | 1            | U8           | depth           |
            | 1            | U8           | big-endian-flag |
            | 1            | U8           | true-color-flag |
            | 2            | U16          | red-max         |
            | 2            | U16          | green-max       |
            | 2            | U16          | blue-max        |
            | 1            | U8           | red-shift       |
            | 1            | U8           | green-shift     |
            | 1            | U8           | blue-shift      |
            | 3            |              | padding         |
            +--------------+--------------+-----------------+

  Bits-per-pixel is the number of bits used for each pixel value on the
  wire.  This must be greater than or equal to the depth, which is the
  number of useful bits in the pixel value.  Currently bits-per-pixel
  must be 8, 16, or 32.  Big-endian-flag is non-zero (true) if multi-
  byte pixels are interpreted as big endian.  Although the depth should
  be consistent with the bits-per-pixel and the various -max values,
  clients do not use it when interpreting pixel data.

  If true-color-flag is non-zero (true), then the last six items
  specify how to extract the red, green, and blue intensities from the
  pixel value.  Red-max is the maximum red value and must be 2^N - 1,
  where N is the number of bits used for red.  Note the -max values are
  always in big endian order.  Red-shift is the number of shifts needed



Richardson & Levine           Informational                    [Page 12]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  to get the red value in a pixel to the least significant bit.  Green-
  max, green-shift, blue-max, and blue-shift are similar for green and
  blue.  For example, to find the red value (between 0 and red-max)
  from a given pixel, do the following:

  o  Swap the pixel value according to big-endian-flag, e.g., if big-
     endian-flag is zero (false) and host byte order is big endian,
     then swap.

  o  Shift right by red-shift.

  o  AND with red-max (in host byte order).

  If true-color-flag is zero (false), then the server uses pixel values
  that are not directly composed from the red, green, and blue
  intensities, but serve as indices into a color map.  Entries in the
  color map are set by the server using the SetColorMapEntries message
  (See Section 7.6.2).

7.5.  Client-to-Server Messages

  The client-to-server message types defined in this document are:

                  +--------+--------------------------+
                  | Number | Name                     |
                  +--------+--------------------------+
                  | 0      | SetPixelFormat           |
                  | 2      | SetEncodings             |
                  | 3      | FramebufferUpdateRequest |
                  | 4      | KeyEvent                 |
                  | 5      | PointerEvent             |
                  | 6      | ClientCutText            |
                  +--------+--------------------------+

  Other message types exist but are not publicly documented.  Before
  sending a message other than those described in this document, a
  client must have determined that the server supports the relevant
  extension by receiving an appropriate extension-specific confirmation
  from the server.

7.5.1.  SetPixelFormat

  A SetPixelFormat message sets the format in which pixel values should
  be sent in FramebufferUpdate messages.  If the client does not send a
  SetPixelFormat message, then the server sends pixel values in its
  natural format as specified in the ServerInit message
  (Section 7.3.2).




Richardson & Levine           Informational                    [Page 13]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  If true-color-flag is zero (false), then this indicates that a "color
  map" is to be used.  The server can set any of the entries in the
  color map using the SetColorMapEntries message (Section 7.6.2).
  Immediately after the client has sent this message, the contents of
  the color map are undefined, even if entries had previously been set
  by the server.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [0]       | message-type |
             | 3            |              | padding      |
             | 16           | PIXEL_FORMAT | pixel-format |
             +--------------+--------------+--------------+

              PIXEL_FORMAT is as described in Section 7.4.

7.5.2.  SetEncodings

  A SetEncodings message sets the encoding types in which pixel data
  can be sent by the server.  The order of the encoding types given in
  this message is a hint by the client as to its preference (the first
  encoding specified being most preferred).  The server may or may not
  choose to make use of this hint.  Pixel data may always be sent in
  raw encoding even if not specified explicitly here.

  In addition to genuine encodings, a client can request "pseudo-
  encodings" to declare to the server that it supports certain
  extensions to the protocol.  A server that does not support the
  extension will simply ignore the pseudo-encoding.  Note that this
  means the client must assume that the server does not support the
  extension until it gets some extension-specific confirmation from the
  server.

  See Section 7.7 for a description of each encoding and Section 7.8
  for the meaning of pseudo-encodings.

          +--------------+--------------+---------------------+
          | No. of bytes | Type [Value] | Description         |
          +--------------+--------------+---------------------+
          | 1            | U8 [2]       | message-type        |
          | 1            |              | padding             |
          | 2            | U16          | number-of-encodings |
          +--------------+--------------+---------------------+







Richardson & Levine           Informational                    [Page 14]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  This is followed by number-of-encodings repetitions of the following:

             +--------------+--------------+---------------+
             | No. of bytes | Type [Value] | Description   |
             +--------------+--------------+---------------+
             | 4            | S32          | encoding-type |
             +--------------+--------------+---------------+

7.5.3.  FramebufferUpdateRequest

  A FramebufferUpdateRequest message notifies the server that the
  client is interested in the area of the framebuffer specified by
  x-position, y-position, width, and height.  The server usually
  responds to a FramebufferUpdateRequest by sending a
  FramebufferUpdate.  A single FramebufferUpdate may be sent in reply
  to several FramebufferUpdateRequests.

  The server assumes that the client keeps a copy of all parts of the
  framebuffer in which it is interested.  This means that normally the
  server only needs to send incremental updates to the client.

  If the client has lost the contents of a particular area that it
  needs, then the client sends a FramebufferUpdateRequest with
  incremental set to zero (false).  This requests that the server send
  the entire contents of the specified area as soon as possible.  The
  area will not be updated using the CopyRect encoding.

  If the client has not lost any contents of the area in which it is
  interested, then it sends a FramebufferUpdateRequest with incremental
  set to non-zero (true).  If and when there are changes to the
  specified area of the framebuffer, the server will send a
  FramebufferUpdate.  Note that there may be an indefinite period
  between the FramebufferUpdateRequest and the FramebufferUpdate.

  In the case of a fast client, the client may want to regulate the
  rate at which it sends incremental FramebufferUpdateRequests to avoid
  excessive network traffic.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [3]       | message-type |
             | 1            | U8           | incremental  |
             | 2            | U16          | x-position   |
             | 2            | U16          | y-position   |
             | 2            | U16          | width        |
             | 2            | U16          | height       |
             +--------------+--------------+--------------+



Richardson & Levine           Informational                    [Page 15]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.5.4.  KeyEvent

  A KeyEvent message indicates a key press or release.  Down-flag is
  non-zero (true) if the key is now pressed, and zero (false) if it is
  now released.  The key itself is specified using the "keysym" values
  defined by the X Window System, even if the client or server is not
  running the X Window System.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [4]       | message-type |
             | 1            | U8           | down-flag    |
             | 2            |              | padding      |
             | 4            | U32          | key          |
             +--------------+--------------+--------------+

  For most ordinary keys, the keysym is the same as the corresponding
  ASCII value.  For full details, see [XLIBREF] or see the header file
  <X11/keysymdef.h> in the X Window System distribution.  Some other
  common keys are:






























Richardson & Levine           Informational                    [Page 16]

RFC 6143             The Remote Framebuffer Protocol          March 2011


                +-----------------+--------------------+
                | Key name        | Keysym value (hex) |
                +-----------------+--------------------+
                | BackSpace       | 0xff08             |
                | Tab             | 0xff09             |
                | Return or Enter | 0xff0d             |
                | Escape          | 0xff1b             |
                | Insert          | 0xff63             |
                | Delete          | 0xffff             |
                | Home            | 0xff50             |
                | End             | 0xff57             |
                | Page Up         | 0xff55             |
                | Page Down       | 0xff56             |
                | Left            | 0xff51             |
                | Up              | 0xff52             |
                | Right           | 0xff53             |
                | Down            | 0xff54             |
                | F1              | 0xffbe             |
                | F2              | 0xffbf             |
                | F3              | 0xffc0             |
                | F4              | 0xffc1             |
                | ...             | ...                |
                | F12             | 0xffc9             |
                | Shift (left)    | 0xffe1             |
                | Shift (right)   | 0xffe2             |
                | Control (left)  | 0xffe3             |
                | Control (right) | 0xffe4             |
                | Meta (left)     | 0xffe7             |
                | Meta (right)    | 0xffe8             |
                | Alt (left)      | 0xffe9             |
                | Alt (right)     | 0xffea             |
                +-----------------+--------------------+

  The interpretation of keysyms is a complex area.  In order to be as
  widely interoperable as possible, the following guidelines should be
  followed:

  o  The "shift state" (i.e., whether either of the Shift keysyms is
     down) should only be used as a hint when interpreting a keysym.
     For example, on a US keyboard the '#' character is shifted, but on
     a UK keyboard it is not.  A server with a US keyboard receiving a
     '#' character from a client with a UK keyboard will not have been
     sent any shift presses.  In this case, it is likely that the
     server will internally need to simulate a shift press on its local
     system in order to get a '#' character and not a '3'.






Richardson & Levine           Informational                    [Page 17]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  o  The difference between upper and lower case keysyms is
     significant.  This is unlike some of the keyboard processing in
     the X Window System that treats them as the same.  For example, a
     server receiving an upper case 'A' keysym without any shift
     presses should interpret it as an upper case 'A'.  Again this may
     involve an internal simulated shift press.

  o  Servers should ignore "lock" keysyms such as CapsLock and NumLock
     where possible.  Instead, they should interpret each character-
     based keysym according to its case.

  o  Unlike Shift, the state of modifier keys such as Control and Alt
     should be taken as modifying the interpretation of other keysyms.
     Note that there are no keysyms for ASCII control characters such
     as Ctrl-A -- these should be generated by clients sending a
     Control press followed by an 'a' press.

  o  On a client where modifiers like Control and Alt can also be used
     to generate character-based keysyms, the client may need to send
     extra "release" events in order that the keysym is interpreted
     correctly.  For example, on a German PC keyboard, Ctrl-Alt-Q
     generates the '@' character.  In this case, the client needs to
     send simulated release events for Control and Alt in order that
     the '@' character is interpreted correctly, since Ctrl-Alt-@ may
     mean something completely different to the server.

  o  There is no universal standard for "backward tab" in the X Window
     System.  On some systems shift+tab gives the keysym
     "ISO_Left_Tab", on others it gives a private "BackTab" keysym, and
     on others it gives "Tab" and applications tell from the shift
     state that it means backward-tab rather than forward-tab.  In the
     RFB protocol, the latter approach is preferred.  Clients should
     generate a shifted Tab rather than ISO_Left_Tab.  However, to be
     backwards-compatible with existing clients, servers should also
     recognize ISO_Left_Tab as meaning a shifted Tab.

  o  Modern versions of the X Window System handle keysyms for Unicode
     characters, consisting of the Unicode character with the hex
     1000000 bit set.  For maximum compatibility, if a key has both a
     Unicode and a legacy encoding, clients should send the legacy
     encoding.

  o  Some systems give a special interpretation to key combinations
     such as Ctrl-Alt-Delete.  RFB clients typically provide a menu or
     toolbar function to send such key combinations.  The RFB protocol
     does not treat them specially; to send Ctrl-Alt-Delete, the client
     sends the key presses for left or right Control, left or right




Richardson & Levine           Informational                    [Page 18]

RFC 6143             The Remote Framebuffer Protocol          March 2011


     Alt, and Delete, followed by the key releases.  Many RFB servers
     accept Shift-Ctrl-Alt-Delete as a synonym for Ctrl-Alt-Delete that
     can be entered directly from the keyboard.

7.5.5.  PointerEvent

  A PointerEvent message indicates either pointer movement or a pointer
  button press or release.  The pointer is now at (x-position,
  y-position), and the current state of buttons 1 to 8 are represented
  by bits 0 to 7 of button-mask, respectively; 0 means up, 1 means down
  (pressed).

  On a conventional mouse, buttons 1, 2, and 3 correspond to the left,
  middle, and right buttons on the mouse.  On a wheel mouse, each step
  of the wheel upwards is represented by a press and release of button
  4, and each step downwards is represented by a press and release of
  button 5.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [5]       | message-type |
             | 1            | U8           | button-mask  |
             | 2            | U16          | x-position   |
             | 2            | U16          | y-position   |
             +--------------+--------------+--------------+

7.5.6.  ClientCutText

  RFB provides limited support for synchronizing the "cut buffer" of
  selected text between client and server.  This message tells the
  server that the client has new ISO 8859-1 (Latin-1) text in its cut
  buffer.  Ends of lines are represented by the newline character (hex
  0a) alone.  No carriage-return (hex 0d) is used.  There is no way to
  transfer text outside the Latin-1 character set.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [6]       | message-type |
             | 3            |              | padding      |
             | 4            | U32          | length       |
             | length       | U8 array     | text         |
             +--------------+--------------+--------------+







Richardson & Levine           Informational                    [Page 19]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.6.  Server-to-Client Messages

  The server-to-client message types defined in this document are:

                     +--------+--------------------+
                     | Number | Name               |
                     +--------+--------------------+
                     | 0      | FramebufferUpdate  |
                     | 1      | SetColorMapEntries |
                     | 2      | Bell               |
                     | 3      | ServerCutText      |
                     +--------+--------------------+

  Other private message types exist but are not publicly documented.
  Before sending a message other than those described in this document
  a server must have determined that the client supports the relevant
  extension by receiving some extension-specific confirmation from the
  client -- usually a request for a given pseudo-encoding.

7.6.1.  FramebufferUpdate

  A framebuffer update consists of a sequence of rectangles of pixel
  data that the client should put into its framebuffer.  It is sent in
  response to a FramebufferUpdateRequest from the client.  Note that
  there may be an indefinite period between the
  FramebufferUpdateRequest and the FramebufferUpdate.

         +--------------+--------------+----------------------+
         | No. of bytes | Type [Value] | Description          |
         +--------------+--------------+----------------------+
         | 1            | U8 [0]       | message-type         |
         | 1            |              | padding              |
         | 2            | U16          | number-of-rectangles |
         +--------------+--------------+----------------------+

  This header is followed by number-of-rectangles rectangles of pixel
  data.  Each rectangle starts with a rectangle header:

             +--------------+--------------+---------------+
             | No. of bytes | Type [Value] | Description   |
             +--------------+--------------+---------------+
             | 2            | U16          | x-position    |
             | 2            | U16          | y-position    |
             | 2            | U16          | width         |
             | 2            | U16          | height        |
             | 4            | S32          | encoding-type |
             +--------------+--------------+---------------+




Richardson & Levine           Informational                    [Page 20]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  The rectangle header is followed by the pixel data in the specified
  encoding.  See Section 7.7 for the format of the data for each
  encoding and Section 7.8 for the meaning of pseudo-encodings.

7.6.2.  SetColorMapEntries

  When the pixel format uses a "color map", this message tells the
  client that the specified pixel values should be mapped to the given
  RGB values.  Note that this message may only update part of the color
  map.  This message should not be sent by the server until after the
  client has sent at least one FramebufferUpdateRequest, and only when
  the agreed pixel format uses a color map.

  Color map values are always 16 bits, with the range of values running
  from 0 to 65535, regardless of the display hardware in use.  The
  color map value for white, for example, is 65535,65535,65535.

  The message starts with a header describing the range of colormap
  entries to be updated.

           +--------------+--------------+------------------+
           | No. of bytes | Type [Value] | Description      |
           +--------------+--------------+------------------+
           | 1            | U8 [1]       | message-type     |
           | 1            |              | padding          |
           | 2            | U16          | first-color      |
           | 2            | U16          | number-of-colors |
           +--------------+--------------+------------------+

  This header is followed by number-of-colors RGB values, each of which
  is in this format:

              +--------------+--------------+-------------+
              | No. of bytes | Type [Value] | Description |
              +--------------+--------------+-------------+
              | 2            | U16          | red         |
              | 2            | U16          | green       |
              | 2            | U16          | blue        |
              +--------------+--------------+-------------+












Richardson & Levine           Informational                    [Page 21]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.6.3.  Bell

  A Bell message makes an audible signal on the client if it provides
  one.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [2]       | message-type |
             +--------------+--------------+--------------+

7.6.4.  ServerCutText

  The server has new ISO 8859-1 (Latin-1) text in its cut buffer.  Ends
  of lines are represented by the newline character (hex 0a) alone.  No
  carriage-return (hex 0d) is used.  There is no way to transfer text
  outside the Latin-1 character set.

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8 [3]       | message-type |
             | 3            |              | padding      |
             | 4            | U32          | length       |
             | length       | U8 array     | text         |
             +--------------+--------------+--------------+

7.7.  Encodings

  The encodings defined in this document are:

                +--------+-----------------------------+
                | Number | Name                        |
                +--------+-----------------------------+
                | 0      | Raw                         |
                | 1      | CopyRect                    |
                | 2      | RRE                         |
                | 5      | Hextile                     |
                | 15     | TRLE                        |
                | 16     | ZRLE                        |
                | -239   | Cursor pseudo-encoding      |
                | -223   | DesktopSize pseudo-encoding |
                +--------+-----------------------------+

  Other encoding types exist but are not publicly documented.






Richardson & Levine           Informational                    [Page 22]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.7.1.  Raw Encoding

  The simplest encoding type is raw pixel data.  In this case, the data
  consists of width*height pixel values (where width and height are the
  width and height of the rectangle).  The values simply represent each
  pixel in left-to-right scan line order.  All RFB clients must be able
  to handle pixel data in this raw encoding, and RFB servers should
  only produce raw encoding unless the client specifically asks for
  some other encoding type.

       +----------------------------+--------------+-------------+
       | No. of bytes               | Type [Value] | Description |
       +----------------------------+--------------+-------------+
       | width*height*bytesPerPixel | PIXEL array  | pixels      |
       +----------------------------+--------------+-------------+

7.7.2.  CopyRect Encoding

  The CopyRect (copy rectangle) encoding is a very simple and efficient
  encoding that can be used when the client already has the same pixel
  data elsewhere in its framebuffer.  The encoding on the wire simply
  consists of an X,Y coordinate.  This gives a position in the
  framebuffer from which the client can copy the rectangle of pixel
  data.  This can be used in a variety of situations, the most common
  of which are when the user moves a window across the screen, and when
  the contents of a window are scrolled.

            +--------------+--------------+----------------+
            | No. of bytes | Type [Value] | Description    |
            +--------------+--------------+----------------+
            | 2            | U16          | src-x-position |
            | 2            | U16          | src-y-position |
            +--------------+--------------+----------------+

  For maximum compatibility, the source rectangle of a CopyRect should
  not include pixels updated by previous entries in the same
  FramebufferUpdate message.

7.7.3.  RRE Encoding

  Note: RRE encoding is obsolescent.  In general, ZRLE and TRLE
  encodings are more compact.

  RRE stands for rise-and-run-length encoding.  As its name implies, it
  is essentially a two-dimensional analogue of run-length encoding.
  RRE-encoded rectangles arrive at the client in a form that can be





Richardson & Levine           Informational                    [Page 23]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  rendered immediately by the simplest of graphics engines.  RRE is not
  appropriate for complex desktops, but can be useful in some
  situations.

  The basic idea behind RRE is the partitioning of a rectangle of pixel
  data into rectangular subregions (subrectangles) each of which
  consists of pixels of a single value, and the union of which
  comprises the original rectangular region.  The near-optimal
  partition of a given rectangle into such subrectangles is relatively
  easy to compute.

  The encoding consists of a background pixel value, Vb (typically the
  most prevalent pixel value in the rectangle) and a count N, followed
  by a list of N subrectangles, each of which consists of a tuple
  <v,x,y,w,h> where v (which should be different from Vb) is the pixel
  value, (x,y) are the coordinates of the subrectangle relative to the
  top-left corner of the rectangle, and (w,h) are the width and height
  of the subrectangle.  The client can render the original rectangle by
  drawing a filled rectangle of the background pixel value and then
  drawing a filled rectangle corresponding to each subrectangle.

  On the wire, the data begins with the header:

       +---------------+--------------+-------------------------+
       | No. of bytes  | Type [Value] | Description             |
       +---------------+--------------+-------------------------+
       | 4             | U32          | number-of-subrectangles |
       | bytesPerPixel | PIXEL        | background-pixel-value  |
       +---------------+--------------+-------------------------+

  This is followed by number-of-subrectangles instances of the
  following structure:

         +---------------+--------------+---------------------+
         | No. of bytes  | Type [Value] | Description         |
         +---------------+--------------+---------------------+
         | bytesPerPixel | PIXEL        | subrect-pixel-value |
         | 2             | U16          | x-position          |
         | 2             | U16          | y-position          |
         | 2             | U16          | width               |
         | 2             | U16          | height              |
         +---------------+--------------+---------------------+

7.7.4.  Hextile Encoding

  Note: Hextile encoding is obsolescent.  In general, ZRLE and TRLE
  encodings are more compact.




Richardson & Levine           Informational                    [Page 24]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  Hextile is a variation on RRE.  Rectangles are split up into 16x16
  tiles, allowing the dimensions of the subrectangles to be specified
  in 4 bits each, 16 bits in total.  The rectangle is split into tiles
  starting at the top left going in left-to-right, top-to-bottom order.
  The encoded contents of the tiles simply follow one another in the
  predetermined order.  If the width of the whole rectangle is not an
  exact multiple of 16, then the width of the last tile in each row
  will be correspondingly smaller.  Similarly, if the height of the
  whole rectangle is not an exact multiple of 16, then the height of
  each tile in the final row will also be smaller.

  Each tile is either encoded as raw pixel data, or as a variation on
  RRE.  Each tile has a background pixel value, as before.  The
  background pixel value does not need to be explicitly specified for a
  given tile if it is the same as the background of the previous tile.
  However, the background pixel value may not be carried over if the
  previous tile was raw.  If all of the subrectangles of a tile have
  the same pixel value, this can be specified once as a foreground
  pixel value for the whole tile.  As with the background, the
  foreground pixel value can be left unspecified, meaning it is carried
  over from the previous tile.  The foreground pixel value may not be
  carried over if the previous tile was raw or had the SubrectsColored
  bit set.  It may, however, be carried over from a previous tile with
  the AnySubrects bit clear, as long as that tile itself carried over a
  valid foreground from its previous tile.

  The data consists of each tile encoded in order.  Each tile begins
  with a subencoding type byte, which is a mask made up of a number of
  bits:

          +--------------+--------------+---------------------+
          | No. of bytes | Type [Value] | Description         |
          +--------------+--------------+---------------------+
          | 1            | U8           | subencoding-mask:   |
          |              | [1]          | Raw                 |
          |              | [2]          | BackgroundSpecified |
          |              | [4]          | ForegroundSpecified |
          |              | [8]          | AnySubrects         |
          |              | [16]         | SubrectsColored     |
          +--------------+--------------+---------------------+

  If the Raw bit is set, then the other bits are irrelevant;
  width*height pixel values follow (where width and height are the
  width and height of the tile).  Otherwise, the other bits in the mask
  are as follows:






Richardson & Levine           Informational                    [Page 25]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  BackgroundSpecified
     If set, a pixel value of bytesPerPixel bytes follows and specifies
     the background color for this tile.  The first non-raw tile in a
     rectangle must have this bit set.  If this bit isn't set, then the
     background is the same as the last tile.

  ForegroundSpecified
     If set, a pixel value of bytesPerPixel bytes follows and specifies
     the foreground color to be used for all subrectangles in this
     tile.

     If this bit is set, then the SubrectsColored bit must be zero.

  AnySubrects
     If set, a single byte follows and gives the number of
     subrectangles following.  If not set, there are no subrectangles
     (i.e., the whole tile is just solid background color).

  SubrectsColored
     If set, then each subrectangle is preceded by a pixel value giving
     the color of that subrectangle, so a subrectangle is:

         +---------------+--------------+---------------------+
         | No. of bytes  | Type [Value] | Description         |
         +---------------+--------------+---------------------+
         | bytesPerPixel | PIXEL        | subrect-pixel-value |
         | 1             | U8           | x-and-y-position    |
         | 1             | U8           | width-and-height    |
         +---------------+--------------+---------------------+

     If not set, all subrectangles are the same color -- the foreground
     color; if the ForegroundSpecified bit wasn't set, then the
     foreground is the same as the last tile.  A subrectangle is:

           +--------------+--------------+------------------+
           | No. of bytes | Type [Value] | Description      |
           +--------------+--------------+------------------+
           | 1            | U8           | x-and-y-position |
           | 1            | U8           | width-and-height |
           +--------------+--------------+------------------+

  The position and size of each subrectangle is specified in two bytes,
  x-and-y-position and width-and-height.  The most significant 4 bits
  of x-and-y-position specify the X position, the least significant
  specify the Y position.  The most significant 4 bits of width-and-
  height specify the width minus 1, the least significant specify the
  height minus 1.




Richardson & Levine           Informational                    [Page 26]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.7.5.  TRLE

  TRLE stands for Tiled Run-Length Encoding, and combines tiling,
  palettization, and run-length encoding.  The rectangle is divided
  into tiles of 16x16 pixels in left-to-right, top-to-bottom order,
  similar to Hextile.  If the width of the rectangle is not an exact
  multiple of 16, then the width of the last tile in each row is
  smaller, and if the height of the rectangle is not an exact multiple
  of 16, then the height of each tile in the final row is smaller.

  TRLE makes use of a new type CPIXEL (compressed pixel).  This is the
  same as a PIXEL for the agreed pixel format, except as a special
  case, it uses a more compact format if true-color-flag is non-zero,
  bits-per-pixel is 32, depth is 24 or less, and all of the bits making
  up the red, green, and blue intensities fit in either the least
  significant 3 bytes or the most significant 3 bytes.  If all of these
  are the case, a CPIXEL is only 3 bytes long, and contains the least
  significant or the most significant 3 bytes as appropriate.
  bytesPerCPixel is the number of bytes in a CPIXEL.

  Each tile begins with a subencoding type byte.  The top bit of this
  byte is set if the tile has been run-length encoded, clear otherwise.
  The bottom 7 bits indicate the size of the palette used: zero means
  no palette, 1 means that the tile is of a single color, and 2 to 127
  indicate a palette of that size.  The special subencoding values 129
  and 127 indicate that the palette is to be reused from the last tile
  that had a palette, with and without RLE, respectively.

  Note: in this discussion, the div(a,b) function means the result of
  dividing a/b truncated to an integer.

  The possible values of subencoding are:

  0: Raw pixel data. width*height pixel values follow (where width and
     height are the width and height of the tile):

      +-----------------------------+--------------+-------------+
      | No. of bytes                | Type [Value] | Description |
      +-----------------------------+--------------+-------------+
      | width*height*BytesPerCPixel | CPIXEL array | pixels      |
      +-----------------------------+--------------+-------------+










Richardson & Levine           Informational                    [Page 27]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  1: A solid tile consisting of a single color.  The pixel value
     follows:

             +----------------+--------------+-------------+
             | No. of bytes   | Type [Value] | Description |
             +----------------+--------------+-------------+
             | bytesPerCPixel | CPIXEL       | pixelValue  |
             +----------------+--------------+-------------+

  2 to 16:  Packed palette types.  The paletteSize is the value of the
     subencoding, which is followed by the palette, consisting of
     paletteSize pixel values.  The packed pixels follow, with each
     pixel represented as a bit field yielding a zero-based index into
     the palette.  For paletteSize 2, a 1-bit field is used; for
     paletteSize 3 or 4, a 2-bit field is used; and for paletteSize
     from 5 to 16, a 4-bit field is used.  The bit fields are packed
     into bytes, with the most significant bits representing the
     leftmost pixel (i.e., big endian).  For tiles not a multiple of 8,
     4, or 2 pixels wide (as appropriate), padding bits are used to
     align each row to an exact number of bytes.

      +----------------------------+--------------+--------------+
      | No. of bytes               | Type [Value] | Description  |
      +----------------------------+--------------+--------------+
      | paletteSize*bytesPerCPixel | CPIXEL array | palette      |
      | m                          | U8 array     | packedPixels |
      +----------------------------+--------------+--------------+

     where m is the number of bytes representing the packed pixels.
     For paletteSize of 2, this is div(width+7,8)*height; for
     paletteSize of 3 or 4, this is div(width+3,4)*height; or for
     paletteSize of 5 to 16, this is div(width+1,2)*height.

  17 to 126:  Unused.  (Packed palettes of these sizes would offer no
     advantage over palette RLE).

  127:  Packed palette with the palette reused from the previous tile.
     The subencoding byte is followed by the packed pixels as described
     above for packed palette types.

  128:  Plain RLE.  The data consists of a number of runs, repeated
     until the tile is done.  Runs may continue from the end of one row
     to the beginning of the next.  Each run is represented by a single
     pixel value followed by the length of the run.  The length is
     represented as one or more bytes.  The length is calculated as one
     more than the sum of all the bytes representing the length.  Any
     byte value other than 255 indicates the final byte.  So for




Richardson & Levine           Informational                    [Page 28]

RFC 6143             The Remote Framebuffer Protocol          March 2011


     example, length 1 is represented as [0], 255 as [254], 256 as
     [255,0], 257 as [255,1], 510 as [255,254], 511 as [255,255,0], and
     so on.

   +-------------------------+--------------+-----------------------+
   | No. of bytes            | Type [Value] | Description           |
   +-------------------------+--------------+-----------------------+
   | bytesPerCPixel          | CPIXEL       | pixelValue            |
   | div(runLength - 1, 255) | U8 array     | 255                   |
   | 1                       | U8           | (runLength-1) mod 255 |
   +-------------------------+--------------+-----------------------+

  129:  Palette RLE with the palette reused from the previous tile.
     Followed by a number of runs, repeated until the tile is done, as
     described below for 130 to 255.

  130 to 255:  Palette RLE.  Followed by the palette, consisting of
     paletteSize = (subencoding - 128) pixel values:

       +----------------------------+--------------+-------------+
       | No. of bytes               | Type [Value] | Description |
       +----------------------------+--------------+-------------+
       | paletteSize*bytesPerCPixel | CPIXEL array | palette     |
       +----------------------------+--------------+-------------+

     Following the palette is, as with plain RLE, a number of runs,
     repeated until the tile is done.  A run of length one is
     represented simply by a palette index:

             +--------------+--------------+--------------+
             | No. of bytes | Type [Value] | Description  |
             +--------------+--------------+--------------+
             | 1            | U8           | paletteIndex |
             +--------------+--------------+--------------+

     A run of length more than one is represented by a palette index
     with the top bit set, followed by the length of the run as for
     plain RLE.

   +-------------------------+--------------+-----------------------+
   | No. of bytes            | Type [Value] | Description           |
   +-------------------------+--------------+-----------------------+
   | 1                       | U8           | paletteIndex + 128    |
   | div(runLength - 1, 255) | U8 array     | 255                   |
   | 1                       | U8           | (runLength-1) mod 255 |
   +-------------------------+--------------+-----------------------+





Richardson & Levine           Informational                    [Page 29]

RFC 6143             The Remote Framebuffer Protocol          March 2011


7.7.6.  ZRLE

  ZRLE stands for Zlib (see [RFC1950] and [RFC1951]) Run-Length
  Encoding, and combines an encoding similar to TRLE with zlib
  compression.  On the wire, the rectangle begins with a 4-byte length
  field, and is followed by that many bytes of zlib-compressed data.  A
  single zlib "stream" object is used for a given RFB protocol
  connection, so that ZRLE rectangles must be encoded and decoded
  strictly in order.

              +--------------+--------------+-------------+
              | No. of bytes | Type [Value] | Description |
              +--------------+--------------+-------------+
              | 4            | U32          | length      |
              | length       | U8 array     | zlibData    |
              +--------------+--------------+-------------+

  The zlibData when uncompressed represents tiles in left-to-right,
  top-to-bottom order, similar to TRLE, but with a tile size of 64x64
  pixels.  If the width of the rectangle is not an exact multiple of
  64, then the width of the last tile in each row is smaller, and if
  the height of the rectangle is not an exact multiple of 64, then the
  height of each tile in the final row is smaller.

  The tiles are encoded in exactly the same way as TRLE, except that
  subencoding may not take the values 127 or 129, i.e., palettes cannot
  be reused between tiles.

  The server flushes the zlib stream to a byte boundary at the end of
  each ZRLE-encoded rectangle.  It need not flush the stream between
  tiles within a rectangle.  Since the zlibData for a single rectangle
  can potentially be quite large, clients can incrementally decode and
  interpret the zlibData but must not assume that encoded tile data is
  byte aligned.

7.8.  Pseudo-Encodings

  An update rectangle with a "pseudo-encoding" does not directly
  represent pixel data but instead allows the server to send arbitrary
  data to the client.  How this data is interpreted depends on the
  pseudo-encoding.

7.8.1.  Cursor Pseudo-Encoding

  A client that requests the Cursor pseudo-encoding is declaring that
  it is capable of drawing a pointer cursor locally.  This can
  significantly improve perceived performance over slow links.  The
  server sets the cursor shape by sending a rectangle with the Cursor



Richardson & Levine           Informational                    [Page 30]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  pseudo-encoding as part of an update.  The rectangle's x-position and
  y-position indicate the hotspot of the cursor, and width and height
  indicate the width and height of the cursor in pixels.  The data
  consists of width*height raw pixel values followed by a shape
  bitmask, with one bit corresponding to each pixel in the cursor
  rectangle.  The bitmask consists of left-to-right, top-to-bottom scan
  lines, where each scan line is padded to a whole number of bytes, the
  number being div(width+7,8).  Within each byte, the most significant
  bit represents the leftmost pixel; a bit set to 1 means the
  corresponding pixel in the cursor is valid.

      +----------------------------+--------------+---------------+
      | No. of bytes               | Type [Value] | Description   |
      +----------------------------+--------------+---------------+
      | width*height*bytesPerPixel | PIXEL array  | cursor-pixels |
      | div(width+7,8)*height      | U8 array     | bitmask       |
      +----------------------------+--------------+---------------+

7.8.2.  DesktopSize Pseudo-Encoding

  A client that requests the DesktopSize pseudo-encoding is declaring
  that it is capable of coping with a change in the framebuffer width
  and height.  The server changes the desktop size by sending a
  rectangle with the DesktopSize pseudo-encoding as the last rectangle
  in an update.  The rectangle's x-position and y-position are ignored,
  and width and height indicate the new width and height of the
  framebuffer.

  There is no further data associated with the rectangle.  After
  changing the desktop size, the server must assume that the client no
  longer has the previous framebuffer contents.  This will usually
  result in a complete update of the framebuffer at the next update.
  However, for maximum interoperability with existing servers the
  client should preserve the top-left portion of the framebuffer
  between the old and new sizes.

8.  IANA Considerations

  IANA has allocated port 5900 to the RFB protocol.  The other port
  numbers mentioned in Section 2 are called out for historical context
  and do not match IANA allocations.

  Future assignments to the IANA registries created by this
  specification are to be made through either "Expert Review" or "IESG
  Approval" (if there is no currently appointed expert) as defined in
  [RFC5226].





Richardson & Levine           Informational                    [Page 31]

RFC 6143             The Remote Framebuffer Protocol          March 2011


8.1.  RFB Security Types

8.1.1.  Registry Name

  The name of this registry is "Remote Framebuffer Security Types".

8.1.2.  Registry Contents

  IANA established a registry for security types that are used with the
  RFB protocol.

  The initial entries in the registry are:

    +------------+-------------------------+-----------------------+
    | Number     | Name                    | References            |
    +------------+-------------------------+-----------------------+
    | 0          | Invalid                 | (this document)       |
    | 1          | None                    | (this document)       |
    | 2          | VNC Authentication      | (this document)       |
    | 3 to 15    | RealVNC                 | (historic assignment) |
    | 16         | Tight                   | (historic assignment) |
    | 17         | Ultra                   | (historic assignment) |
    | 18         | TLS                     | (historic assignment) |
    | 19         | VeNCrypt                | (historic assignment) |
    | 20         | GTK-VNC SASL            | (historic assignment) |
    | 21         | MD5 hash authentication | (historic assignment) |
    | 22         | Colin Dean xvp          | (historic assignment) |
    | 128 to 255 | RealVNC                 | (historic assignment) |
    +------------+-------------------------+-----------------------+

8.2.  Client-to-Server Message Types

8.2.1.  Registry Name

  The name of this registry is "Remote Framebuffer Client-to-Server
  Message Types".

8.2.2.  Registry Contents

  IANA established a registry for client-to-server message types that
  are used with the RFB protocol.

  The initial entries in the registry are:








Richardson & Levine           Informational                    [Page 32]

RFC 6143             The Remote Framebuffer Protocol          March 2011


    +--------+------------------------------+-----------------------+
    | Number | Name                         | References            |
    +--------+------------------------------+-----------------------+
    | 0      | SetPixelFormat               | (this document)       |
    | 2      | SetEncodings                 | (this document)       |
    | 3      | FramebufferUpdateRequest     | (this document)       |
    | 4      | KeyEvent                     | (this document)       |
    | 5      | PointerEvent                 | (this document)       |
    | 6      | ClientCutText                | (this document)       |
    | 127    | VMWare                       | (historic assignment) |
    | 128    | Nokia Terminal Mode Spec     | (historic assignment) |
    | 249    | OLIVE Call Control           | (historic assignment) |
    | 250    | Colin Dean xvp               | (historic assignment) |
    | 251    | Pierre Ossman SetDesktopSize | (historic assignment) |
    | 252    | tight                        | (historic assignment) |
    | 253    | gii                          | (historic assignment) |
    | 254    | VMWare                       | (historic assignment) |
    | 255    | Anthony Liguori              | (historic assignment) |
    +--------+------------------------------+-----------------------+

8.3.  Server-to-Client Message Types

8.3.1.  Registry Name

  The name of this registry is "Remote Framebuffer Server-to-Client
  Message Types".

8.3.2.  Registry Contents

  IANA established a registry for server-to-client message types that
  are used with the RFB protocol.

  The initial entries in the registry are:


















Richardson & Levine           Informational                    [Page 33]

RFC 6143             The Remote Framebuffer Protocol          March 2011


      +--------+--------------------------+-----------------------+
      | Number | Name                     | References            |
      +--------+--------------------------+-----------------------+
      | 0      | FramebufferUpdate        | (this document)       |
      | 1      | SetColourMapEntries      | (this document)       |
      | 2      | Bell                     | (this document)       |
      | 3      | ServerCutText            | (this document)       |
      | 127    | VMWare                   | (historic assignment) |
      | 128    | Nokia Terminal Mode Spec | (historic assignment) |
      | 249    | OLIVE Call Control       | (historic assignment) |
      | 250    | Colin Dean xvp           | (historic assignment) |
      | 252    | tight                    | (historic assignment) |
      | 253    | gii                      | (historic assignment) |
      | 254    | VMWare                   | (historic assignment) |
      | 255    | Anthony Liguori          | (historic assignment) |
      +--------+--------------------------+-----------------------+

8.4.  RFB Encoding Types

8.4.1.  Registry Name

  The name of this registry is "Remote Framebuffer Encoding Types".

8.4.2.  Registry Contents

  IANA established a registry for encoding types that are used with the
  RFB protocol.

  The initial entries in the registry are:






















Richardson & Levine           Informational                    [Page 34]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  +-------------------+----------------------------+------------------+
  | Number            | Name                       | References       |
  +-------------------+----------------------------+------------------+
  | 0                 | Raw                        | (this document)  |
  | 1                 | CopyRect                   | (this document)  |
  | 2                 | RRE                        | (this document)  |
  | 5                 | Hextile                    | (this document)  |
  | 16                | ZRLE                       | (this document)  |
  | -239              | Cursor pseudo-encoding     | (this document)  |
  | -223              | DesktopSize                | (this document)  |
  |                   | pseudo-encoding            |                  |
  | 4                 | CoRRE                      | (historic        |
  |                   |                            | assignment)      |
  | 6                 | zlib                       | (historic        |
  |                   |                            | assignment)      |
  | 7                 | tight                      | (historic        |
  |                   |                            | assignment)      |
  | 8                 | zlibhex                    | (historic        |
  |                   |                            | assignment)      |
  | 15                | TRLE                       | (this document)  |
  | 17                | Hitachi ZYWRLE             | (historic        |
  |                   |                            | assignment)      |
  | 1024 to 1099      | RealVNC                    | (historic        |
  |                   |                            | assignment)      |
  | -1 to -222        | tight options              | (historic        |
  |                   |                            | assignment)      |
  | -224 to -238      | tight options              | (historic        |
  |                   |                            | assignment)      |
  | -240 to -256      | tight options              | (historic        |
  |                   |                            | assignment)      |
  | -257 to -272      | Anthony Liguori            | (historic        |
  |                   |                            | assignment)      |
  | -273 to -304      | VMWare                     | (historic        |
  |                   |                            | assignment)      |
  | -305              | gii                        | (historic        |
  |                   |                            | assignment)      |
  | -306              | popa                       | (historic        |
  |                   |                            | assignment)      |
  | -307              | Peter Astrand DesktopName  | (historic        |
  |                   |                            | assignment)      |
  | -308              | Pierre Ossman              | (historic        |
  |                   | ExtendedDesktopSize        | assignment)      |
  | -309              | Colin Dean xvp             | (historic        |
  |                   |                            | assignment)      |
  | -310              | OLIVE Call Control         | (historic        |
  |                   |                            | assignment)      |
  | -412 to -512      | TurboVNC fine-grained      | (historic        |
  |                   | quality level              | assignment)      |



Richardson & Levine           Informational                    [Page 35]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  | -523 to -524      | Nokia Terminal Mode Spec   | (historic        |
  |                   |                            | assignment)      |
  | -763 to -768      | TurboVNC subsampling level | (historic        |
  |                   |                            | assignment)      |
  | 0x574d5600 to     | VMWare                     | (historic        |
  | 0x574d56ff        |                            | assignment)      |
  +-------------------+----------------------------+------------------+

9.  Security

  The RFB protocol as defined here provides no security beyond the
  optional and cryptographically weak password check described in
  Section 7.2.2.  In particular, it provides no protection against
  observation of or tampering with the data stream.  It has typically
  been used on secure physical or virtual networks.

  Security methods beyond those described here may be used to protect
  the integrity of the data.  The client and server might agree to use
  an extended security type to encrypt the session, or the session
  might be transmitted over a secure channel such as IPsec [RFC4301] or
  SSH [RFC4254].

10.  Acknowledgements

  James Weatherall, Andy Harter, and Ken Wood also contributed to the
  design of the RFB protocol.

  RFB and VNC are registered trademarks of RealVNC Ltd. in the U.S. and
  in other countries.

11.  References

11.1.  Normative References

  [RFC1950]  Deutsch, L. and J-L. Gailly, "ZLIB Compressed Data Format
             Specification version 3.3", RFC 1950, May 1996.

  [RFC1951]  Deutsch, P., "DEFLATE Compressed Data Format Specification
             version 1.3", RFC 1951, May 1996.

  [XLIBREF]  Nye, A., "XLIB Reference Manual R5", June 1994.

11.2.  Informative References

  [RFC4254]  Ylonen, T. and C. Lonvick, "The Secure Shell (SSH)
             Connection Protocol", RFC 4254, January 2006.





Richardson & Levine           Informational                    [Page 36]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  [RFC4301]  Kent, S. and K. Seo, "Security Architecture for the
             Internet Protocol", RFC 4301, December 2005.

  [RFC5226]  Narten, T. and H. Alvestrand, "Guidelines for Writing an
             IANA Considerations Section in RFCs", BCP 26, RFC 5226,
             May 2008.













































Richardson & Levine           Informational                    [Page 37]

RFC 6143             The Remote Framebuffer Protocol          March 2011


Appendix A.  Differences in Earlier Protocol Versions

  For maximum interoperability, clients and servers should be prepared
  to fall back to the earlier 3.3 and 3.7 versions of the RFB protocol.
  Any version reported other than 3.7 or 3.8 should be treated as 3.3.

  All of the differences occur in the initial handshake phase.  Once
  the session reaches the ClientInit and ServerInit messages, all three
  protocol versions are identical.  Even within a protocol version,
  clients and servers may support different subsets of the encoding and
  pseudo-encoding types.

A.1.  Differences in the Version 3.3 Protocol

  The ProtocolVersion message is:

      RFB 003.003\n (hex 52 46 42 20 30 30 33 2e 30 30 33 0a)

  In the security handshake (Section 7.1.2), rather than a two-way
  negotiation, the server decides the security type and sends a single
  word:

             +--------------+--------------+---------------+
             | No. of bytes | Type [Value] | Description   |
             +--------------+--------------+---------------+
             | 4            | U32          | security-type |
             +--------------+--------------+---------------+

  The security-type may only take the value 0, 1, or 2.  A value of 0
  means that the connection has failed and is followed by a string
  giving the reason, as described in Section 7.1.2.

  If the security-type is 1, for no authentication, the server does not
  send the SecurityResult message but proceeds directly to the
  initialization messages (Section 7.3).

  In VNC Authentication (Section 7.2.2), if the authentication fails,
  the server sends the SecurityResult message, but does not send an
  error message before closing the connection.

A.2.  Differences in the Version 3.7 Protocol

  The ProtocolVersion message is:

      RFB 003.007\n (hex 52 46 42 20 30 30 33 2e 30 30 37 0a)






Richardson & Levine           Informational                    [Page 38]

RFC 6143             The Remote Framebuffer Protocol          March 2011


  After the security handshake, if the security-type is 1, for no
  authentication, the server does not send the SecurityResult message
  but proceeds directly to the initialization messages (Section 7.3).

  In VNC Authentication (Section 7.2.2), if the authentication fails,
  the server sends the SecurityResult message, but does not send an
  error message before closing the connection.

Authors' Addresses

  Tristan Richardson
  RealVNC Ltd.
  Betjeman House, 104 Hills Road
  Cambridge  CB2 1LQ
  UK

  Phone: +44 1223 310400
  EMail: [email protected]
  URI:   http://www.realvnc.com


  John Levine
  RealVNC Ltd.

  Phone: +44 1223 790005
  EMail: [email protected]
  URI:   http://jl.ly
























Richardson & Levine           Informational                    [Page 39]