分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识

AlgoCraft
• 阅读 1081
作者:路路
热爱技术、乐于分享的技术人,目前主要从事数据库相关技术的研究。
本文来源:原创投稿
*爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。

前言

对于计算机学科来说,计算机网络相关知识的重要性不言而喻。平时我们框架用的多了,对于底层网络 IO 的处理关注的并不算多(如果不让你用 Spring,你还能写出个 Web 接口吗?),但对于中间件以及框架的开发者来说,网络 IO 的处理却是最需要关注的地方。

DBLE 的网络模块没有用任何框架,完全是通过原生 JDK 纯手写的。研读 DBLE 网络模块的源码,能够让你对网络 IO 的处理有更进一步的理解。为什么连接 DBLE 能够像连接 MySQL 一样?为什么 DBLE 的性能能够如此高?希望通过本系列文章,能够帮助大家对DBLE的网络模块有更深入的了解,更进一步,希望能够帮助大家对高性能网络 IO 有更深入的了解。

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

一、TCP/IP 协议栈

TCP/IP 协议在一定程度上参考了 OSI 的体系结构。OSI 模型共有七层,从下到上分别是物理层、数据链路层、网络层、运输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在 TCP/IP 协议中,它们被简化为了四个层次,从下到上依次是链路层、网络层、传输层和应用层。

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

分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识

从上图可以看出上一层的协议数据都是作为下一层协议的消息体来传输的。所以协议从上到下,是一层一层封装的结构。

二、MySQL 协议

MySQL 协议在 TCP/IP 协议栈中是处于应用层这一层。从而能够知道 MySQL 协议数据是作为 TCP 协议中的消息体部分来传输的。

因为 TCP 为面向流的协议,没有界限,会存在粘包拆包问题,需要在应用层解决。常见的解决方法有:

  1. 消息定长,例如每个报文的大小为固定长度 100 字节,如果不够,空位补空格;
  2. 在包尾增加回车换行符进行分割,例如 FTP 协议;
  3. 将消息分为消息头和消息体,消息头中包含表示消息总长度(或者消息体长度)的字段;
  4. 更复杂的应用层协议。

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

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

分布式 | DBLE 网络模块源码解析(一):网络 IO 基础知识

连接 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 的网络处理逻辑,希望能够对大家有所帮助。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
4年前
AssemblyScript 入门指南[每日前端夜话0xEB]
每日前端夜话0xEB每日前端夜话,陪你聊前端。每天晚上18:00准时推送。正文共:2459 字预计阅读时间:10分钟作者:DannyGuo翻译:疯狂的技术宅来源:logrocket!(https://oscimg.oschina.net/oscnet/b880277c594152a503
Wesley13 Wesley13
4年前
Oracle 19c 之 RPM 包安装初体验(一)
!(https://oscimg.oschina.net/oscnet/73fd8642b7364f1de2863b0ceb5f35321b0.gif)作者|JiekeXu来源| JiekeXu之路(ID:JiekeXu\_IT)转载请联系授权| (微信ID:xxq1426321293)大家好,我是JiekeXu,
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
TurnipBit开发板DIY呼吸的吃豆人教程实例
  转载请以链接形式注明文章来源(MicroPythonQQ技术交流群:157816561,公众号:MicroPython玩家汇)  0x00前言  吃豆人是耳熟能详的可爱形象,如今我们的TurnipBit也集成了这可爱的图形,我们这就让他来呼吸了~。  0x01效果展示  先一起看下最终的成品演示视频:  http:/
Wesley13 Wesley13
4年前
Oracle 11g 临时表空间管理
!(https://oscimg.oschina.net/oscnet/0b25083732234ac49faeeae768ad90f5.gif)作者|JiekeXu来源| JiekeXu之路(ID:JiekeXu\_IT)转载请联系授权| (微信ID:xxq1426321293)大家好,我是JiekeXu
AlgoCraft
AlgoCraft
Lv1
纵然万劫不复纵然相思入骨我也待你眉眼如初岁月如故.
文章
8
粉丝
0
获赞
0