首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 登入協議深度解析:TCP 三次握手、認證交互流程與 tcpdump 抓包實戰驗證(增強版)

     編輯:MySQL 綜合教學

MySQL 登入協議深度解析:TCP 三次握手、認證交互流程與 tcpdump 抓包實戰驗證(增強版)

連接 MySQL 是所有操作的起點。本文從 TCP 層三次握手、MySQL 私有協議認證交互、源碼調用鏈、tcpdump 實戰抓包四個維度,完整還原登入全過程。

一、TCP 三次握手 — 連接建立基石

MySQL 採用 TCP 通訊,Server 端監聽執行緒等待 Client SYN:

  1. Client → Server:SYN (seq=x)
  2. Server → Client:SYN (seq=y) + ACK (ack=x+1)
  3. Client → Server:ACK (ack=y+1)

完成後,Server 分配連接資源。**注意**:三次握手由核心協議棧完成,應用層無感知。

TCP建立連接原理圖 TCP斷開連接原理圖

二、MySQL 私有協議認證流程

TCP 連接建立後,進入 MySQL 協議層:

  1. Server → Client:發送 握手封包(含 Server 版本、連接 ID、認證插件名、鹽值、權限位圖等)
  2. Client → Server:發送 認證封包(用戶名、加密後密碼、客戶端能力標誌、字符集、資料庫名等)
  3. Server → Client:驗證結果封包(OK_Packet 或 ERR_Packet)

此階段 SHOW PROCESSLIST 顯示 unauthenticated user,表示 Server 等待 Client 認證封包中。

15922528 unauthenticated user 10.xx.2.74:53216 NULL Connect NULL Reading from net NULL
15923418 unauthenticated user connecting host NULL Connect NULL login NULL

三、tcpdump 實戰抓包驗證

抓包命令

tcpdump -S -nn -tttt -i eth0 host 10.bb.yy.104 and port 3306 and tcp -c 100
# -S 絕對序列號  -nn 不解析端口名  -tttt 完整時間戳  -i 介面  -c 數量

抓包結果四階段特徵

  1. TCP 建立:3 次握手封包(SYN、SYN+ACK、ACK)
  2. MySQL 認證:Server 握手包 → Client 認證包 → Server OK 包
  3. 元資料交換:登入成功後雙向交換版本、字符集、參數等
  4. TCP 斷開:EXIT 觸發 4 次揮手(FIN、ACK、FIN、ACK)

封包標記速查

標記含義
S / SYN發起連接
P / PUSH傳送資料
F / FIN關閉連接
ack確認應答
RST異常重置
.無標記

四、源碼調用鏈(MySQL 5.6/5.7)

login_connection()
  → check_connection()
    → acl_authenticate()
      → do_auth_once()
        → native_password_authenticate()  -- 核心驗證邏輯
          → write_packet()  -- 發送握手包
          → read_packet()   -- 讀取認證包
          → 密碼驗證邏輯
          → Protocol::send_ok()  -- 發送 OK 包

底層 Socket I/O:sql/net_serv.cc 中的 my_net_read() / my_net_write()。

五、常見問題 FAQ

  1. Unix Socket vs TCP 登入差異:
    • Unix Socket:本機進程間通訊,跳過 TCP 協議棧,延遲更低
    • 監聽執行緒同時監聽 TCP (3306) 與 Unix Socket (/tmp/mysql.sock)
    • 認證邏輯完全一致,僅傳輸層不同
  2. 監聽 Socket 與通訊 Socket 是否同端口:是。監聽 Socket 持續 listen(3306),新連接 accept() 產生新通訊 Socket,同佔 3306 端口,netstat -anp 可見多條 ESTABLISHED 共用 3306。
  3. connect_timeout 生效時機:僅在 認證階段 生效。若 Client 超過該秒數未發送認證封包,Server 主動斷開連接。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved