MySQL在应用层使用了一种NET协议,服务器端监听my.cnf中指定的TCP/IP端口和本地socket。客户端和服务器端的通信都是通过NET包来传送的。
在文件sql/net_serv.cc中定义了相应的API,结构体st_net封装了NET包的格式
NET包长度限制:#define MAX_PACKET_LENGTH (256L*256L*256L-1)
每个NET包包含4字节的头部信息:
3字节:数据包长度
1字节:数据包序列号
当超过数据超过NET包限制时,将会被切分成多个不超过MAX_PACKET_LENGTH的包
MySQL支持数据压缩,使用zlib(zlib/compress.c)。
//
相关函数:
my_bool my_net_init(NET *net, Vio* vio)对一个NET包进行初始化;
my_net_write(NET *net,const uchar *packet,size_t len):将包写到缓冲区中;
my_bool net_flush(NET *net):将缓冲区的数据发送出去;
my_bool net_write_command(NET *net,uchar command,const uchar *header, size_t head_len, const uchar *packet, size_t len) 向服务器端发送一条命令;
ulong my_net_read(NET *net):读取包的数据,如果这个包被分割过,还需要读取多个包来进行重组