連接 MySQL 是所有操作的起點。本文從 TCP 層三次握手、MySQL 私有協議認證交互、源碼調用鏈、tcpdump 實戰抓包四個維度,完整還原登入全過程。
MySQL 採用 TCP 通訊,Server 端監聽執行緒等待 Client SYN:
SYN (seq=x)SYN (seq=y) + ACK (ack=x+1)ACK (ack=y+1)完成後,Server 分配連接資源。**注意**:三次握手由核心協議棧完成,應用層無感知。

TCP 連接建立後,進入 MySQL 協議層:
OK_Packet 或 ERR_Packet)此階段 SHOW PROCESSLIST 顯示 unauthenticated user,表示 Server 等待 Client 認證封包中。
tcpdump -S -nn -tttt -i eth0 host 10.bb.yy.104 and port 3306 and tcp -c 100 # -S 絕對序列號 -nn 不解析端口名 -tttt 完整時間戳 -i 介面 -c 數量

EXIT 觸發 4 次揮手(FIN、ACK、FIN、ACK)| 標記 | 含義 |
|---|---|
| S / SYN | 發起連接 |
| P / PUSH | 傳送資料 |
| F / FIN | 關閉連接 |
| ack | 確認應答 |
| RST | 異常重置 |
| . | 無標記 |
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()。
netstat -anp 可見多條 ESTABLISHED 共用 3306。