mysql 協議的服務端握手包及對其解析

2021-07-25 20:53:56 字數 4581 閱讀 4476

mysql客戶端登陸到mysql服務端需要乙個互動的過程,這裡先看服務端給客戶端傳送的初始握手包。如下,client通過socket連線到server指定的埠後,server將往client傳送初始握手包。服務端會根據不同的服務版本和不同的配置返回不同的初始化握手包。

client              server

|------connect---- >|

| |

|<----handshake-----|

| |

| |

| |

型別

名字描述

int<3>

payload長度

按照the least significant byte first儲存,3個位元組的payload和1個位元組的序列號組合成報文頭

int<1>

序列號string

payload

報文體,長度即為前面指定的payload長度

handshakev10協議如下

1              [0

a] protocol version

string[nul] server version

4 connection id

string[8] auth-plugin-data-part-1

1 [00] filler

2 capability flags (lower

2bytes)

if more data in

the packet:

1character

set2 status flags

2 capability flags (upper

2bytes)

if capabilities & client_plugin_auth else

string[10] reserved (all [00])

if capabilities & client_secure_connection elseif version >= 5.5

.10or >= 5.6

.2 }

更多詳情 :

定義版

/**

* *@author seaboat

*@date 2016-09-25

*@version 1.0

*email:[email protected]

*
blog:
* proxy's version.

*/public

inte***ce

versions

隨機數工具

/**

* *@author seaboat

*@date 2016-09-25

*@version 1.0

*email:[email protected]

*
blog:
* a random util .

*/public

class

randomutil ;

private

static

final

long multiplier = 0x5deece66dl;

private

static

final

long addend = 0xbl;

private

static

final

long mask = (1l << 48) - 1;

private

static

final

long integermask = (1l << 33) - 1;

private

static

final

long seeduniquifier = 8682522807148012l;

private

static

long seed;

static

public

static

final

byte randombytes(int size)

return ab;

}private

static

byte

randombyte(byte b)

private

static

long

next() while (oldseed == nextseed);

seed = nextseed;

return nextseed;

}}

mysql包基類

/**

* *@author seaboat

*@date 2016-09-25

*@version 1.0

*email:[email protected]

*
blog:
* mysqlpacket is mysql's basic packet.

*/public

abstract

class

mysqlpacket

}

握手包類

/**

* *@author seaboat

*@date 2016-09-25

*@version 1.0

*email:[email protected]

*
blog:
* authpacket means mysql initial handshake packet .

*/public

class

handshakepacket

extends

mysqlpacket ;

public

byte protocolversion;

public

byte serverversion;

public

long threadid;

public

byte seed;

public

int servercapabilities;

public

byte servercharsetindex;

public

int serverstatus;

public

byte restofscramblebuff;

public

void

read(byte data)

@override

public

intcalcpacketsize()

public

void

write(bytebuffer buffer)

@override

protected string getpacketinfo()

}

服務端能力類

/**

* *@author seaboat

*@date 2016-09-25

*@version 1.0

*email:[email protected]

*
blog:
* server capabilities .

*/public

inte***ce

capabilities

測試類

/**

* *@author seaboat

*@date 2016-09-25

*@version 1.0

*email:[email protected]

*
blog:
* test handshake packet.

*/public

class

handshakepackettest

public

static string bytes2hexstring(byte b)

return

new string(buff);

}public

static string str2hexstr(string str)

return sb.tostring();

}protected

intgetservercapabilities()

}

*****===廣告時間*****===

鄙人的新書《tomcat核心設計剖析》已經在京東銷售了,有需要的朋友可以到 進行預定。感謝各位朋友。

為什麼寫《tomcat核心設計剖析》

安裝MySQL服務端

2.如圖所示 3.解壓檔案 4.開啟 mysql 5.7.24 winx64 在根目錄下一定要新建檔案data,新增配置檔案 my.ini 5.安裝並啟動服務 6.配置資料庫 一.windows安裝mysql服務端 2.如圖所示 3.解壓檔案 4.開啟 mysql 5.7.24 winx64 在根目...

tcp協議服務端實現併發

socket 在 tcp 協議下通訊 客戶端 import socket 建立客戶端tcp協議通訊 c socket.socket 與指定服務端握手 c.connect 127.0.0.1 8080 通訊迴圈 while true 向服務端傳送資訊 msg input if len msg 0 co...

71 基於UDP協議的服務端

server.py 1 可靠性 tcp協議是可靠協議 對方必須恢復乙個ack確認訊息,才會將自己的這端端資料從記憶體中刪除 udp協議不可靠 2 有無鏈結 tcp有鏈結,udp無連線 3 傳輸資料的效率 udp更高 4 粘包問題 udp協議稱之為資料報協議,每次傳送都是乙個完整的資料報,乙個傳送唯一...