那么我们若何选择连接方法呢?小我总结了以下几个原则:
- 若是你能肯定法度榜样和数据库在同一台机子(类Unix体系)上,推荐应用Unix Sockets,因为它效力更高;
- 若数据库分布在不合的机子上,且能确保连接安然或者安然性请求不是那么高,推荐应用TCP/IP,反之应用TLS/SSL;
MySQL数据包
通信中最重要的就是数据,那么法度榜样是若何和MySQL Server进行通信,并交互数据的呢?比如若何验证账户,发送萌芽语句,返回履行结不雅等,我先画一个流程图来模仿一下全部过程,赞助大年夜家懂得:
全部过程相对来说照样比较清楚的,我们对连接要乞降断开请求不须要过分关怀,只须要懂得这一点就可以了,重要的是其他几点,那么在这几步中,数据是怎么进行交互的呢?
1.根本数据类型
起首Integer在MySQL协定中有两种编码方法,分别为FixedLengthInteger和LengthEncodedInteger,个中前者用于存储无符号定长整数,实际中应用的不多,这里侧重讲一下后者。
本篇文┞仿重要讲述了MySQL的连接方法,通信过程及协定,以及传输包的根本格局和相干传输包的类型,内容相对来说,比较多也比较复杂,我也是将近三周才写完,但总体按照我自学的思路走,不会太绕,有些点可能须要细心思虑下,写的有误的处所也欲望大年夜家能斧正,欲望对大年夜家有所赞助,后面可能会写几个实例和大年夜家一路进修。
每个包的根本格局:
Type Name Description int<3> payload_length(包数据长度) 具体数据包的内容长度,大年夜出去头部四个字节后开端的内容 int<1> sequence_id(包序列id) 每个包的序列id,总数据内容大年夜于16MB时须要用,大年夜0开端,依次增长,新的敕令履行会重载为0 string payload(具体数据) 包中除去头部后的具体数据内容应用LengthEncodedInteger编码的┞符数可能会应用1, 3, 4, 或者9 个字节,具体应用字节取决于数值的大年夜小,下表是不合的数据长度的┞符数所应用的字节数:
最小值(包含) 最大年夜值(不包含) 存储方法 0 251 1个字节 251 2^16 3个字节(0xFC + 2个字节具体数据) 2^16 2^24 4个字节(0xFD + 3个字节具体数据) 2^24 2^64 9个字节(0xFE + 8个字节具体数据)举个简单的例子,比如1024的编码为:
- 0xFC 0x00 0x04
个中0x代表16进制,实际数据传输中并没有该标识,第一位代表这是一个251~2^16之间的数值,所今后面两位为数值具体的值,这里应用的是小端字节序,MySQL默认应用的也是这种编码次序,所以这里1024是0x00 0x04,字节序相干常识可以参考:懂得字节序,到这里大年夜家应当对这种编码格局有了必定的懂得了,下面我们就来看看String。
String(字符串)
String的编码格局相对Integer来说会复杂一点,重要有以下几种:
- FixedLengthString(定长方法):需先知道String的长度,MySQL中的一个例子就是ERR_Packet包(后续会讲到)就应用了这种编码方法,因为它的长度固定,用5个字节存储所稀有据。
- NullTerminatedString(Null结尾方法): 字符串以碰到Null作为停止标记,响应的字节为00。
- VariableLengthString(动态计举动当作符串长度方法): 字符串的长度取决于其他变量计算而定,比如一个字符串由Integer + Value构成,我们经由过程计算Integer的值来获取Value的具体的长度。
- LengthEncodedString(指定字符串长度方法): 与VariableLengthString道理类似,是它的一种间谍作况,具编制子就是我上条举的┞封个例子。
- RestOfPacketString(包末尾字符串方法):一个包末尾的字符串,可根据包的总长度金和当前地位获得字符串的长度,实际中并不常用。
总的来说String的编码格局种类比拟较较多,不合方法之间的差别也比较大年夜,若要深刻懂得还需大年夜实际的例子里去进修,后续文┞仿中我会写几个demo带大年夜家一路去摸索。
2.根本数据包格局
数据包格局也重要分为两种,一种是Server端向Client端发送的数据包格局,另一种则是Client向Server端发送的数据包。
Server to Client
Server向Client发送的数据包有两个原则:
- 每个数据包大年夜小不克不及跨越2^24字节(16MB);
- 每个数据包前都须要加上数据包信息;
举个列子:
- 01 00 00 00 01| <li>payload_length: 1</li> <li>sequence_id: 0x00</li><li>payload: 0x01</li>
推荐阅读
CTO练习营 | 12月3-5日,深圳,是时刻成为优良的技巧治理者了alter user user() identified by 'admin'; 这几天因为做项目须要,要应用MySQL数据库,应用的是MySQL Community Server 5.7.>>>详细阅读
本文标题:关于MySQL的网络协议分析
地址:http://www.17bianji.com/lsqh/39379.html
1/2 1