原理
网络通信(或通讯)模型和通讯协议(常见的 HTTP、TCP/IP、FTP等)解决的本质问题就是主机与主机之间的网络通信;
通信必要条件
(抛开封装数据的部分,两台主机之间要想完成通信,至少需要满足的条件)
- 主机之间需要有传输介质建立物理连接:如网线、蓝牙、光纤、wifi;
- 主机上必须有网卡设备:
- 当两台主机建立了连接后就要考虑数据是以什么样的形式进行传输;
- 不论采用哪一种编程语言进行开发,在计算机的世界里所有的数据最终都会被转为二进制,即便如此也只是解决了当前计算机识别数据的问题,而网络通信需要的是数据可以通过介质进行传输;
- 以网线为例,它能传输的就是电信号,源源不断的高低电压,而不是 1 和 0 组成的数字,所以每个通信的主机上就要有一个网卡设备;
- 网卡可以完成信号的调制和解调制,其中把二进制的数据转为高低电压的过程就是数据的调制过程;
- 例如,现在有 A、B 两台主机建立了网线的连接想进行通信,这时 A 主机上就会将封装好的数据经过 A 的网卡之后进行调制,将其处理成电信号,这个电信号经过网线传到了 B 主机上,接着 B 主机上的网卡就会进行解调制拿到封装后的数据,之后由 B 主机本身的通信体系进行拆包解包,最终由某个应用程序获取 A 主机发送过来的数据;
- 主机之间需要协商网络速率:因为 A、B 两台主机的网卡可能速率不一样,它们每秒传输的电信号也就不一样,所以在 A、B 主机通信之前,还要协商网络速率;
网络通讯方式:
- 交换机通讯
- 路由器通讯
如何建立多台主机互连?
- 日常所处的网络不可能只存在两台主机,依据通讯的基础条件,首先要考虑的就是如何讲我们的电脑与别的电脑进行连接;
- 假如要与另外 10 台电脑进行通讯,不可能购买一台具有 10 个网卡设备的电脑,这个时候就可以用过交换机完成这个事情;
- 通过交换机可以多台电脑进行连接(不考虑交换机的层级);
- 当通过交换机把多台主机连接在一起之后,它们就形成了一个网络,而这个网络就是日常所说的局域网;
如何定位局域网中的其它主机?
- 对于 主机A 来说,它是不认识其它主机的,当 主机A 想和 主机B 通讯的时候该如何找到主机B?这个操作最终会有交换机来完成;
- 任意一台主机都有一个唯一标识网卡设备的地址:Mac 地址,称之为物理地址;
- 以广播的方式为例,主机可以把消息发送给交换机,交换机接收到消息后再通知其它所有的机器,在这个过程中其它所有的机器就都会收到这条消息,真正的 主机B 就会发现 主机A 想找到是自己,而其它的主机就会将这次的消息当作垃圾丢弃;
- 这个过程就是通过交换机来完成局域网通讯的操作;
- 这种通讯的模式有一些小问题,同时无法满足当前互联网需求,例如:
- 交换机的接口数量有上限;
- 不可能将所有的电脑都放在一个局域网内;
- 局域网存在大量主机会造成广播风暴;
- 任意一条消息的发送,都需要被其它主机接收,然后再确认是否有效;
- 基于这种情况,网络就被分成了很多个较小的局域网,然后就是城域网,直到最大的互联网;
不同局域网的主机如何通讯?
- 分属不同局域网的主机要想通讯就需要用到路由器来完成数据的交换:
- 首先 局域网1-主机A(下称 A)要想访问 局域网2-主机B(下称 B),不仅需要知道 B 的网卡地址,还需要知道它在哪一个网络里,这就需要 IP 地址;
- 数据在发送的时候,不仅仅包含程序代码所接收到的数据,还有源 Mac 地址、源 IP 地址、目标 Mac 地址以及目标 IP 等,这些内容首先会被组装成一条数据,之后会发送到路由器上面;
- 路由器可以识别目标主机是否在当前局域网内,如果不在,路由器会按照路由表上记录的信息通过网络路由找到对应的网络,然后再把数据发送过去;
- 发送到对应的网络后,由那边的交换机完成最后的定位功能;
- 这样就完成了不同网络之间的主机通讯;
- 这里的目的不是为了详尽的理解网络通讯发生的每个细节,例如静态/动态路由的设置或者 IP 地址的动态分配等,更多是明确通讯的流程和一些核心的概念;
- 例如通讯需要具备的条件;
- 通讯是双向的,一定是有来有回;
- 数据在传输的过程中会与 IP 地址和 Mac 地址包裹在一起;
核心模块 stream
上一篇