文章中的源碼來自mysql 5.7.10版本。
1. NET結構
該結構定義了網絡連接配接描述符,本結構是實作接收和發送協定資料的核心。該結構的定義在include\mysql_com.h
定義如下:
typedef struct st_net {
Vio *vio;
unsigned char *buff,*buff_end,*write_pos,*read_pos;
my_socket fd;
unsigned long remain_in_buf,length, buf_length, where_b;
unsigned long max_packet,max_packet_size;
unsigned int pkt_nr,compress_pkt_nr;
unsigned int write_timeout, read_timeout, retry_count;
int fcntl;
unsigned int *return_status;
unsigned char reading_or_writing;
char save_char;
my_bool unused1;
my_bool unused2;
my_bool compress;
my_bool unused3;
unsigned char *unused;
unsigned int last_errno;
unsigned char error;
my_bool unused4;
my_bool unused5;
char last_error[MYSQL_ERRMSG_SIZE];
char sqlstate[SQLSTATE_LENGTH+1];
void *extension;
} NET;
該變量維護了一個buffer緩存,該緩存既用于讀,也用于寫。發送封包資料時先将資料包存入該buffer中,當該buffer填滿後再發送。讀包時。。。。。。
主要資料成員:
compress: 1表示啟動壓縮協定
read_or_writing: 0:沒有進行I/O操作 1:讀 2:寫
pkt_nr: 協定的包序号,防止包錯亂
compress_pkt_nr:壓縮包的包序号
return_status:指向目前連接配接的THD的server_status變量
max_packet_size: 值為資料庫參數max_allowed_packet的值
max-packet: 最初設定為資料庫參數net_buffer_length變量的值(預設為16K),可以增大,最大值為資料庫參數max-allowed-packet(預設為4M)
retry_count:認定網絡I/O操作失敗前應該重試的次數,預設為10。見函數(sql\net_serv.cc : net_should_retry)
remain_buffer:使用壓縮協定時,可能會讀取超過壓縮長度之外的内容,該變量緩存這部分内容。不适用壓縮協定時該值無效. 見函數(sql\net_serv.cc: my_net_read)
buff_end:目前配置設定buffer的結尾處。初始化配置設定max_packet,該指針指向buffer + net->max_packet,見函數(sql\net_serv.cc: my_net_init)
length:目前包的長度,不包含標頭
write_pos:目前緩沖區寫入的内容。eg:寫一個4位元組的整數,該值+4
read_pos:目前從緩沖區讀取的内容
buffer_length:包緩沖區的長度。如果壓縮,緩沖區包含下一個包的前移内容
where_b:緩沖區目前讀位置的偏移量,值等于read_pos-buffer
save_char:緩沖區末尾為0能提高運算效率。給值用于儲存原有的值,後續恢複。
vio: 封裝了對各種套接字進行操作的接口,底層操作套接字進行實際的封包資料的收發