客户端发送的包
1.客户端认证包
客户端认证函数:mysql_real_connect();(libmysql/libmysql.c)
服务器端认证函数:check_connections();(sql/sql_connect.c)
2.命令包
包括一字节的命令类型和其他命令参数
命令类型定义在文件include/mysql_com.h中,如下所示:
enum enum_server_command { COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST, COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS, COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING, COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP, COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE, COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE, COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON, /* don't forget to update const char *command_name[] in sql_parse.cc */ /* Must be last */ COM_END };
在libmysql.c中定义了对命令执行的函数,如mysql_rollback、mysql_change_user、mysql_commit等
服务器端发送的包
1.握手初始化包,回应用户连接请求
返回的信息包括线程号,协议版本,服务器端能接受的连接选项(include/mysql_com.h中,以CLIENT开头)、服务器字符集、服务状态标志(SERVER_STATUE_)
2.OK包,用于无需返回大结果集时对客户端命令的回应
如:COM_PING、COM_QUERY、COM_REFRESH、COM_REGISTER_SLAVE等
包括:
影响的行数、插入ID(如果操作引起了任何AUTO_INCREMENT作用)、消息(诸如:2 rows in set (0.00 sec))
发送OK包函数:net_send_ok();(sql/protocol.cc)
3.error包,用于处理错误反馈,如执行语句错误
在include/mysqld_error.h中定义了错误号
错误号对于错误状态(include/sql_state.h)
发送error包函数 net_send_error_packet();(sql/protocol.cc)
4.结果集包
查询结果如果有n列,m行,则会发送m+n+3个包,包括包头、列包、行包、EOF包
结果集组成:包头 | n个列包 | EOF包 | m个行包 | EOF包
客户端处理结果集函数:mysql_use_result();(libmysql/libmysql.c)
1)列包:用于描述每一列
列支持的数据类型用宏定义(include/mysql_com.h)
列包发送函数:服务器端send_fields();(sql/sql_base.cc),客户端cli_list_fields()
2)行包
每行一个数据包
3)EOF包
用于标识某种类型的包已经传送结束
函数:write_eof_packet()、send_eof();