一台计算机上多个进程间的通信方式有:管道、共享内存、信号量、消息队列。如果不同的计算机上多个进程间通信,即通信的进程在不同的计算机上,需要用到网络相关的知识。
那么两台计算机通信需要解决哪些问题?
我们来回顾一下计算机整体的硬件架构,CPU 通过内存总线和内存连起来,通过 IO 总线和其他的外部设备连起来,计算机如果要上网,跟其他的计算机相连,需要有一个网卡,网卡属于外部设备,也是通过 IO 总线和我们计算机的 CPU 相连,网卡我们也可以称之为网络适配器,网卡就是用于我们整个计算机和其他的计算机联网通信的一个硬件设施,在一台机器上,我们可以有多个网卡,比方说我们机器可能有一个有线网卡和一个无线网卡。网卡有一个接口,这个接口,实际上就是跟我们的网线连在一起的,我们可以看一下自己的电脑,一般都会有这么一个接口,用于连接网线。
有了这个网卡之后,一台计算机就可以通过网线和其他的计算机连接起来,通过一根网线连接两台计算机的网卡,这个是最简单的一种场景,两台计算机,是可以通过网线来通信的,网线上传输的都是 0101 的比特数据,两台计算机我们把它称之为主机,网线我们把它称之为链路。
如果是多台机器,它们之间怎么样相互连接起来呢?
比方说我们有多台计算机,当然,我们可以通过每两台计算机之间,都用一条链路把它连接起来,理论上这样是可以的,但这个成本太高,不现实。一般,我们会通过一个叫交换机的中间设备来连接多台计算机,交换机会有多个接口,每一个接口,都会有自己各自的接口号,然后我们的计算机就跟这个交换机的接口连在一起,这样可以使这些计算机相互连在一起。
这时,我们的两台主机如何通信呢?
在这里,我们就需要有一个地址的概念,主机的每一个网卡,都会有一个全球唯一的地址,这个地址我们称之为 MAC 地址,MAC 地址用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡会有一个唯一的 MAC 地址。因为你只有知道了这个机器的地址,你才可以跟这个机器通信,那么怎么查看机器的 MAC 地址呢? Windows 可以在命令提示符下输入 ipconfig /all
来查看,Linux 可以通过 ifconfig
或 ip addr
来查看。
有了交换机和 MAC 地址,我们再来看多台计算机的互连,为了简单起见,我们这里的每一台主机,我们使用 A、B、C、D、E、F 来表示每一台主机网卡的 MAC 地址,在交换机会维护一张表,这个表我们把它称之为交换表,交换表里面有两列,一个是 MAC 地址,一个是对应的接口号,主机对应的网卡,和交换机的一个接口号相连,交换机里面会维护这样一个映射关系,根据这个映射关系,假设主机 A 想把数据发给主机 D ,我们在发送数据的首部,添加主机 D 的 MAC 地址,然后把添加了主机 D 的 MAC 地址的数据,发送给交换机,从接口 1 进入交换机,交换机看到了这个数据是发给 MAC 地址为 D 的主机,交换机就会去查找交换表,查找 MAC 地址为 D 应该从哪一个接口号出去,查到了从接口号 4 出去,然后这个数据到达了 MAC 地址为 D 的主机,这样就完成了数据的通信。有了交换机之后,每一台机器的网卡,需要有一个唯一的 MAC 地址,两台机器才可以在网络里面进行通信。这里可能还会有一个问题,主机 A 是怎么知道主机 D 的 MAC 地址呢?