02 mysql連線階段

2021-07-31 05:13:47 字數 3458 閱讀 7239

連線階段執行以下任務:

- 交換客戶端和伺服器的功能(capabilities)

- 如果需要,設定ssl通訊通道

- 根據伺服器驗證客戶端

初始握手開始於伺服器傳送initial handshake packet給客戶端。

此後,可選地,客戶端可以請求使用ssl connection request packet建立ssl connection request packet ,然後客戶端傳送handshake response packet 。

認證使用者的方法儲存在mysql.user表的plugin列中。客戶端的握手響應包中包含登入使用者, 伺服器使用握手響應包中的登入使用者查詢mysql.user表中的使用者資訊,並找到要使用的身份驗證方法。

服務的在初始化握手包中使用了預設的身份認證方式,客戶端可以選擇是否使用該認證方式。如果客戶端的認證方式和服務的認證方式不匹配,那麼服務端使用authentication method switch request packet報文通知客戶端。

mysql4.0的mysql協議僅支援old password authentication ,mysql4.1中新增了secure password authentication方法,而在mysql5.5中,可以通過認證外掛程式實現任意認證方式。

如果客戶端或伺服器不支援可插拔身份驗證( client_plugin_auth能力標誌未設定),則使用的身份驗證方法從客戶端和伺服器功能推斷如下:

1.如果未設定client_protocol_41或client_secure_connection則使用的方法是old password authentication 。

2.如果client_protocol_41和client_secure_connection都已設定但client_plugin_auth未設定,則使用的方法是secure password authentication 。

成功的快速認證路徑如下所示:

注意:許多身份驗證方法,包括本地mysql密碼方法,由乙個請求響應組成。 在這種情況下,在步驟4中不需要交換額外的資料報,伺服器在接收到handshake response packet後,客戶端授權成功後,直接傳送ok_packet 。

伺服器通過傳送err_packet報文告訴客戶端不允許進行連線。 這可能會在初次握手後的任何時刻發生。

當客戶端連線到伺服器時,伺服器向客戶端傳送握手包。

自從3.21.0版本是握手包使用handshakev10,從4.1開始握手響應包使用handshakeresponse41

下面是列舉handshakev10和handshakeresponse41,ssl等其他報文略去

1              [0

a] protocol version

string[nul] server version

4 connection id

string[8] auth-plugin-data-part-1

1 [00] filler

2 capability flags (lower

2bytes)

if more data in

the packet:

1character

set2 status flags

2 capability flags (upper

2bytes)

if capabilities & client_plugin_auth else

string[10] reserved (all [00])

if capabilities & client_secure_connection

字段詳解:

1. protocol_version (1):值是0x0a,協議版本號

2. server_version (string.nul): 伺服器版本號,字元表示

3. connection_id (4):連線id

4. auth_plugin_data_part_1 (string.fix_len):固定長度為8個位元組

5. filler_1 (1):佔位符,值為0x00

6. capability_flag_1 (2):能力標示,低位元組2位

7. character_set (1):字元集合

8. status_flags (2):protocol::statusflags (optional)

9. capability_flags_2 (2):能力標示,高位元組2位

10. auth_plugin_data_len (1) :length of the combined auth_plugin_data, if auth_plugin_data_len is > 0

11. auth_plugin_name (string.nul) :name of the auth_method that the auth_plugin_data belongs to

4              capability flags, client_protocol_41 always set

4max-packet size

1character

setstring[23] reserved (all [0])

string[nul] username

if capabilities & client_plugin_auth_lenenc_client_data else

if capabilities & client_secure_connection else

if capabilities & client_connect_with_db

if capabilities & client_plugin_auth

if capabilities & client_connect_attrs

字段詳解:

1. capability_flags (4):客戶端能力標示

max_packet_size (4) :客戶端發給服務端最大命令包大小

character_set (1) :字符集

username (string.fix_len):使用者名稱,使用字符集表示字元

auth-response (string.nul):根據認證方法生成的認證資料(登入密碼加密)

database (string.nul) :初始資料庫,使用字符集表示字元

auth plugin name (string.nul):生成認證資料的認證方法名稱,是個utf-8字串

mysql能力標示請參考:

MYSQL學習02 MySQL基礎操作

學習sql的基本查詢。語法 select column 1,column 2,from table 1 inner left right join table 2 on conditions where conditions group by column 1 h ing group conditi...

02 MySql入門學習 約束

約束是一種限制,通過對錶行或列的資料做出限制,來確保資料的完整性和唯一性等 作用 限制某乙個字段不能為空 語法 欄位名 型別 長度 not null,圖形介面操作 作用 限制列 該欄位 的值只能是唯一的,該列不能出現重複的值 語法 字段 型別 長度 unique,圖形介面操作 無 作用 表示字段唯一...

MySQL高階 02 MySQL觸發器

1.觸發器的概念 觸發器型別 old的含義 new的含義 insert 型觸發器 無 因為插入前狀態無資料 new 表示將要或者已經新增的資料 update 型觸發器 old 表示修改之前的資料 new 表示將要或已經修改後的資料 delete 型觸發器 old 表示將要或者已經刪除的資料 無 因為...