1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366
|
/*
* Copyright (c) 2015, 2025, Oracle and/or its affiliates.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License, version 2.0,
* as published by the Free Software Foundation.
*
* This program is designed to work with certain software (including
* but not limited to OpenSSL) that is licensed under separate terms,
* as designated in a particular file or component or in included license
* documentation. The authors of MySQL hereby grant you an additional
* permission to link the program and your derivative works with the
* separately licensed software that they have either included with
* the program or referenced in the documentation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License, version 2.0, for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** @page mysqlx_protocol_lifecycle Life Cycle
Topics in this section:
- @ref lifecycle_Connection
- @ref lifecycle_Session
- @ref lifecycle_Stages_of_Session_Setup
- @ref lifecycle_Authentication
- @ref lifecycle_Pipelining
- @ref lifecycle_Extensions
The following list describes some of the terms introduced in this
section:
@par Transport
Transport layer that exchanges data: TCP sockets, Unix Sockets,
TLS, and so on.
@par Connection
A lower-level connection between two Endpoints.
@par Session
The session maintains the state. User-Variables, Temporary Tables,
and so on.
@par Messages
@ref mysqlx_protocol_messages "Messages" are exchanged between
Endpoints. On a higher level they build a sequence of Messages with
a initial and final Message.
@par Endpoints
A client or a server.
Connection {#lifecycle_Connection}
==========
A default connection supports:
- supports connection capability negotiation via
@ref Mysqlx::Connection::CapabilitiesGet
and
@ref Mysqlx::Connection::CapabilitiesSet
- must support at least one of the following:
- @ref lifecycle_TLS_Extension "TLS Extension"
and PLAIN
@ref mysqlx_protocol_authentication "Authentication"
or
- MYSQL41
@ref mysqlx_protocol_authentication "Authentication"
or another challenge response authentication mechanism
or
- SHA256_MEMORY
@ref mysqlx_protocol_authentication "Authentication"
Session {#lifecycle_Session}
=======
A session owns state like:
- current schema
- current character set
- temporary tables
- user variables
- open transactions
A session is used by the server and the protocol to manage state.
Sessions are:
- opened with
@ref Mysqlx::Session::AuthenticateStart
- reset session state with @ref Mysqlx::Session::Reset
- re-authenticate session with @ref Mysqlx::Session::Reset
- closed with @ref Mysqlx::Session::Close
Closing a session releases all session related data.
Stages of Session Setup {#lifecycle_Stages_of_Session_Setup}
=======================
After a client connects to the server it:
- may ask for the servers capabilities with
@ref Mysqlx::Connection::CapabilitiesGet
- may ask the server to use optional protocol features with
@ref Mysqlx::Connection::CapabilitiesSet
- MUST authenticate
- may send commands
@startuml "Stages of Session Setup"
== Negotiation ==
Client -> Server: CapabilitiesGet()
Server --> Client: { "tls": 0, ... }
Client -> Server: CapabilitiesSet({"tls" : 1})
Server --> Client: Ok
== Authentication ==
Client -> Server: AuthenticateStart(mech="MYSQL41", ...)
Server --> Client: AuthenticateContinue(auth_data="...")
Client -> Server: AuthenticateContinue(auth_data="...")
Server --> Client: AuthenticateOk()
== Commands ==
...
@enduml
In the **Negotiation** step the client checks which features the server
supports on the protocol side.
After a successful finish of the **Authentication** step the previous
Session is discarded and a new Session is created.
Further **Command** Messages run within a Session.
Authentication {#lifecycle_Authentication}
==============
@ref mysqlx_protocol_authentication "Authentication"
supports several authentication mechanisms that can be discovered with
@ref Mysqlx::Connection::CapabilitiesGet.
``authentication.mechanisms``
Server-side supported SASL mechanism:
- before TLS connection established: ``["MYSQL41", "SHA256_MEMORY"]``
- after TLS connection established: ``["PLAIN", "SHA256_MEMORY", "MYSQL41"]``
Required mechanisms:
- PLAIN (over SSL) RFC; [RFC 4616](https://tools.ietf.org/html/rfc4616.html)
(required)
Other known mechanisms:
- MYSQL41 (MySQL 4.1 auth mechanism)
- SHA256_MEMORY
@startuml Authentication
Client -> Server: AuthenticateStart()
loop
Server --> Client: AuthenticateContinue()
Client -> Server: AuthenticateContinue()
end
alt
Server --> Client: Error()
else
Server --> Client: AuthenticateOk()
end
@enduml
Pipelining {#lifecycle_Pipelining}
==========
The messages may be pipelined:
- the client may send the messages without waiting for a reply first
- the client should only send messages which safely trigger an Error
packet
For the server it is no difference if the messages from client where
sent in a bulk or if the client waited. The network and send/receive
buffers of the Operation System will act as queue.
@ref mysqlx_protocol_expectations "Expectations" help to control the
behavior of following messages if a pipelined message fails.
@par Tip
For more information, see @ref mysqlx_protocol_implementation
"Implementation Notes".
Extensions {#lifecycle_Extensions}
==========
If the result of
@ref Mysqlx::Connection::CapabilitiesGet
contains a extension key from the table below it supports the feature.
| Name | Extension |Read/Write|Version |
|--------------------------------|--------------------------------------------------------------------------------|----------|--------|
| ``tls`` | @ref lifecycle_TLS_Extension "TLS" | RW | 5.7 |
| ``authentication.mechanisms`` | @ref lifecycle_Authentication_mechanisms_Extension "Authentication mechanisms" | R | 5.7 |
| ``doc.formats`` | @ref lifecycle_Doc_formats_Extension "Doc formats" | R | 5.7 |
| ``client.interactive`` | @ref lifecycle_Client_interactive_Extension "Client interactive" | RW | 8.0 |
| ``compression`` | @ref lifecycle_Compression_Extension "Compression" | RW | 8.0.18 |
| ``node_type`` | @ref lifecycle_Node_type_Extension "Node type" | R | 5.7 |
| ``client.pwd_expire_ok`` | @ref lifecycle_Client_pwd_expire_ok_Extension "Client pwd expire ok" | RW | 5.7 |
@note
More extensions can be added in future iterations as long as they
are announced in ``CapabilitiesGet()`` and documented.
## TLS Extension {#lifecycle_TLS_Extension}
The client may assume that the server supports a set of features by
default and skip the @ref Mysqlx::Connection::CapabilitiesGet
step:
- if the TLS extension isn't supported, then the
@ref Mysqlx::Connection::CapabilitiesSet will
fail
- if it is supported, then it will succeed
@code{cucumber}
Feature: extensions
Scenario: connecting with TLS, fast path
Given a client side X.509 certificate is provided with user name "foo"
And client certificate is valid
When connecting with TLS established
Then handshake should be single-step
@endcode
@startuml "TLS extension"
== Negotiation ==
Client -> Server: CapabilitiesSet({"tls" : 1})
Server --> Client: Ok
note over Client, Server: TLS handshake
== Authentication ==
Client -> Server: AuthenticateStart(mech="EXTERNAL")
Server --> Client: AuthenticateOk()
== Commands ==
...
@enduml
@ref Mysqlx::Connection::CapabilitiesGet
- ``0``: supported, not in use
- ``1``: supported, in use
@ref Mysqlx::Connection::CapabilitiesSet
- ``1``: switch to TLS connection after server-side Ok
If the server doesn't support the capability, then it will return an
error.
@note
Disabling TLS on a connection may not be supported by the server
and should result in an error.
##Authentication mechanisms Extension {#lifecycle_Authentication_mechanisms_Extension}
This capability return a list that informs the client,
which authentication mechanism may be used while authentication
(AuthenticationStart message).
@note
This list is combination of what server support (has implemented) and
current state of the connection. For example, authentication method like
`PLAIN` is going to be visiable after SSL actication or on SECURE channel:
@startuml
client->server: CapabilityGet
client<-server: Capabilities(authenticatio.mechanisms=[MYSQL41],...)
client->server: CapabilitySet(tls=true)
client->server: Ok
... TLS hanshake, and contiue on top of TLS layer...
client->server: CapabilityGet
client<-server: Capabilities(authenticatio.mechanisms=[MYSQL41, PLAIN],...)
@enduml
@see @ref mysqlx_protocol_authentication section
for more detail about differen authentication mechanisms
##Document formats Extension {#lifecycle_Doc_formats_Extension}
This extension informs how document are encoded by the server.
Currently documents are in text format, still in future it could be changed
to some binary encoding and user might be able to change the format.
##Interactive client Extension {#lifecycle_Client_interactive_Extension}
This extension changes, which timeout-values are used by the server when its
waiting for first byte of a new request.
Its enabled by setting ``client.interactive`` capability to ``true``, it changes
the default of [``mysqlx_wait_timeout``]
(https://dev.mysql.com/doc/refman/8.0/en/x-plugin-options-system-variables.html#sysvar_mysqlx_wait_timeout)
variable, which is going to be initialized from [``mysqlx_interactive_timeout``]
(https://dev.mysql.com/doc/refman/8.0/en/x-plugin-options-system-variables.html#sysvar_mysqlx_interactive_timeout)
variable.
@note
Interactive clients, are application which send their requests after user input,
for example `mysql` or `mysqlsh`. In such case the admin of an server might
consider to extend the timeout values, and shorten for scripts that do SQL batch
execution.
##Compression Extension {#lifecycle_Compression_Extension}
This extension informs what compression algorithms are permitted for use on
X Protocol connections. Currently, the Deflate, LZ4, and zstd algorithms are
supported and permitted by default. To disallow any of the algorithms,
the user can set [``mysqlx_compression_algorithms``]
(https://dev.mysql.com/doc/refman/8.0/en/x-plugin-options-system-variables.html#sysvar_mysqlx_compression_algorithms)
variable to include only the ones permitted.
##Node type Extension {#lifecycle_Node_type_Extension}
This is rather an information to what network node the client connected.
Currently the capability transfers "mysql" value, which points to MySQL Server,
still intermediate network elements like MySQL Router might consider changing
this value to "router".
##Client pasword expire ok Extension {#lifecycle_Client_pwd_expire_ok_Extension}
This extension changes, behavior on server side, where authentication fails
when expired MySQL Server account is used. Setting ``client.interactive``
capability to ``true`` waiting for first byte of a new request.
Its enabled by setting ``client.pwd_expire_oke`` capability to ``true``,
makes the authentication pass which allows user to change the password.
*/
|