作者:路路
酷爱技术、乐于分享的技术人,目前次要从事数据库相干技术的钻研。
本文起源:原创投稿
*爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。

前言

对于计算机学科来说,计算机网络相干常识的重要性显而易见。平时咱们框架用的多了,对于底层网络 IO 的解决关注的并不算多(如果不让你用 Spring,你还能写出个 Web 接口吗?),但对于中间件以及框架的开发者来说,网络 IO 的解决却是最须要关注的中央。

DBLE 的网络模块没有用任何框架,齐全是通过原生 JDK 纯手写的。研读 DBLE 网络模块的源码,可能让你对网络 IO 的解决有更进一步的了解。为什么连贯 DBLE 可能像连贯 MySQL 一样?为什么 DBLE 的性能可能如此高?心愿通过本系列文章,可能帮忙大家对DBLE的网络模块有更深刻的理解,更进一步,心愿可能帮忙大家对高性能网络 IO 有更深刻的理解。

本篇作为 《DBLE 网络模块源码解析》的第一篇,次要讲讲网络 IO 的基础知识。

一、TCP/IP 协定栈

TCP/IP 协定在肯定水平上参考了 OSI 的体系结构。OSI 模型共有七层,从下到上别离是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。然而这显然是有些简单的,所以在 TCP/IP 协定中,它们被简化为了四个档次,从下到上顺次是链路层、网络层、传输层和应用层。

不同层之间的数据封装如下图所示:

从上图能够看出上一层的协定数据都是作为下一层协定的音讯体来传输的。所以协定从上到下,是一层一层封装的构造。

二、MySQL 协定

MySQL 协定在 TCP/IP 协定栈中是处于应用层这一层。从而可能晓得 MySQL 协定数据是作为 TCP 协定中的音讯体局部来传输的。

因为 TCP 为面向流的协定,没有界线,会存在粘包拆包问题,须要在应用层解决。常见的解决办法有:

  1. 音讯定长,例如每个报文的大小为固定长度 100 字节,如果不够,空位补空格;
  2. 在包尾减少回车换行符进行宰割,例如 FTP 协定;
  3. 将音讯分为音讯头和音讯体,音讯头中蕴含示意音讯总长度(或者音讯体长度)的字段;
  4. 更简单的应用层协定。

MySQL 协定是通过音讯定长和在音讯头中蕴含音讯体长度字段的办法来解决 TCP 粘包问题的。如下图所示:

https://dev.mysql.com/doc/dev...

连贯 DBLE 既然能像连贯 MySQL 一样,那 DBLE 肯定要可能解决 MySQL 的数据包,如何解决这些数据包在代码里都有体现,我将在网络模块源码解析里具体解说 DBLE 对于 MySQL 数据包的解决。

三、BIO 与 NIO

DBLE 性能可能如此之高,与它的高性能网络 IO 解决离不开关系。DBLE 中解决前端客户端连贯及后端 MySQL 数据库连贯都应用了 NIO 的形式,即 IO 多路复用技术

在网络连接数较少的状况下通过 BIO+ 多线程的形式也可能比拟疾速的解决申请,但随着连接数的增多,线程间的切换带来的性能损耗将大于多线程解决带来的性能晋升,从而导致整体性能降落。

而 NIO 即 IO 多路复用技术,可能通过大量线程治理更多的连贯。NIO 不会为每个连贯创立一个解决线程,而只是在连贯有数据的时候进行解决。NIO 再加上申请数据处理异步化,是 DBLE 高性能的机密。

下期预报

本篇文章为 DBLE 网络模块源码解析的第一篇,次要介绍了对于网络 IO 的一些基础知识。包含 TCP/IP 协定栈、应用层 MySQL 协定、BIO 和 NIO 相干常识,为前面的源码解析做个铺垫,下一篇将从源码角度具体解说 DBLE 的网络解决逻辑,心愿可能对大家有所帮忙。