MYSQL 連線登入過程分析

darren__chan發表於2018-10-17

 

MYSQL 連線登入過程分析

在較新MYSQL版本中,預設沒有開啟執行緒池的功能,每個客戶連線在伺服器程式中都擁有自己的執行緒。


當客戶端(應用)連線到MySQL伺服器時,伺服器要對其進行認證(Authenticate),認證方式基於使用者名稱、原始主機資訊和口令。

登入 mysql 可以通過 Unix socket TCP 兩種方式登陸,

Unix socket 是實現程式間通訊的一種方式, mysql 支援利用 Unix socket 來實現客戶端 - 服務端的通訊,但要求客戶端和服務端在同一臺機器上。對於 unix socket 而言,同樣也是一種套接字,監聽執行緒會同時監聽 TCP socket Unix socket ,接受到請求然後處理,後續的處理邏輯都是一致的,只不過底層通訊方式不一樣罷了。此處具體分析 TCP 的方式。


具體過程,裡面會涉及 client server 的互動,並通過 tcpdump 抓包來展現這一過程。

MYSQL 連線握手過程

MYSQL 的遠端登入連線是基於 TCP 3 次握手機制, TCP 連線建立成功後, mysql 客戶端與 mysql 服務端開始進行通訊,進行 mysql 認證過程。

(1)   服務端首先會發一個握手包到客戶端,

(2)   然後客戶端向服務端傳送認證資訊 ( 使用者名稱,密碼等 )

(3)   服務端收到認證包後,會檢查使用者名稱與密碼是否合法,併傳送包告知客戶端認證資訊。如果合法,則登陸成功,否則,登陸失敗。連線報錯。

tcpdump  過程    

xx.xxx.7.102 代表客戶端,

xx.xxx.7.104 代表伺服器端,

3306 是伺服器的監聽埠號。

(1). 在客戶端上開啟 tcpdump 命令,監聽與 xx.xxx.7.104   3306 埠的通訊網路包,命令如下:

tcpdump -S -nn -tttt -i bond0 host xx.xxx.7.104 and port 3306 and tcp -c 100
-nn 不進行埠名稱的轉換。
-tttt 在每一行中輸出由date處理的預設格式的時間戳。
-i bond0 指定監聽的網路介面
 host xx.xxx.7.104 and port 3306  監聽xx.xxx.7.104 的3306埠的網路包
-c 100 表示監聽100包就結束
 

此處使用以下命令生成cap檔案使用wireshark軟體檢視,可以看到更詳細的資訊,包括資料包內容。
tcpdump     -i   bond0   host xx.xxx.7.104 and port 3306 -w  /tmp/1.cap --生成cap檔案
 

(2). 在客戶端上,利用 mysql 命令遠端連線服務端 xx.xxx.7.104

mysql –hxx.xxx.7.104 –P3306 –uxxx –pxxx

登陸成功後,然後直接執行 exit ,退出

(3) 分析 tcpdump 抓取的網路包,如下:

資料包標記解析

S=SYN   發起連線標誌,一般用於建立 TCP 連線

P=PUSH 傳送資料標誌,一般用於傳輸資料

F=FIN   關閉連線標誌,一般用於關閉 TCP 連線

ack     表示應答包

RST= RESET  異常關閉連線

. 表示沒有任何標誌

1 部分是 TCP 連線建立的 3 次握手過程 :

102 (客戶端)向 104 (服務端)發起連線 ------

104 (服務端)向 102 (客戶端)發起連線和應答包 -----

102 (客戶端)向 104 (服務端)發起應答 -----

TCP 建立連線。

 

2 部分是 MYSQL 認證的過程 :

4 5 步是服務端向客戶端傳送服務端的一些資訊,從包內容可以看出,包含 version, 字符集等。。

真正的登入請求是從第 6 步開始:

102 (客戶端)向 104 (服務端)發起登入認證請求,使用者是 root------>

104 (服務端)首先在 tcp 返回應答包 , 表示 tcp 連線存在 ------

接著, 104 (服務端)認證通過,返回 OK------->

登入成功

在第 6 步傳送的資料包,包含了使用者密碼這些資訊的報文。

 

3 部分是登陸成功後,傳送基本後設資料資訊的過程,

102 (客戶端)向 104 (服務端)發起查詢請求 --------

104 (服務端)向 102 (客戶端)返回資訊 --------

102 (客戶端)返回應答包 --------

查詢完成。

 

4 部分是斷開連線的過程

 

MYSQL 監聽及連線執行緒

MYSQL 監聽基於 TCP 協議 ,在伺服器的 3306 埠, MySQL 服務反覆監聽是否有客戶端發過來的請求:

當新的連線成功後,連線會話是在資料庫中建立一個新的前臺執行緒。

該前臺執行緒在資料庫中有自己的 id, 同時對應到 os 層面存在相應的執行緒號,該執行緒是在 mysqld 程式下。

 

 

 



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29863023/viewspace-2216731/,如需轉載,請註明出處,否則將追究法律責任。

相關文章