實戰解析丨如何對Mysql連接請求的tcpdump內容進行分析


摘要:tcpdump是通過攔截發送和收到的網絡連接中的TCP/IP和其他數據包,通過tcpdump工具幫助我們分析三次握手或者四次揮手的數據包情況,就能很容易的幫助我們分析出網絡在哪一個步驟出的問題。

tcpdump是通過攔截發送和收到的網絡連接中的TCP/IP和其他數據包,通常在我們WEB開發中,我們提供http服務或者調用http服務的過程中經常會遇到read time out/connect reset等網絡異常信息,通過tcpdump工具幫助我們分析三次握手或者四次揮手的數據包情況,就能很容易的幫助我們分析出網絡在哪一個步驟出的問題。

接下來我們通過分析Mysql的連接請求,來了解網絡的請求過程和協議的具體內容。

0x0000: 4500 0039 3881 4000 4006 7fcf c0a8 00d7
0x0010: c0a8 0047 a034 0cea 860b e11e c2fc 7f64
0x0020: 8018 296a 2b0e 0000 0101 080a 2de4 786b
0x0030: 3a4f 5980 0100 0000 0e

這樣一份報文通常有3部分組成

1. IP報頭

2. TCP協議

3. mysql協議

逐行分析如下

4500 0039 3881 4000 4006 7fcf c0a8 00d7

  • 45 - 4 為Version 5 為Header Length,那么這個協議頭的長度就是5字節
  我們讀出接下來的5字節 00 0039 3881
  • 00 Type Of Service標識優先級 延遲要求 吞吐量信息等
  • 0039 Total Length 換算十進制結果是 57 與我們獲取到的結果的字節數量一致
  • 3881 IP報文頭的Identification
  • 4000 - 為IP Flags和Fragment Offset
  • 000 IP Flags
  0 0100 0000 0000 Fragment :相對0原始報文頭的偏移量
  • 4006 - 40 為TTL 一個協議訪問的生存周期 06 代表TCP協議
  • 7fcf - Header Checksum 首部查錯
  • c0a8 00d7 - 源主機IP地址段 c0(192) a8(168) 00(0) d7 (215)

c0a8 0047 a034 0cea 860b e11e c2fc 7f64

  • c0a8 0047 - 代表目標主機的IP地址 (到這里IP協議部分就結束了,恰好是20字節,接下來就要進入TCP部分解析了)
  • a034 - 源端口號 轉換十進制 41012
  • 0cea - 目標端口 轉換十進制 3306
  • 860b e11e - 序列號 2248925470
  • c2fc 7f64 - 確認號 3271327588

8018 296a 2b0e 0000 0101 080a 2de4 786b

  • 80 - 8表示偏移 Offset 0 為保留位
  • 18 - tcp的傳說狀態 1 Ack 8表示PUSH 這大概就是第一行 [P.]的由來把
  • 296a - 滑動窗口的大小10602
  • 2b0e - TCP部分的Checksum
  • 0000 - TCP部分的緊急指針

到Options部分

  • 0101 - NOP填錯沒有實際意義
  • 080a - 代表開啟timestamp
  • 2de4 786b - 對應的具體時間戳的值769947755

3a4f 5980 0100 0000 0e

  • 3a4f 5980 - 還是時間戳的一部分 ecr值
  • 0100 00 - 表示具體內容長度1字節
  • 00 - 表示seqid 遞增
  • 0e - 通過查詢mysql語義,代表 COM_PING 測試聯通性

以下列舉了所有在客戶端請求部分16進制數代表的mysql語義,通過不同的語義需要進行不同的轉換才能獲得想要的內容,這里就不列舉更多例子了

0x00 COM_SLEEP (內部線程狀態)
0x01 COM_QUIT 關閉連接
0x02 COM_INIT_DB 切換數據庫
0x03 COM_QUERY SQL查詢請求
0x04 COM_FIELD_LIST 獲取數據表字段信息
0x05 COM_CREATE_DB 創建數據庫
0x06 COM_DROP_DB 刪除數據庫
0x07 COM_REFRESH 清除緩存
0x08 COM_SHUTDOWN 停止服務器
0x09 COM_STATISTICS 獲取服務器統計信息
0x0A COM_PROCESS_INFO 獲取當前連接的列表
0x0B COM_CONNECT (內部線程狀態)
0x0C COM_PROCESS_KILL 中斷某個連接
0x0D COM_DEBUG 保存服務器調試信息
0x0E COM_PING 測試連通性
0x0F COM_TIME (內部線程狀態)
0x10 COM_DELAYED_INSERT (內部線程狀態)
0x11 COM_CHANGE_USER 重新登陸(不斷連接)
0x12 COM_BINLOG_DUMP 獲取二進制日志信息
0x13 COM_TABLE_DUMP 獲取數據表結構信息
0x14 COM_CONNECT_OUT (內部線程狀態)
0x15 COM_REGISTER_SLAVE 從服務器向主服務器進行注冊
0x16 COM_STMT_PREPARE 預處理SQL語句
0x17 COM_STMT_EXECUTE 執行預處理語句
0x18 COM_STMT_SEND_LONG_DATA 發送BLOB類型的數據
0x19 COM_STMT_CLOSE 銷毀預處理語句
0x1A COM_STMT_RESET 清除預處理語句參數緩存
0x1B COM_SET_OPTION 設置語句選項
0x1C COM_STMT_FETCH 獲取預處理語句的執行結果

在mysql請求過程中還有產生其他類型協議包數據,故需要我們對mysql請求過程有基本的認識。

mysql 請求過程介紹

1.建立tcp連接三次握手

2.與Mysql服務器建立連接

  • Server --> Client: Handshake(握手)
1字節:協議版本號
NullTerminatedString:數據庫版本信息
4字節:連接MySQL Server啟動的線程ID
8字節:挑戰隨機數,用於數據庫認證
1字節:填充值(0x00)
2字節:用於與客戶端協商通訊方式
1字節:數據庫的編碼
2字節:服務器狀態
13字節:預留字節
12字節:挑戰隨機數,用於數據庫認證
1字節:填充值(0x00)
  • Client --> Server: Authentication (認證)
4字節:用於與客戶端協商通訊方式
4字節:客戶端發送請求報文時所支持的最大消息長度值
1字節:標識通訊過程中使用的字符編碼
23字節:保留字節
NullTerminatedString:用戶名
LengthEncodedString:加密后的密碼
NullTerminatedString:數據庫名稱(可選)
  • Server --> Client: 返回認證結果包

3.認證通過以后,服務器端接收客戶端命令包,返回對應的響應包

 

點擊關注,第一時間了解華為雲新鮮技術~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM