JAVA面试汇总

2020-08-12  本文已影响0人  我知他风雨兼程途径日暮不赏

总体流程

===========传输层协议================
1. 三次握手建立 TCP 连接。
===========应用层协议================
2. 建立 MySQL 连接,也就是认证阶段。
    服务端 -> 客户端:发送握手初始化包 (Handshake Initialization Packet)。
    客户端 -> 服务端:发送验证包 (Client Authentication Packet)。
    服务端 -> 客户端:认证结果消息。
 
3. 认证通过之后,客户端开始与服务端之间交互,也就是命令执行阶段。
    客户端 -> 服务端:发送命令包 (Command Packet)。
    服务端 -> 客户端:发送回应包 (OK Packet, or Error Packet, or Result Set Packet)。
 
4. 断开 MySQL 连接。
    客户端 -> 服务器:发送退出命令包。
 ==========传输层协议==================
5. 四次握手断开 TCP 连接

服务端发送至客户端的协议格式:

image.png
协议版本号:服务端所使用的mysql协议的版本号
服务器线程ID:服务端为此客户端所创建的线程的ID
挑战随机数:MySQL数据库用户认证采用的是挑战/应答的方式,服务器生成该挑战数并发送给客户端,由客户端进行处理并返回相应结果,然后服务器检查是否与预期的结果相同,从而完成用户认证的过程。
服务器权能标志:用于与客户端协商通讯方式

客户端发送至服务器端:

image.png
客户端权能标志:客户端收到服务器发来的初始化报文后,会对服务器发送的权能标志进行修改,保留自身所支持的功能,然后将权能标返回给服务器,从而保证服务器与客户端通讯的兼容性。
消息长度:客户端发送请求时所支持的最大消息长度值
字符编码表示通讯过程中使用的字符编码,与服务器在认证报文中发送的相同
用户名:客户端登陆的用户名
挑战认证数据:客户端用户密码使用服务器发送的挑战随机数进行加密后,生成挑战认证数据,返回给服务器用于服务端的认证

认证流程:

服务器发送随机字符串 (scramble) 给客户端。
客户端作如下计算,然后客户端将 token 发送给服务端。

stage1_hash = SHA1(明文密码)

token = SHA1(scramble + SHA1(stage1_hash)) XOR stage1_hash

服务端作如下计算,比对 SHA1(stage1_hash) 和 mysql.user.password 是否相同。

stage1_hash = token XOR SHA1(scramble + mysql.user.password)
上一篇 下一篇

猜你喜欢

热点阅读