深度解析mysql登录原理

深度剖判mysql登陆原理,剖判mysql登陆

     
使用mysql数据库的率先步必然是起家连接登陆,然后在地点实践SQL命令。无论是通过mysql的客户端,依然通过C-API,JDBC规范接口连接数据库,这几个进程一定少不了。明日我们聊壹聊mysql登录具体经过,里面会涉及client与server的互相,并经过tcpdump抓包给我们彰显那壹进度。

TCP握手球协会议

     
远程连接数据库,mysql采纳TCP协议通讯,第3步是起家连接,即TCP的3次握手。mysql
server端有3个监听线程等待client请求,client发起呼吁后,首头阵贰个sync包到服务端,服务端发三个ack包作为对客户端sync包的响应,同时发八个sync包到客户端,最终客户端再发3个ack包作为对服务端的响应。通过三次握手,TCP连接才算真正树立起来,那一年mysql服务端会分配多个连连供客户端使用。记住,TCP的叁次握手都是由TCP的说道栈完结,应用程序并无感知。可是,到近来截至,整个mysql连接进程还只实现了第壹步–建设构造TCP连接。

下边附上TCP创立连接和断开连接的原理图。

   图片 1图片 2

MYSQL握手球组织议

   
  TCP连接创立成功后,mysql客户端与mysql服务端发轫开始展览电视发表,实行mysql认证进度。(1)服务端首先会发二个握公文包到客户端,(2)然后客户端向服务端发送认证新闻(用户名,密码等),(叁)服务端收到认证包后,会检查用户名与密码是不是合法,并发送包告知客户端认证音信。借使官方,则登入成功,否则,登录失利。连接报错。有的时候候,大家通过show
processlist看到User处于unauthenticated
user ,那表明此时接连进程正处在第①步和第2步之间,服务端等待客户端发认证音讯的经过中。

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抓互连网包来验证大家的法则。由于测试在生养条件中张开,为了幸免生育网段的IP走漏,对IP作了替换,但不影响深入分析进程。具体来说,十.aa.zz.14二.十55陆表示客户端,10.bb.yy.104.330陆表示服务器端,330陆是服务器的监听端口号。

(1).在客户端上开发tcpdump命令,监听与10.bb.yy.10四.330陆的通讯网络包,命令如下:

tcpdump -S -nn -tttt -i eth0 host 10.bb.yy.104 and port 3306 and tcp -c 100
-S 将tcp的序列号以绝对值形式输出,而不是相对值。 
-nn 不进行端口名称的转换。
-tttt 在每一行中输出由date处理的默认格式的时间戳。
-i eth0 指定监听的网络接口
host 10.bb.yy.104 and port 3306  设置监听10.bb.yy.104:3306的网络包
-c 100 表示监听100包就结束。

 (二).在客户端上,利用mysql命令远程连接服务端十.bb.yy.拾四,

mysql –h10.bb.yy.104 –P3306 –uxxx –pxxx

登入成功后,然后直接实行exit,退出

(③)剖析tcpdump抓取的互连网包,入眼深入分析创设TCP连接,MYSQL认证和TCP断开连接的过程。如下图,图中第二有的是TCP连接建设构造的经过,第1有的是MYSQL认证的历程,第一局部是登6/10功后,发送基本元数据新闻的长河,第陆片段是断开连接的进度。通过图中的标示,大家得以清楚的见到TCP营造连接的三次握手,MYSQL认证以及TCP断开连接的五次挥手进程。

 图片 3

建设构造连接

其1进度主要反映在率先有个别,客户端十.aa.zz.14二.拾55陆,首首发1个编号为14918944玖二的SYN包,服务端收到后,发送了14918944玖二+一的ACK包,并发送了一个2727774玖2伍的SYN包,最终客户端再发送3个2727774925+一的包举办回复。

MYSQL认证

这些进度首要反映在其次局地,服务端十.bb.yy.104:330陆第1发三个认证包给客户端,然后客户端再发送包蕴用户密码的印证包给服务器,验证成功后,服务端最后给客户端3个答复,那么整个认证进度就结束了,至于第2局地是服务端与客户端互相发送的壹对元数据音信,举个例子版本消息之类的。

断开连接

本条进程首要反映在第4局地,客户端发起exit命令时,初始接触那一个动作。客户端首头阵一个编号为14918947二四的FIN包,然后服务器发送八个14918947二四+一的ACK包作为回答,并发送1个数码为2727775120的FIN包,最终客户端发送2727775120+一作为回答,整个进度结束。

数量包标识解析

S=SYN   发起连接标记,一般用来创建TCP连接

P=PUSH 传送数据标识,一般用于传输数据

F=FIN   关闭连接标记,一般用来关闭TCP连接

ack     表示应答包

LX570ST= RESET  丰硕关闭连接

.表示从没其余标识

源码完成

     
用于MYSQL认证代码主要集聚在函数native_password_authenticate中,具体调用档次为:login_connection->check_connection->acl_authenticate->do_auth_once->native_password_authenticate,函数逻辑很轻便,就是调用write_packet往客户端发一个表达包,然后调用read_packet等待客户端重临包蕴用户名、密码等新闻的包,最终剖析包中的音讯实行密码验证,成功后,会在调用Protocol::send_ok发二个验证成功互联网包,这几个进程能够在图中的第贰步全体显示。底层socket通讯代码主要集中在sql/net_serv.cc中,具体来说读应用接口my_net_read,写接纳接口my_net_write。

问题

(一).Unix socket方式登录与TCP形式登入有何界别和挂钩?

Unix socket是落到实处进程间通讯的壹种方法,mysql援救选用Unix
socket来促成客户端-服务端的通讯,但供给客户端和服务端在同样台机器上。对于unix
socket来讲,同样也是1种套接字,监听线程会同期监听TCP socket和Unix
socket,接受到请求然后管理,后续的管理逻辑都以千篇一律的,只但是底层通讯情势差别样而已。

mysql  -h127.0.0.1 –P3306 –uxxx –pxxx  [TCP通讯方式]
mysql  -uxxx –pxxx –S/usr/mysql/mysql.sock  [unix socket通信方式]

(二).监听socket是不是与通讯socket公用一个端口?

咱俩知晓,服务端平昔有贰个监听socket在330陆端口监听,等待新进入的客户请求,一旦三个呼吁过来,服务端会重新创建三个新的通讯socket,那么些新的socket特意用来与那几个客户通讯,而监听socket则继续监听。尽管是二个套接字,但监听socket和通讯socket都以同七个端口,通过netstat能够确认那些难题。

(三).连接超时参数connect_timeout在何时功效?

以此参数实质正是在MYSQL认证进度起效果,若是在那几个进程中,客户端超越connect_timeout时间如故未有发送密码验证包过来,则会积极断开连接。

参照文书档案

 

 

 

 

 

 

使用mysql数据库的首先步必然是确立连接登6,然后在上头实施SQL命令。无论是通过mysql的客户端,还…

     
使用mysql数据库的率先步必然是起家连接登陆,然后在地方实践SQL命令。无论是通过mysql的客户端,仍旧通过C-API,JDBC标准接口连接数据库,这几个进度一定少不了。前些天大家聊一聊mysql登入具体进程,里面会涉及client与server的并行,并经过tcpdump抓包给我们突显那一经过。

TCP握手球组织议

     
远程连接数据库,mysql选取TCP协议通讯,第叁步是起家连接,即TCP的三次握手。mysql
server端有一个监听线程等待client请求,client发起呼吁后,首首发三个sync包到服务端,服务端发贰个ack包作为对客户端sync包的响应,同有的时候候发1个sync包到客户端,最终客户端再发三个ack包作为对服务端的响应。通过三次握手,TCP连接才算真正树立起来,那个时候mysql服务端会分配四个总是供客户端使用。记住,TCP的三次握手都是由TCP的构和栈实现,应用程序并无感知。不过,到近来停止,整个mysql连接进度还只实现了第二步–创建TCP连接。

下边附上TCP建设构造连接和断开连接的原理图。

   图片 4图片 5

MYSQL握手球组织议

      TCP连接创设成功后,mysql客户端与mysql服务端开始实行报导,实行mysql认证进度。(1)服务端首先会发二个握托特包到客户端,(二)然后客户端向服务端发送认证音信(用户名,密码等),(三)服务端收到认证包后,会检查用户名与密码是不是合法,并发送包告知客户端认证新闻。要是官方,则登入成功,不然,登录战败。连接报错。不经常候,大家通过show
processlist看到User处于unauthenticated
user ,这证明此时一而再进程正处在第三步和第一步之间,服务端等待客户端发认证信息的进程中。

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抓互连网包来注解我们的原理。由于测试在生育条件中进行,为了防止生育网段的IP败露,对IP作了替换,但不影响深入分析进程。具体来讲,10.aa.zz.14贰.⑩556意味着客户端,10.bb.yy.拾4.330陆意味着服务器端,330陆是服务器的监听端口号。

(一).在客户端上张开tcpdump命令,监听与十.bb.yy.十四.330陆的通讯互联网包,命令如下:

tcpdump -S -nn -tttt -i eth0 host 10.bb.yy.104 and port 3306 and tcp -c 100
-S 将tcp的序列号以绝对值形式输出,而不是相对值。 
-nn 不进行端口名称的转换。
-tttt 在每一行中输出由date处理的默认格式的时间戳。
-i eth0 指定监听的网络接口
host 10.bb.yy.104 and port 3306  设置监听10.bb.yy.104:3306的网络包
-c 100 表示监听100包就结束。

 (贰).在客户端上,利用mysql命令远程连接服务端十.bb.yy.10四,

mysql –h10.bb.yy.104 –P3306 –uxxx –pxxx

登入成功后,然后径直推行exit,退出

(3)解析tcpdump抓取的网络包,器重深入分析建设构造TCP连接,MYSQL认证和TCP断开连接的长河。如下图,图中第3部分是TCP连接创建的进度,第一某个是MYSQL认证的进度,第壹有个别是登录成功后,发送基本元数据新闻的历程,第伍局地是断开连接的历程。通过图中的标示,大家得以清楚的看来TCP创建连接的三次握手,MYSQL认证以及TCP断开连接的四次挥手进度。

 图片 6

树立连接

以此进程首要呈现在率先局地,客户端十.aa.zz.142.1055陆,首头阵三个编号为14918944玖2的SYN包,服务端收到后,发送了14918944玖2+壹的ACK包,并发送了2个2727774925的SYN包,最终客户端再发送七个2727774九2伍+一的包实行应对。

MYSQL认证

以此进度首要呈未来其次有些,服务端十.bb.yy.十四:330陆首首发二个验证包给客户端,然后客户端再发送包罗用户密码的验证包给服务器,验证成功后,服务端最终给客户端1个应答,那么全数认证进度就终止了,至于第1有的是服务端与客户端相互发送的壹部分元数据新闻,比方版本消息之类的。

断开连接

其1进度首要显示在第六有个别,客户端发起exit命令时,初阶接触这些动作。客户端首首发多少个号码为14918947贰四的FIN包,然后服务器发送三个14918947二四+一的ACK包作为回应,并发送3个编号为2727775120的FIN包,最终客户端发送2727775120+一当做回答,整个经过甘休。

多少包标志解析

S=SYN   发起连接标记,一般用来营造TCP连接

网站地图xml地图