Linux传统I/O操作是一种缓冲I/O,在数据传输中,操作系统会将 I/O 的数据缓存在文件系统的页缓存中,即操作系统内核缓冲区中。 比如:在网络中传输一个文件时,发送端应用程序会先检查内核缓冲区中有没有需要发送的这个文件的数据,如果没有,则会将这个文件从磁盘拷贝到内核缓冲区中,然后再从内核缓冲区拷贝到应用程序的用户缓冲区,如果应用程序不对数据进行处理或处理完毕之后,再将文件拷贝到内核中的socket发送缓冲区(比如TCP发送缓冲区),待内核socket缓冲区中有足够的数据时,就会把数据发送到网卡上,然后在网络上进行传输 其过程至少发生了四次数据的拷贝,其频繁的读写对CPU的使用和内存的带宽开销是非常大的。
目录 1 交互过程 1.1 握手认证阶段 1.2 命令执行阶段 2 基本类型 2.1 整型值 2.2 字符串(以NULL结尾)(Null-Terminated String) 2.3 二进制数据(长度编码)(Length Coded Binary) 2.4 字符串(长度编码)(Length Coded String) 3 报文结构 3.1 消息头 3.1.1 报文长度 3.1.2 序号 3.2 消息体 4 报文类型 4.1 登陆认证交互报文 4.1.1 握手初始化报文(服务器 -> 客户端) 4.1.2 登陆认证报文(客户端 -> 服务器) 4.2 客户端命令请求报文(客户端 -> 服务器) 4.2.1 COM_QUIT 消息报文 4.2.2 COM_INIT_DB 消息报文 4.2.3 COM_QUERY 消息报文 4.2.4 COM_FIELD_LIST 消息报文 4.2.5 COM_CREATE_DB 消息报文 4.2.6 COM_DROP_DB 消息报文 4.2.7 COM_REFRESH 消息报文 4.2.8 COM_SHUTDOWN 消息报文 4.2.9 COM_STATISTICS 消息报文 4.2.10 COM_PROCESS_INFO 消息报文 4.2.11 COM_PROCESS_KILL 消息报文 4.2.12 COM_DEBUG 消息报文 4.2.13 COM_PING 消息报文 4.2.14 COM_CHANGE_USER 消息报文 4.2.15 COM_BINLOG_DUMP 消息报文 4.2.16 COM_TABLE_DUMP 消息报文 4.2.17 COM_REGISTER_SLAVE 消息报文 4.2.18 COM_PREPARE 消息报文 4.2.19 COM_EXECUTE 消息报文 4.2.20 COM_LONG_DATA 消息报文 4.2.21 COM_CLOSE_STMT 消息报文 4.2.22 COM_RESET_STMT 消息报文 4.2.23 COM_SET_OPTION 消息报文 4.2.24 COM_FETCH_STMT 消息报文 4.3 服务器响应报文(服务器 -> 客户端) 4.3.1 OK 响应报文 4.3.2 Error 响应报文 4.3.3 Result Set 消息 4.3.4 Result Set Header 结构 4.3.5 Field 结构 4.3.6 EOF 结构 4.3.7 Row Data 结构 4.3.8 Row Data 结构(二进制数据) 4.3.9 PREPARE_OK 响应报文(Prepared Statement) 4.3.10 Parameter 响应报文(Prepared Statement) 5 参考资料 1 交互过程 MySQL客户端与服务器的交互主要分为两个阶段:握手认证阶段和命令执行阶段。