深度解析mysql登录原理
作者:网络转载 发布时间:[ 2015/12/7 16:11:48 ] 推荐标签:数据库
MYSQL认证
这个过程主要体现在第二部分,服务端10.bb.yy.104:3306首先发一个认证包给客户端,然后客户端再发送包含用户密码的认证包给服务器,验证成功后,服务端后给客户端一个应答,那么整个认证过程结束了,至于第3部分是服务端与客户端相互发送的一些元数据信息,比如版本信息之类的。
断开连接
这个过程主要体现在第四部分,客户端发起exit命令时,开始触发这个动作。客户端首先发一个编号为1491894724的FIN包,然后服务器发送一个1491894724+1的ACK包作为应答,并发送一个编号为2727775120的FIN包,后客户端发送2727775120+1作为应答,整个过程结束。
数据包标记解析
S=SYN 发起连接标志,一般用于建立TCP连接
P=PUSH 传送数据标志,一般用于传输数据
F=FIN 关闭连接标志,一般用于关闭TCP连接
ack 表示应答包
RST= 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。
问题
(1).Unix socket方式登陆与TCP方式登陆有什么区别和联系?
Unix socket是实现进程间通信的一种方式,mysql支持利用Unix socket来实现客户端-服务端的通信,但要求客户端和服务端在同一台机器上。对于unix socket而言,同样也是一种套接字,监听线程会同时监听TCP socket和Unix socket,接受到请求然后处理,后续的处理逻辑都是一致的,只不过底层通信方式不一样罢了。
mysql -h127.0.0.1 –P3306 –uxxx –pxxx [TCP通讯方式]
mysql -uxxx –pxxx –S/usr/mysql/mysql.sock [unix socket通信方式]
(2). 监听socket是否与通信socket公用一个端口?
我们知道,服务端一直有一个监听socket在3306端口监听,等待新进来的客户请求,一旦一个请求过来,服务端会重新创建一个新的通信socket,这个新的socket专门用于与这个客户通信,而监听socket则继续监听。虽然是2个套接字,但监听socket和通信socket都是同一个端口,通过netstat可以确认这个问题。
(3).连接超时参数connect_timeout在何时作用?
这个参数实质是在MYSQL认证过程起作用,如果在这个过程中,客户端超过connect_timeout时间仍然没有发送密码认证包过来,则会主动断开连接。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。

sales@spasvo.com