Linux 计算机网络从零到一开始构建 必看
Posted 青冬
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 计算机网络从零到一开始构建 必看相关的知识,希望对你有一定的参考价值。
Linux 计算机网络从零到一开始构建
在整个互联网中,计算之间的沟可能通需要跨越千山万水,层层加密解码。当前我们就来尝试粗浅剖析一下整个计算机网络的形成。
形成与起源
从现在回头看之前的网络形成过程,其实对应的就是我们的网络多层架构,主要有 4 层模型、5 层模型、7 层模型。
但是如果只是知道结果那肯定印象缺少,我们还是从头开始,看看计算机网络为什么会发展到现在这样。
物理层
如果我们现在有两台电脑,他们需要互相进行连接,最简单直观的方法就是使用网线互联即可:
只需要电脑 A 知道出网络端口连接的是电脑 B(电脑 B 也是如此),那么他们之间就可以互通数据,通过高低电压(0101……)进行消息的传输工作。
现在有个问题,如果新加入了 N 台服务器,怎么进行网线的连接呢?
可以看到,当我们增加三台服务器后,电脑之间的网线趋势增加(N!)。这很可能导致我们单独一台电脑上根本没有这么多网络端口,而且每增加一台的成本都在无限制的上升,所以这里引入第一个设备 Hub集线器
。
Hub 集线器
集线器有很多个网络端口,可以将连接其的电脑网络进行互连。但集线器并不具有智能,也不会过滤任何数据,更不会知道要将数据发送到什么地方,它唯一知道的就是有设备连接进来了。
![[2]](https://img-blog.csdnimg.cn/f0a62121e00a4734916d7b4555f4e43c.png)
所以,使用它进行数据互连的时候他会将所有数据进行广播,或者说当某个数据包进入集线器的某个端口时,它会将其广播到所有的其他接口。所以当电脑 A 想发送消息给电脑 C,那么接入的 B/C/D 也会接收到消息:
这样解决我们每次添加一个中断,就要添加无数根网线的问题,但又增加了大量的安全隐患(数据包每次进入 Hub 都会广播到所有其他接口)和无效的网络流量。除此之外,Hub 还有一个更加致命的错误,非双工传输:同一个时刻每个端口只能进行一个方向的数据通讯,再结合广播的特性,导致每个电脑进行数据传递都需要抢占资源。
CSMA/CD 载波侦听多路访问/冲突检测
在广播型行到中采用的一种随机访问技术的竞争型访问方法:
- 载波监听,在想发送的信道上监听是否有其他节点在发送信息
- 如果在一段时间内没有,则可以开始发送信息(一段时间指 IFG)
- 如果一直很忙碌就一直监视并等待
- 在发送信息的时候也要进行监听,避免发生同时发送信息的问题
- 如果有消息碰撞,则停止发送,并发出“拥挤”信号
- 在等待一段时间后,重新发送。
数据链路层
交换机
Hub集线器
之所以会进行数据的广播工作,就是因为其并未记录每台电脑连接的端口是多少,如果知道电脑与连接自己的端口的对应关系,那么就不需要广播。
交换机解决了这个问题,在内部记录了一张表格:网口 1:电脑 A;网口 2:电脑 B;网口 3:电脑 C……
地址映射表的创建和维护:交换机一开始这张表为空,当接入新设备时、发送数据、接收时都会和交换机产生互动,在此过程中交换机会记录下网口 N 对应 MACX。这个映射表并不是路由表,映射表只存在交换机中,属于数据链路层。
这样,每当电脑 A 给电脑 B 发送消息的时候,交换机就不再需要进行广播,而是可以将消息直接发给网口 2 连接的电脑 B 了:
当然,交换机是全双工的(网线其实是 8 根线汇成的一条线,正常情况下至少有 4 根线在工作),这样交换机就可以实现连接的每一台服务器都同时可以发送和接收数据。
交换机桥接 Bridging
交换机通过局域网进行连接的时候可以把两个不同的物理局域网进行连接,是一种在链路层实现局域网互联的存储转发。
如图所示,我们可以通过连接两个交换机,使得更多的电脑接入。有点像我们人的手掌一样,手指就是每个电脑,手掌将五个手指进行连接,身体将两个手掌进行连接。那么现在需要思考一个问题,手掌的手指有上限,那么交换机的网口有上限吗?交换机的映射表有上限吗?肯定是有的,如果我们本地有几千台电脑,几百个交换机,那么映射表是可能将之前的写入给擦除掉,来写入新的网口与 MAC 对应地址,因为在这种策略下,每个交换机最终都需要保存所有的电脑 MAC 与其对应的网口关系。
但如果擦除了正在上网的 MAC 对应关系,又会引起广播找地址的问题,称之为网络洪范,当然还是不太行的。所以使用 MAC 地址与交换机,可以在一定量小局域网内进行高效的工作,但还是无法扩展到当前互联网的程度。
MAC
在本节我们还提到了一个词叫做 MAC(Media Access Control Address),是制造商为网络硬件(如无线网卡或以太网网卡)分配的唯一代码。MAC 代表媒体访问控制,每个代码对应一个唯一的设备。
MAC 地址由六组两位字符组成,由冒号分隔。比如 00:1B:44:11:3A:B7,就是一个 MAC 地址。可以简单理解为每个网络硬件都自带一个唯一标识的身份证,由生产厂家在生产时固化在网络硬件中,是硬件预留的地址。
windows 下使用
-
进行连接MAC 虽然叫做物理地址,但其实是数据链路层的标识。物理层只存在电信号。
网络层
当我们使用交换机和 MAC 进行组网时,发现了一个严重的问题,就是每个交换机其实都是需要记录所有 MAC 地址与网口的映射关系,导致如果入网设备太多,还是会出现各种问题,为了解决这个问题提出一个新的东西 路由器
(网关Gateway
)和另一种标识 ip
。
ip
前面我们引入了 MAC 这个标识概念,指明了每一台服务器都有一个唯一的 MAC 地址。而 ip
是一种逻辑概念,也可以指明一个服务器的地址。他们区别类似于小明上大学,身份证就是 MAC,在整个大学生涯中(甚至整个人生)不会发生变动;但小明选修了多门课程,他会跑到不同的教室进行上课,比如现在就在二教楼 4 楼 12 号教室第 1 排第 4 个。那么这个时候小明的坐标就是 02:04:12:01:04
这样一个地址,而 ip
代表的就是这个坐标地址(当然,如果小明下一堂课去了别的教室,那么这个坐标地址就会更变)。
ip
Internet Protocol Address,现在存在 ipv4
和 ipv6
两种规格,他们之间的区别是表示的位数不同。我们使用 ipv4
进行讲解,ipv4
由 4 个数字表示,每个数字从 0 到 255,表示为 0.0.0.0
到 255.255.255.255
。
路由器
路由器就是为了解决当太多入网设备时,所有交换机需要记录所有的 MAC 地址。它将整个网络进行了切分,使得每个交换机只需要记录自己的一部分。然后使用 ip
进行局域网的标识管理,如下图:
现在路由器存在于两个网段中,分别为 192.168.0.0/24
和 192.168.1.0/24
中,而且分别在这两个网段中有着对应的 ip
地址。当电脑 A 192.168.0.2
想给电脑 E 192.168.1.4
发送消息时,从交 换机a网口1
发送到 交换机a网口9
,然后 路由器网口1
收到根据自己的路由表转发到 路由器网口2
,最后由 交换机b
进行转发。这样一来 交换机a
和 交换机b
都只需要记录本地的 MAC 地址,其余的交给路由器就好。
而路由器也可以在上层继续叠加,使用 ip
这个索引工作,进行跨网络通讯。
路由器中的路由表怎么建立的?
这个比较复杂,一般在局域网中(一般指没有用到网络供应商的),通过手动配置进行;一般在互联网中由网络供应商进行,而且算法非常复杂,相当于在网络中,不断地探寻从 A 到 B 两个地址的最佳路径。
电脑 A 和电脑 B 怎么使用 ip 进行通讯?
这里有个小问题就是之前我们知道使用 MAC 地址,可以找到电脑 A 和 B,但是如果是通过 ip
怎么通讯呢?
- 还是需要切回到 MAC 地址才能进行通讯,所以要使用
ARP
找到对应的 MAC 地址。 APR
就是在局域网中进行广播,谁的ip
是 XXX,当 B 收到这个信息,那么就回回复 B 的 MAC 地址。- 然后开始 MAC 地址的通讯。
数据帧格式
每个数据帧,都是包含 MAC 头,MAC 数据。而 MAC 数据中包含 IP 头,IP 数据。而 IP 数据又会包含 TCP 头、TCP 数据……(如果是 TCP 包的话)。
那么如果电脑 A 192.168.0.2
向电脑 C 192.168.1.2
发送了一个包,那么的流程会是三步:
- 从电脑 A 到 GATEWAY:
- 从 GATEWAY 网口 1 到 GATEWAY 网口 2:
- GATEWAY 网口 2 到电脑 C:
可以看到数据帧的 MAC 头在不停更改,但是 IP 没有进行更改。
ARP 协议 & ARP 缓存表
ARP Address Resolution Protocol,是一个 TCP/IP 中的底层协议,将 IP 地址解析成 MAC 地址。
前面我们提到了,所有的 IP 层最终还是要通过数据链路层进行传输,也就是需要得到 MAC 地址,ARP 就是将 ip
转换为 MAC。在每台主机中,都存在一张 ARP 表,记录着主机的 IP 地址和 MAC 地址的对应关系。下面我们来看看电脑 A 想与电脑 B 进行通讯的步骤:
- 首先电脑 A 会先检查自己的 ARP 缓存表,是否存有电脑 B 的信息,如果有则直接将主机 B 的 MAC 地址作为 MAC 头的目标 MAC 地址封装到数据帧中。
- 如果不存在则会发送 APR 请求,将目标 MAC 地址标记为
FF:FF:FF:FF:FF:FF
也就是广播帧,这样交换机接收到这个广播帧后,就会广播到所有其他网口。 - 当电脑 B 接收到广播的数据帧后,就会校对
ip
是不是自己的,如果是就会发送一个 ARP 应答,回答自己的 MAC 地址。 - 电脑 A 收到后,就可以将这个 IP 和 MAC 对应地址存入 ARP 缓存表中。
在 Linux 中可以使用 arp
命令查看 ARP 缓存表。
arp
什么时候决定将请求转发给网关?
上面我们讲了从电脑 A 到电脑 B,可以直接使用 ARP 广播寻找,那么从电脑 A 到电脑 C 呢?(路由器图)
这里还涉及到一个计算是否同网段的判断,也就是计算两个终端是否在同一个网段下。当我们获取到 ip
地址时,一般还会存在一个 netmask
。使用 ip
和 netmask
进行 与
运算,就能得到这个网段的地址如 192.168.0.0/24
。
/24 是指掩码存在为前面的 24 位,也就是 255.255.255.0
通过计算目标地址 ip
也和 netmask
进行 与
运算得到目标的网段,对比可以知道是否在同个网段。如果相同则可以开始寻找 MAC 地址,如果不相同,则根据路由表将请求转发到网关中。
在 Centos7 下,使用命令 ipconfig
查看各个网卡的 ip
地址和 netmask
掩码:
ipconfig
使用 route
进行路由表相关的操作:
添加 route 相关的连接。
总结
你会觉得是不是再上面就没讲了?没错,有缘再见。我们已经讲解了物理层、数据链路层、网络层相关的数据解析和传输流程,而其他的上层应用都是依赖于这些传输的方式,已经能够从电脑 A 到电脑 N 了。发个图自己理解:
以上是关于Linux 计算机网络从零到一开始构建 必看的主要内容,如果未能解决你的问题,请参考以下文章