1.2 分布式系统介绍--网络通信基础知识

网络通信基础知识

在分布式系统中, 组件分布在网络上的多个节点中, 通过消息的传递来通信并且进行动作的协调。因此网络通信在分布式系统中非常重要。

一、OSI与TCP/IP网络模型

1.2 分布式系统介绍--网络通信基础知识_第1张图片

【OSI网络模型】

1.2 分布式系统介绍--网络通信基础知识_第2张图片

【OSI与TCP/IP模型对照】

二、网络IO实现方式

当我们使用Socket套接字进行网络通信开发时,有以下三种方式:BIO、NIO和AIO。

1.BIO方式

BIO即Blocking IO, 采用阻塞的方式实现。也就是一个Socket套接字需要使用一个线程来进行处理。发生建立连接、读数据、写数据的操作时, 都可能会阻塞。
这个模式的
好处是简单, 这样做带来的主要问题是使得一个线程只处理一个Socket, 如果是Server端,那么在支持并发的连接时, 就需要更多的线程来完成这个工作。

1.2 分布式系统介绍--网络通信基础知识_第3张图片

【BIO的工作方式】

2. NIO方式

NIO即Nonblocking IO, 基于事件驱动思想, 采用的是Reactor模式。

这在Java实现的服务端系统中也是采用比较多的一种方式。相对于BIO,NIO的一个明显的好处是不需要为每个Socket套接字分配一个线程, 而可以在一个线程中处理多个Socket套接字相关的工作。

1.2 分布式系统介绍--网络通信基础知识_第4张图片

【Reactor 模式】

上图说明了Reactor模式的工作方式,Reactor会管理所有的handler, 并且把出现的事件交给相应的Handler去处理

在NIO的方式下不是用单个线程去应对单个Socket套接字,而是统一通过Reactor对所有客户端的Socket套接字的事件做处理,然后派发到不同的线程中。这样就解决了BIO中为支撑更多的Socket套接字而需要打开更多线程的问题。

1.2 分布式系统介绍--网络通信基础知识_第5张图片

3. AIO方式

AIO 即AsynchronousIO, 就是异步IO。AIO 采用Proactor 模式。

AIO 与NIO 的差别是, AIO 在进行读/写操作时, 只需要调用相应的read/write 方法,并且需要传入CompletionHandler (动作完成的处理器);在动作完成后, 会调用CompletionHandler, 当然,在不同的系统上会有一些细微的差异,不同的语言在SDK上也会有些差异,但总体就是这样的工作方式。

NIO 的通知是发生在动作之前, 是在可写、可读的时候, Selector 发现这些事件后调用Handler 处理。

1.2 分布式系统介绍--网络通信基础知识_第6张图片

【Proactor 模式】
AIO是在Java 7中引入的。在Java领域,服务端的代码目前基本都是基于NIO的。

而AIO和NIO的一个最大的区别是,NIO在有通知时可以进行相关操作,例如读或者写,而AIO在有通知时表示相关操作已经完成。
BIO、NIO、AIO这几种模型并不要求客户端和服务端采用同样的方式。客户端和服务端之间的交互主要在于数据格式或者说是通信协议。在客户端,如果同时连接数不多,采用BIO也是一个很好的选择。

————————————————————————————————————————————

内容来源---《大型网站系统与JAVA中间件实践》

你可能感兴趣的:(#,Java中间件,分布式,网络通信)