Get desktop application:
View/edit binary Protocol Buffers messages
/ Describe an ICE candidate address
Used in:
optional string sdpm_id = 1; optional uint32 sdpm_line_index = 2;
ICE rendezvous message, sent reliably FIXME - should use oneof when it is available in all branches we care about
Used in:
ICE candidate
optional Candidate remove_candidate = 2;
Auth info used for STUN to avoid crossing the streams. This is sent very early in the handshake (in the ConnectRequest / ConnectOKC)
Used in:
A public key used for crypto key exchange and identity. This is basically the portion of a certificate over which the signature is generated. (It is broken into a separate message to make it easy to keep the exact bytes that were signed intact during transport.)
Used in:
Single user key? This might not be set if the key is shared!
Allow any server in particular data centers to use it?
Restricted time range?
Restrict key to be used for a particular AppID(s)?
Restrict key to be used for a particular IP address ranges? This is a list of strings. At the time of this writing, each string must be a single IPv4 or a single IPv6.
Used in:
A request by a client to a CA to issue a cert.
An unsigned cert. The requestor will populate the fields appropriate to the request. (Who do you thin you are, what app(s) would you like access for, etc) Most importantly, the caller must fill in the public key they want to use
Certificate signed by a certificate authority.
Used in:
, , ,The public key associated with my identity. This is a longer standing key that can be used for multiple connections. It's a serialized version of CMsgSteamDatagramCertificate, but because the signature is based on a particular serialization of that message, we keep the original serialization here.
/ The key that was used by the certificate authority to sign / my public key. This might be empty if the key is unsigned. (It's up to the endpoint to decide if they want to accept that or not.)
/ Signature over the certificate, using the key identified / by ca_key_id.
/ In a few instances, we want to use the same message to include the private / key and the corresponding cert. Most of the time this field should not be / present!
/ Message containing connection quality related messages / (possibly inline with a data packet)
Used in:
optional uint32 seqnum_ack_lifetime = 3;
k_ESteamDatagramMsg_Diagnostic
Standard Steam emit levels: 1 = error, 2 = warning, 3 = info, 4 = verbose
Message text
/ Wire version of SteamDatagramLinkInstantaneousStats. / We use integers instead of floats to send this stuff, / so that most fields take 1 or 2 bytes, instead of / always taking 4.
Used in:
0 ... 100
0 ... 100
/ Wire version of SteamDatagramLinkLifetimeStats
optional uint32 rms_ping_ms = 1;
Used in:
Duration of the connection (so far, if we are still connected). This is primarily used when reporting end-to-end stats to relays, who may not have been involved with the connection for its entire duration
Packet counters
If multipath send or receive was used, then the samples for how many we received on each path
How often we received a sequenced packet only this path, but another path one the race and so we discarded this one
/ Histogram of connection quality. Here we count up the number / of connection quality measurement intervals (about 5 seconds) / that fell into each quality measurement. Quality measurment / is the percentage of packets that were delivered, in order, / without being duplicated
This means everything was perfect. Even if we delivered over 100 packets in the interval and we should round up to 100, we will use 99% instead.
99%+
we received nothing during the interval; it looks like the connection dropped
2% of measurement intervals had quality <= N%
5% of measurement intervals had quality <= N%
25% of measurement intervals had quality <= N%
50% of measurement intervals had quality <= N%
/ Distribution of ping times.
0..25
26..50
51..75
etc
>300
5% of ping samples were <= Nms
50% of ping samples were <= Nms
70% of ping samples were <= Nms
95% of ping samples were <= Nms
98% of ping samples were <= Nms
/ Jitter distribution.
<1ms
1..2
2..5
5..10
10..20
20+
Used in crypto handshake. Clients describe what they are willing to use, servers decide what will be used, and reply with the negotiated values.
Additional nonce used for key generation
Protocol version used. Must match the version in the header
/ Clients specify the list of ciphers, in preference order. / Servers will specify only the single cipher they selected (assuming they allowed the connection). / If this list is empty (legacy client), then it should be interpreted the same / as if there were a single entry with k_ESteamNetworkingSocketsCipher_AES_256_GCM
Key used for Diffie-Hellman key exchange. Typically this should be an ephemeral key used only for this connection.
Used in:
Session keys used in key exchange
Used in:
, , ,/ Serialized CMsgSteamDatagramSessionCryptInfo
/ Signature of encryption_key_data generated using the public key / from the CMsgSteamDatagramCertificate.
A summary of what happened in an ICE session, for analytics
What was the overall outcome of ICE? Should always be set. Will be zero if ICE succeeded
ESteamNetConnectionEnd (or special internal value), if we failed in some way
What types of candidates were we able to gather? Should always be present if this message is sent
k_EICECandidate_xxx
What types of candidates did we receive from peer?
k_EICECandidate_xxx
Initial route type, and ping, when when we first pierced NAT. Will not be present if we never pierced NAT
ESteamNetTransportKind
How long did it take to get a NAT traversal result (either success or failure)
Best route and score we ever had over the life of the connection
ESteamNetTransportKind
seconds into the connections when this happened
How long were we the selcted transport?
User options that were in effect, applied to this connection. (Meaning depends on platform.)
Value of the P2P_Transport_ICE_Enable connection configuration value that was set, or determined from user settings
What sorts of candidates were we allowed to gather, based on user settings AND local configuration
// k_EICECandidate_xxx
Legacy binary format. Now the string format is always used, even over the wire. This is a bit wasteful. But the benefit of the string format is that it's must easier to make forward comaptible. So we can add new identity types without updating all old clients that may possibly interact with the new identity type. In many cases, the old client doesn't really need to "understand" the type, and the string format actually works great.
Used in:
, ,/ Introducer message sent through trusted 3rd party (Steam, or some other custom signaling)
Identity of who this is from
Connection this is from
Destination identity, if I know it. If we are using FakeIP and don't know the destination's real identity, this will be the fake IP.
Destination connection ID, if I know it.
SDR routing information. (Serialized CMsgSteamDatagramP2PRoutes)
This is the latest SDR route revision I have for you. On older clients this might not always be present, until they have received some SDR routes. Newer clients always populate this, if they are willing to do SDR peer-to-peer routing.
Is ICE enabled?
I'm a hosted dedicated server. Please use the more optimal path to talk to me.
CMsgSteamDatagramSignedRelayAuthTicket
Last message that we have received
ID of first message we are sending (if any)
App messages. In certain circumstances we actually send application messages in the signals, instead of waiting until rendezvous completes.
Used in:
NOTE: Currently only unreliable messages are supported!
Message bytes
Probably a waste of a few bytes
Also probably a waste of a few bytes
Only present if nonzero. (At the time of this writing, it's zero for all use cases.)
Used in:
Connect request
Used in:
From FakeIP. Will only be present if we have a global-allocated FakeIP and we are attempting to connect by FakeIP
Graceful close
Used in:
A reliable message. FIXME - should use oneof when it is available in all branches we care about
Used in:
Currently only ICE uses the reliable message stream, but this may change
k_ESteamNetworkingUDPMsg_ChallengeReply
optional uint32 required_proof_of_work_bits = 3;
the my_timestamp you sent to us in ChallengeRequest
Version of the code I'm running
k_ESteamNetworkingUDPMsg_ChallengeRequest
optional fixed64 client_steam_id = 2;
Please send this back to me
Version of the code I'm running
k_ESteamDatagramMsg_UDP_ConnectOK
the timestamp (or whatever) you send to us in ConnectRequest
number of microseconds between when we received your request and we replied
/ My ephemeral keys, and any crypto parameter negotiation.
/ Certificate used to prove my identity
Identity of server is in the cert, usually. (Even if cert is unsigned.) But, if cert was not issued to my specific identity (e.g. it is for all gameservers in a data center, etc) then I need to communicate my identity seperately.
optional uint32 protocol_version = 9; // moved into crypt, to prevent tampering
k_ESteamNetworkingUDPMsg_ConnectRequest
optional fixed64 proof_of_work = 4;
Please send this back to me
My estimate of the ping time
/ My ephemeral keys, and any crypto parameter negotiation.
/ Certificate that contains: / - my public key. / - my identity, if certificate was issued to a single user / - signature of a CA, if authenticated connection is being attempted.
Version of the code I'm running. This has been moved into the signed crypt parameters so that it could not be forged.
Identity of host making connect request is in the cert, usually. (Even if cert is unsigned.) But, if cert was not issued to my specific identity (e.g. it is for all gameservers in a data center, etc) then I need to communicate my identity seperately.
k_ESteamDatagramMsg_UDP_ConnectionClosed
optional fixed32 legacy_client_connection_id = 1;
k_ESteamDatagramMsg_UDP_NoConnection
optional fixed32 legacy_client_connection_id = 1; // The client-side connection ID
"My" portion of the connection ID you tried to use (always present), but that connection doesn't exist or has been closed.
Your portion of the connection ID you sent (if any)
End to end stats
/ Additional flags. Should we try to put these in the / message header and save a few bytes?
ACK_REQUEST_RELAY = 1; // Reserved
NOT_PRIMARY_SESSION = 8; // Reserved
Different crypto ciphers we support
Used in:
Dummy value
No encryption or authentication
AES256 in GCM mode with 12-byte security tag. Basically equivalent to TLS_AES_256_GCM_xxx
/ Control message ID.
Steam networking using direct UDP connect
Client->server
Server->client
Client->server
Server->client
Client<->server. A reply is requested to this packet
Client<->server. A reply should never be sent to this packet