mysql的連接方式與通信過程

要了解mysql通信協議,就要知道mysql是通過什麼連接的,這個怎麼考率的,mysql是應用,我們需要實現的是mysql客戶端與服務端進行通信,這裏好比http,所以在客戶端找到服務端之前,就需要他們所處的物理機先建立起連接,就如同http建立連接之前,需要tcp先建立連接。

Mysql的主要連接方式包括:Unix套接字,內存共享,命名管道,TCP/IP套接字等。

有的同學可能問了,怎麼這麼多方式,那我用的哪一種呢,或者是我應該用哪一種呢,其實他們並不是等價的

Unix套接字:

在Linux和Unix環境下,可以使用Unix套接字進行Mysql服務器的連接;Unix套接字其實不是一個網絡協議,只能在客戶端和Mysql服務器在同一臺電腦上纔可以使用

命名管道和內存共享

在window系統中客戶端和Mysql服務器在同一臺電腦上,可以使用命名管道和共享內存的方式,
命名管道開啓:–shared-memory=on/off;
共享內存開啓:–enable-named-pipe=on/off;

TCP/IP套接字

任何系統下都可以使用的方式,也是使用的最多的方式,我主要介紹的也是這種方式

其實熟悉操作系統的朋友應該能體會出來,像前兩種,因爲客戶端和服務端在同一臺主機上,也就是一臺主機的兩個應用,所以這也就是進程間通信的方式,而在不同的主機上就不一樣了,就需要網絡,tcp/ip建立了。

mysql通信過程

瞭解了mysql基於的就是tcp的底層協議,所以必然,需要經歷tcp的三次握手,沒錯第一步就是tcp的三次握手(因爲這裏不是重點,就不詳細說明,不太清楚的同學,可以查看我network的相關博客),建立連接之後就可以發送sql命令了嗎,當然不能,細心的同學會發現,我用客戶端登陸的時候,是需要用戶名,密碼的,這纔是真正的mysql客戶端與服務端的交互過程,之前還沒有到應用層,下面就說一下,交互過程

mysql客戶端與服務端的交互過程

主要分爲兩部分:握手認證階段,命令執行階段
注意哦,這個握手和上面過的握手不一樣哦

1.1握手認證階段

握手認證階段爲客戶端與服務器建立連接後進行,交互過程如下:
服務器 -> 客戶端:握手初始化消息
客戶端 -> 服務器:登陸認證消息
服務器 -> 客戶端:認證結果消息

1.2命令執行階段

客戶端認證成功後,會進入命令執行階段,交互過程如下:
客戶端 -> 服務器:執行命令消息
服務器 -> 客戶端:命令執行結果
在這裏插入圖片描述
不知道大家看了有沒有產生一些問題,那我就我的一些問題說一下

爲什麼還要進行三次握手認證

因爲tcp三次握手,只是將客戶端與服務端建立起了連接,然後通過端口知道我要訪問的是mysql這個服務,但是mysql它不同於http,只要你知道url就能得到一個響應,mysql必須登陸後你才能進行操作。所以這個過程最重要的就是驗證客戶端的登陸權限。

爲什麼是服務端主動給客戶端發送認證呢?

http不是說只有客戶端主動與服務端進行請求,服務端不是不能在沒有請求的情況下主動進行響應嗎?
首先,大家也不要陷入誤區,在進行認證的這個交互中,實際上客戶端與服務端還沒有進行任何業務上的往來,只是進行一個認證,所以與上面說的http的不同,如果細心的話你會發現,認證成功後,在命令執行階段,mysql這種通信方式是與http非常類似的,在沒有請求的情況下,服務端的mysql也不會主動給你發送任何數據,所以這裏不要混淆。
再說爲什麼服務端先發送,那肯定是因爲他有不得不發送的道理,所以我們就需要理解一下,他發送的是什麼東西。

mysql報文

主要分成三個部分:登錄認證報文,客戶端請求報文以及服務器端返回報,基於mysql5.1.73(mysql4.1以後的版本)

登陸認證報文

1)握手初始化報文(服務端->客戶端)
在這裏插入圖片描述
協議版本號:服務端所使用的mysql協議的版本號
服務器線程ID:服務端爲此客戶端所創建的線程的ID
挑戰隨機數:MySQL數據庫用戶認證採用的是挑戰/應答的方式,服務器生成該挑戰數併發送給客戶端,由客戶端進行處理並返回相應結果,然後服務器檢查是否與預期的結果相同,從而完成用戶認證的過程。
服務器權能標誌:用於與客戶端協商通訊方式
這個我稍微解釋下,他這個只要發送的就是,我服務端能接受的通訊方式是什麼樣的,我們下面詳細說一下

登陸認證報文(客戶端 -> 服務器)

在這裏插入圖片描述
客戶端權能標誌:客戶端收到服務器發來的初始化報文後,會對服務器發送的權能標誌進行修改,保留自身所支持的功能,然後將權能標返回給服務器,從而保證服務器與客戶端通訊的兼容性。
消息長度:客戶端發送請求時所支持的最大消息長度值
字符編碼:表示通訊過程中使用的字符編碼,與服務器在認證報文中發送的相同
用戶名:客戶端登陸的用戶名
挑戰認證數據:客戶端用戶密碼使用服務器發送的挑戰隨機數進行加密後,生成挑戰認證數據,返回給服務器用於服務端的認證

服務端認證結果報文(服務端->客戶端)

這個就比較好理解了,服務端主要驗證,用戶名,密碼是否正確存在,如果都是正確的,就返回ok報文,錯誤的話就是ERROR報文

好了,我相信大家應該都有一定的瞭解了,那麼現在再想一下那個問題是不是覺得是非常有道理的,之所以服務端先發送一個握手過去,就是提前通知一下客戶端,你要遵循的一些協議
舉個例子:
小明找工作,投了一個簡歷給某個公司
這時候,某公司就主動打電話了,告訴他,我們需要筆試,筆試的時間,網址,以及一些別的相關信息,規則等

小明接收到這個消息之後,到了那個時間他就會請求那個網址,並將自己的信息告訴他

這時候公司驗證你的信息,驗證成功後,你就可以開始筆試了

大家可以類比這理解一下,就能體會出,這是非常有必要的。

這一章先講這麼多,下一張我們講一下,挑戰隨機數和全能標誌位的原理,有興趣的同學可以關注一下,有問題也可以隨時交流。

本文對原文進行了簡單的刪改
原文地址:https://blog.csdn.net/LYue123/article/details/89256577

▄█▀█●各位同仁,如果我的代碼對你有幫助,請給我一個贊吧,爲了下次方便找到,也可關注加收藏呀
如果有什麼意見或建議,也可留言區討論

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章