0. 简单了解计算机网络
考虑这样一个问题,如果我们想要在两台电脑(电脑A、电脑B)之间建立通信,应该怎么做?很容易想到以下方法:将两台电脑用一根线连接起来不就行呢?
看起来还不错,但是如果多来几台电脑,就会变得很乱。而且这样成本也很高:
为了解决这个问题,我们可以创建一个中转站,所有电脑的连接都通过这个中转站进行转发:
所有电脑都可以向这个中转站发送信号,然后中转站将这个信号发送出去,其余电脑都能收到这个信息。这时就需要确定这个信号预期应该传输到哪个电脑。每个电脑都有一个唯一的Mac地址(Media Access Control Address:媒体访问控制地址,每台电脑生产时就确定的,一般电脑会有两个Mac地址,一个用于有线网卡,一个是WIFI使用的无线Mac地址),为了达到这个目的,我们可以在信号中包含目标机器的Mac地址,这样其余机器就可以通过这个地址判断是否应该接收这个信号。这种中转站被称为HUB集线器。
集线器存在一个缺陷:每次只能有一个信号在线路中传输。因为如果存在两个电信号,由于没有别的信息可以区分这两个信号,因此会导致信号杂糅起来,无法识别。集线器通过CSMA/CD协议解决这个问题,首先查看线路中是否已经有信号,如果有则不发送信号,保证每次只发送一个信号。对于CSMA/CD协议,可以查看:CSMA/CD协议。
让我们用gpt来总结下集线器:
集线器(Hub)的优缺点总结
✅ 优点
-
结构简单、价格便宜
集线器是一种非常简单的网络设备,成本低,适合早期小型网络环境。 -
即插即用
不需要复杂的配置,连接上网线就可以工作。 -
放大信号
具有物理层信号放大的作用,可延长网络的物理距离(中继作用)。 -
多设备互联
可以轻松实现多个设备的网络互连,适合非高性能需求的环境。
❌ 缺点
-
带宽共享
所有端口共享同一个带宽,设备一多时网络拥塞严重,性能下降。 -
冲突域大
所有连接的设备在同一个冲突域中,数据包很容易发生碰撞(依赖CSMA/CD协议处理)。 -
无智能转发
不具备识别MAC地址的能力,接收到数据时会广播到所有端口,浪费带宽。 -
半双工通信
只能实现半双工通信,无法同时发送和接收数据。 -
不支持分段隔离
无法像交换机那样隔离广播域,也无法进行VLAN划分等高级功能。 -
不安全
由于是广播机制,任何连接到集线器的设备都能监听到其他设备的数据包,存在安全隐患。
🔎 总结
集线器是一种简单的物理层设备,适用于早期的小型局域网,但由于性能低下、冲突多、带宽浪费等缺点,已逐渐被更智能的交换机取代。
既然集线器不行,咱们就得另外想办法了。集线器存在的一个巨大缺陷就在于每次都要广播到所有线路,这样造成了大量浪费。有过编程经验的都明白,这种情况通常用个Map记录下Mac地址和对应的端口,下次发送信号时先查询Map中是否已经保存了Mac地址和端口的对应关系,如果已经存在,则直接从对应端口转发就行,否则再去找其余端口。用伪代码描述下:
// 记录Mac地址和端口信息
const map = new Map();
// 所有端口
const ports = new Set();
// sourceMac: 源mac地址
// targetMac: 目标mac地址
// sourcePort: 源端口
// message: 发送的信息
function send (sourceMac, targetMac, sourcePort, message) {
// 从map中查找目标端口
const targetPort = map.get(targetMac);
// 记录mac地址和port的对应关系
map.set(sourceMac, sourcePort);
if (targetPort) {
// 将信息从targetPort这个端口发送给目标机器
notify(targetPort, message);
return;
}
// 如果map中不存在,则依次查询其余端口是否是目标端口
for (const port of ports) {
if (isTargetPort(targetMac, port)) {
// 将信息从targetPort这个端口发送给目标机器
notify(port, message);
// 记录mac地址和port的对应关系
map.set(targetMac, port);
return;
}
}
}
// 将信息传递给电脑
function notify (port, message) {
console.log(`给端口${port}发送信息: ${message}`);
}
// 判断当前端口和mac地址是否对应
function isTargetPort (mac, port) {}
这种记录了mac地址和端口的机器被称为交换机。
交换机虽然在集线器的基础上进行了优化,但是仍然无法处理大量用户的问题。我们可以再把问题细化,既然没法依次处理大量用户,我们就分批次进行。假设我们有多台交换机,分别位于不同的地方。为了让这些交换机能够通信,我们就需要引入一个新的中转站,这个中转站通常是路由器。由于Mac地址仅用来标识通信设备,通常是固定的且不够灵活,我们需要引入一个新的地址用于路由器通信,这个地址称为IP地址。通过ARP协议可以根据路由地址找到Mac地址。我们日常使用的路由器中一般内置了交换机,所以我们现在信号传输如下:
- 电脑A发送一个消息到电脑B
- 判断A和B是否在同一个网络下,如果是,则通过ARP协议,从电脑B的IP地址得到电脑B的Mac地址,根据Mac地址将信号发送给电脑B。如果不是,则发送到路由器。
- 路由器查找路由表,如果表中有记录,则根据记录找到电脑B所在的网络,通过ARP协议找到Mac地址,发送信号到电脑B。否则继续跳到下一个路由器。
- 电脑B接收到信号后,如果要将信号发送回电脑A,则重复上述过程。
通过上述原理,我们就可以在世界各地建立网络,这就是互联网。当然上述描述非常简单,只是用来建立对网络的初步印象,实际网络更加复杂。需要后续学习。
1. 计算机分层结构
主要介绍两种分层结构:OSI(开放系统互连)分层和TCP/IP分层。其中OSI是七层,TCP/IP是四层。日常应用通常是五层分层结构(结合了OSI和TCP/IP),OSI分层常用于理论指导,用于学习计算机网络。
1.1 OSI分层
OSI分层是国际标准化组织(ISO)在1984年提出的,自顶向下分为七层:
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
以下是一个网络通信的模拟图,从主机A发送信息到主机B,实线箭头部分表示信息的传输过程。从主机A的应用层往下,依次经过七层,达到主机B的物理层,再一路往上,整体路线是一个U字型。
发送端(这里是主机A)前6层都会包装一些控制信息达到下一层,除了数据链路层是在头尾都添加信息,其余层都在头部添加信息,这些信息包含发送地址、接收地址等。添加控制信息主要是为了保证数据传输准确:
1.1.1 物理层
物理层完成以下功能:
- 规定接口特性:机械特性(例如接口是什么几何形状)、电气特性(例如使用多大电压)、功能特性(例如接口有几个引脚,引脚的功能)、规程特性(定义工作过程,哪个引脚发送什么信号,哪个引脚接收什么信号等)
- 规定比特编码:例如用什么信号表示比特(用什么信号表示0,用什么信号表示1)
- 规定数据率:定义数据传输速率(日常说的百兆网络、千兆网络)
- 进行比特同步:发过去的比特,刚好被接收到,防止比特被漏掉
- 规定传输模式:以什么模式传输数据。分成单工通信(只能单向传输,例如电视机只能接受从电视台发送的信号,不能发送信号到电视台)、半双工通信(可以在双向传输,但是发和收不能同时进行,例如对讲机,发送信号的时候无法接收信号,接收信号时不能发送信号)、全双工通信(可以双向通信)
1.1.2 数据链路层
物理层解决了单一比特的传输问题,但是无法解决比特由谁接收、以及比特出现错误的情况。这些问题在数据链路层得到解决。
数据链路层负责物理链路直接相连的两个相邻节点(例如主机)之间的数据传输。 数据链路层将从网络层过来的PDU(协议数据单元)的头尾添加信息,构成一个数据帧(这叫做组帧),发送到物理层。物理层可以通过数据帧头尾的信息区分这些数据帧。
-
结点-结点数据传输:例如两个主机之间
-
组帧:将从网络层过来的PDU(协议数据单元)的头尾添加信息(例如添加发送地址、接收地址),构成一个数据帧
-
物理寻址:在数据帧头部中存在发送端和接收端的物理地址,用于确定发送端和接收端。例如在广播通信中,多个机器都可以收到发送过去的信号,这时就通过这些物理地址来保证哪些信号需要被接收。
(广播通信时,通过头部的物理地址确定接收信号)
- 流量控制:保证发送端和接收端的数据传输速率保持匹配,防止发送数据太快导致数据淹没接收端,漏掉数据。
- 差错控制:在数据帧中添加差错编码,用于判断数据是否出错。
- 访问(接入)控制:如果使用共享介质传输数据,决定某个时刻哪个设备拥有链路使用权,防止冲突。