0%

关于MySQL网络协议中的数据包序号

对MySQL协议稍作了解后,我们就知道在协议中,服务端与客户端相互之间的通讯都是以包的形式进行的。

在这些包中,有一个固定的特征就是前四个字节用途不变,前三个字节表示数据包的长度,第四个字节表示当前包在本次交互中是序数。

前三个字节最大只能表达16M的长度,这是三个字节表达无符号整型的极限,所以,每次客户端可以接受到的最大数据包为16M+4个字节。

至于第四个字节,这是表达当前包的序数的,一个字节能表达的最大正整数是255。我们知道,在MySQL协议中,发送COM_QUERY命令后,服务器返回的数据格式为,响应头为一个包,然后,每一个字段的描述也会是一个包,字段说明后面会跟一个EOF包表示字段描述结束,之后则跟随的是表中的数据,每一个数据包表达一行数据,一般情况,我们每次从数据库里检索的条数,去掉描述协议的部分,在序数中我们还有不少空间可以用在数据记录上,但是,如果总的包数超过255,那会是怎么的情况哪?

在我们使用数据库的经验中,我们可以经常有机会看到很多条记录同时显示出来的例子,记录数明明超过了255,可是依然正常显示,这是为什么哪?

经过对MySQL交互嗅探,我发现在数据包次序达到255后,之后紧随的包的次序就变成了0,在Wireshark的协议分析中会认为这是错乱的协议,我想,这应该是MySQL特意使用的方式。

前后端的交互中,到发现次序达到255后,对序数加1,由于只使用了一个字节,所以数据溢出变成了0,这样的情况在MySQL协议中被认为是合法的,只要前后端认可这种方式,那这种通讯就不会出错。

所以我认为,在MySQL通讯中,包序号只是用来确认包的次序没有发生错误的,至于序号是几并不重要,只要认定255号后为0号是合法的,那就可以达到正常交互并保证数据序号不会出错的目的。

Welcome to my other publishing channels