2188 lines
90 KiB
Plaintext
2188 lines
90 KiB
Plaintext
|
||
|
||
|
||
|
||
|
||
|
||
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: standards@realvnc.com
|
||
URI: http://www.realvnc.com
|
||
|
||
|
||
John Levine
|
||
RealVNC Ltd.
|
||
|
||
Phone: +44 1223 790005
|
||
EMail: standards@taugh.com
|
||
URI: http://jl.ly
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Richardson & Levine Informational [Page 39]
|
||
|