进程间通信的方式
其中只有 socket 是用于处于不同设备上的 进程进行通信的,其他的方式都是同一个设备上不同进程之间的通信。
这篇 进程间通信 写的特别好,可以进行参考
OSI 七层模型(Open system interconnection model)
这篇 osi 七层模型 讲的很好
总结OSI模型
- 物理层是负责将网线、光线等不同形式的信号按照某种特定的通用的标准接入当前的计算机,完成信息从外界接入的功能
- 数据链路层负责对物理层拿到的数据进行切分,分成不同的组,封装成帧。同时如果一个局域网中的不同计算机想要进行通信,可以通过数据链路层进行广播(广播的数据包含了他自己的 MAC 地址和数据)。但是如果不是在同一个局域网中,数据链路层的广播无法达到目标的计算机,这个时候需要使用网络层进行 “跨局域网”,即与互联网中的其他局域网进行通信。
- 每个局域网要接入互联网中,就需要一个 网关,这个网关也同样使用一个 MAC 地址作为设备的标识,同时用一个 IP 地址标识他在网络中的位置;然后网络层就是负责接入互联网把信息进行网络之间的转发和路由
- 传输层用来建立端对端的通信通道;端到端通信其实就是端口到端口之间的通信,而在一个计算机中,不同的应用程序占用不同的端口,也就是不同应用程序之间的通信,也就是不同进程之间的通信,所以我们说端到端通信(进程间通信)用 socket ,一般使用 tcp 或者 udp 协议。
- 会话层允许不同主机上的各个进程之间进行会话。会话层利用传输层提供的端到端的服务,向表示层提供它的增值服务。这种服务主要为表示层实体或用户进程建立连接并在连接上有序地传输数据,这就是会话,也称建立同步SYN。
会话层负责管理主机间的会话进程,包括建立、管理及终止进程间的会话。会话层可以使用校验点是通信会话在通信失效时从校验点继续恢复通信,实现数据同步。 - 表示层的基本作用就是对数据格式进行编译,对收到或发出的数据根据应用层的特征进行处理,如处理为文字、图片、音频、视频、文档等,还可以对压缩文件进行解压缩、对加密文件进行解密等。只有在表示层将数据处理完成后,才能将转格式编译后的数据呈现在应用程序中,让用户能够看懂
- 应用层(Application Layer)提供为应用软件而设的接口,以设置与另一应用软件之间的通信。例如: HTTP,HTTPS,FTP,TELNET,SSH,SMTP,POP3等
多方通信(Multi-Party Communication)
-
点对点(Point-to-Point) -
多个点对点(multiple Point-to-point) -
一点对多点(point-to-multipoint) -
多点对一点(multipoint-to-point) -
多点对多点(multipoint-to-multipoint) -
通常情况下我们考虑 2 个进程之间的 点对点的通信 -
超过 3 个进程之间的我们叫做多点间的通信 -
UDP 采用的是 point-to-multipoint 的通信方式,即,一个进程向多个进程传输一份数据,这一份数据被网络转发成多份完全相同的数据,然后让多个进程同时得到。与之不同的是 multiple point-to-point 的方式,他是通过一次向一个进程发一份信息,然后再向第二个进程发送,然后依次下去。 -
multipoint-to-point 和 multipoint-to-multipoint 比较少见,他们采用比 UDP 的方式更加高效的方式,即通过多个进程的信息聚合成一个信息,把这个信息同时发送给多个进程。即发送方每个 point 发送整体信息的一部分而接收方则接收到聚合后的信息。 -
注意,上面的 point 代表的是进程(不是线程),每个进程可以代表一个应用程序。
通信协议(Communication Protocols)
通信协议是指双方实体完成通信或服务所必须遵循的规则和约定。通过通信信道和设备互连起来的多个不同地理位置的数据通信系统,要使其能协同工作实现信息交换和资源共享,它们之间必须具有共同的语言。交流什么、怎样交流及何时交流,都必须遵循某种互相都能接受的规则。这个规则就是通信协议
- 协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方
- 通信协议和分布式算法的区别:通信协议没有终止,而算法必须要能够终止才是有效的
- 通信协议消耗的资源至少等同于一个有限状态机(Finite State machine)
- 进行通信的一方处于 协议定义 的几种状态之一,或者正在从一种状态过渡到另一种状态。即,通信的多方必须处于协议定义的状态的限定范围中
- 状态转换由环境中的 事件或通信各方的动作触发,例如接收数据、发送数据或发生其他事件(如超时)
- 通信协议适用于分布式系统的所有层,从最底层开始 (物理层)到最高层(应用层或用户层)。
通信协议三要素
通信协议举例:电话通信协议(TelePhone Communication Protocol)
- 类似于有限状态机,有很多种定义的状态, 通信的各方必须处于状态中
- 根据不同的事件或者其他通信方的行为进行状态的转换或终止
- 可以不终止
- 这个图中一共有如下几种状态(大圆圈表示的就是状态):
- AVAILABLE
- RINGING
- CALLING
- TALKING
- WATING FOR
- NOT TALKING
- NOT LISTENING
- 图中也有很多种触发状态转换的行为和事件(线上画的语句就是事件)
时序图(Interaction Diagrams / Sequential Diagram)
- 使用序列或交互图(有时称为事件图)表示通信各方之间由通信协议产生的交互序列很多时候是很有帮助的
- 交互图上的平行垂线表示系统中线程和其他组件的生命周期,水平箭头表示方法调用和他们之间的消息。
- 实箭头表示同步操作(synchronous),因此调用者必须等待操作完成(返回)后才能继续操作
- 中空箭头表示异步操作 (asynchronous),调用者可以继续操作,而不必等待操作的结果
- 时间轴上的激活框显示正在进行的活动。
电话通话协议的时序图表示
C/S 架构, 多服务器架构 和 P2P 架构
C/S 客户端-服务器:只能充当客户端或服务器端
- 客户端服务器架构
- 一方充当客户端的角色,一方充当服务器的角色
- 服务器 创建 IPC 通信终端并且等待客户端初始化通信,等待客户端的连接并和客户端通信
- 客户端 初始化 到服务器的一组通信
多服务器架构(multi-server)和 P2P :(peer-to-peer):多重角色
- 多服务器架构:多个服务器之间通信,每个服务器也可以充当客户端。
- peer: 一个进程 process 即充当客户端,又可以充当服务器端; 既可是其他进程的客户端,用来 初始化 一组 IPC,也可以作为服务器 创建 IPC 通信
数据编码(Data Encoding)
- 虽然数据的最基本形式是字节数组,但如何将信息编码到这些字节中被称为数据编码,有许多流行的选择:
数据格式(Data Formats)
- 一般使用 text encoding 将前三类转换成字节数组,然后在不同的进程之间进行字节数组的传输
- 第四类包括富文本,mp3 等采用二进制编码成字节数组
- 如果是 java 的 object 对象则采用序列化的方式转换成可以传输的字节数组
数据协议(Data Protocol)
- 会话层协议需要支持所需数据格式的通信,这样服务器就知道需要什么,以及如何解组或解释它接收到的数据;如果数据协议没有规定目标种类的传输数据,就不能使用这种形式的数据进行通信。
流(Stream)和 IPC 数据报(Datagram)
- 流的长度没有限制,最基本的元素师 byte 数组;发送端往往把数据写入到流中,接收端从流中读取数据;流从发送端到接收端一定是完整的,不允许损坏
- 数据报有固定的长度限制;数据报发送端顺序和接收的顺序可能不一致;数据报传输过程中允许丢包
TCP
- TCP 通过拥塞控制(congestion control)提供 可靠 的字节流
- TCP 是面向字节流的
- TCP 提供可靠传输
- TCP 是面向连接的
UDP
- UDP 是面向数据报的
- UDP 提供 “best-effort” 传输
- UDP 是面向 无连接 的
TCP 和 UDP 都需要目标的 ip 地址和 端口号,但是 TCP 需要建立连接然后才发数据,而 UDP 则直接把数据甩过去,别的就不管了。
公网 IP / 私网 IP
- 公网 ip :在公共网络中的每台机器都会分配一个公网 ip,拥有公网 ip 的机器可以直接相互访问
- 私网 ip:每个局域网中的机器会被路由器分配一个私网的 IP,一个局域网中的具有私网 ip 的机器可以相互访问,但如果想接入公网就需要借助网关,当私网中的网络想要接入互联网访问其他公网信息的时候,网关会给这个机器分配一个公网的 ip;之所以这么做是为了节约 ip 资源
- 127.0.0.1 是一个机器固定的地址,称为 “loopback” 地址 也可以成为 localhost,这个地址代表的就是主机的地址,主机上的进程访问主机的任何端口都可以通过 这个 ip 地址,这个 ip 不会经过网络通道,而是直接在机器内部进行通信。
- 有一些地址是保留地址(为私网保留的)
10.0.0.0/8 and 192.0.0.0/24 and 192.168.0.0/16
Socket 和 Server Socket
- Socket , ServerSocket 默认都使用 TCP 协议
- 服务器端通过创建一个 ServerSocket 并把 IP地址和 端口号绑定
- 客户端通过指定目标服务器的 ip地址和 端口号对服务器进行访问
- ServerSocket 对于每一个进入的连接都单独创建一个 socket
- 客户端和服务器的交流通过数据流 DATA STREAM
- 通信结束,socket 销毁
Java 抽象类 InputStream 和 OutputStream
问题解答Question
Q1-Q3 关于进程间通信
- multipoint-2-multipoint is uncommon in network protocols, however maybe seen in application protocols that do all-all communication. There’s also partial groups where you may see torrenting peers or similar.
- multipoint-2-point is uncommon in network protocols, however may be seen in application protocols. An example would be logging/push monitoring where mutliple clients push to a single listener which “ingests” data.
首先清楚一个概念:multi-cast 和 broadcast
multi-cast : 组播(多播)。为了减少在广播中涉及的不必要的开销,可以只向特定的一部分接收方(可以是域内也可以是域间)发送数据。 broadcast: 广播。指将报文发送到网络中的所有可能的接收者
- Because the wireless transmission cannot select who receives and who does not. However if we use repeaters to reach a greater number of receivers then the repeaters can selectively choose to repeat or not.
- 因为无线传输不能选择谁接收谁不接收。然而,如果我们使用中继器到达更多的接收器,那么中继器可以有选择地选择重复或不重复。
- Shared memory among multiple processes can be thought of as point-to-multipoint: a single process writes to a memory address and many processes can read it. This depends on the memory access semantics. Naturally, multiple writers to
a single byte (smallest addressable unit), will have a sequential nature - if the operations are atomic. What if we have multiple bytes? well then we need additional protocols in order to ensure make it work correctly - who writes/reads where?
Q4-Q7 关于通信协议
- 以电话通信协议为例,回答下列问题
- 因为 TALKING 状态发生转变只能有以下几种情况来触发:
- 因此 TALKING 的时候来 incoming call arise 的事件是不会改变任何事情的。因为这个事件不在电话通信协议的定义中
- 其实类似于对讲机,我们需要听和说是互斥的,如下图的设计方法即可;通过 say over 可以直接转换到 listen 状态,而接收到 over 信息就自动转成 talking 状态
- 这个通信协议中,必须接受到 hello 才能开始说话,如果一端发送 hello 失败,或者是 hello 没有被听到,错误就会发生。同样地,还发生在结束通话时说的 “goodbye” 如果突然一方断掉,没法说 “goodbye” 状态就无法转换到 NOT LISTENING 因此需要在原有的通信协议中加入 “突然中断” 的处理状态
- 如果没有这些状态,比如没有 NOT LISTENING 这个状态,那么在接收到对方的 goodbye 之后就会马上结束通话,但是这样是不对的,我们可能还有话没说完,因此要等到双方都说完了,才真正结束通话。
Q8 关于公网ip 和 私网 ip
- This is about Network Address Translation (NAT)or some other technique that routers may use like port forwarding (Virtual Server) to specific local IP addresses based on the port of the incoming packet
- 内网穿透
Q9-Q10 客户端/服务器通信的时序图,FSM图
|