Linux 计算机网络从零到一开始构建 必看

news2025/1/13 17:31:36

Linux 计算机网络从零到一开始构建

在整个互联网中,计算之间的沟可能通需要跨越千山万水,层层加密解码。当前我们就来尝试粗浅剖析一下整个计算机网络的形成。

形成与起源

从现在回头看之前的网络形成过程,其实对应的就是我们的网络多层架构,主要有 4 层模型、5 层模型、7 层模型。
在这里插入图片描述

但是如果只是知道结果那肯定印象缺少,我们还是从头开始,看看计算机网络为什么会发展到现在这样。

物理层

如果我们现在有两台电脑,他们需要互相进行连接,最简单直观的方法就是使用网线互联即可:

在这里插入图片描述

只需要电脑 A 知道出网络端口连接的是电脑 B(电脑 B 也是如此),那么他们之间就可以互通数据,通过高低电压(0101……)进行消息的传输工作。

现在有个问题,如果新加入了 N 台服务器,怎么进行网线的连接呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d6CDLvR2-1673027334675)(static/boxcn51fU7ubWMQkYLoH3TJRYcd.png)]

可以看到,当我们增加三台服务器后,电脑之间的网线趋势增加(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,现在存在 ipv4ipv6 两种规格,他们之间的区别是表示的位数不同。我们使用 ipv4 进行讲解,ipv4 由 4 个数字表示,每个数字从 0 到 255,表示为 0.0.0.0255.255.255.255


路由器

路由器就是为了解决当太多入网设备时,所有交换机需要记录所有的 MAC 地址。它将整个网络进行了切分,使得每个交换机只需要记录自己的一部分。然后使用 ip 进行局域网的标识管理,如下图:

在这里插入图片描述

现在路由器存在于两个网段中,分别为 192.168.0.0/24192.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 发送了一个包,那么的流程会是三步:

  1. 从电脑 A 到 GATEWAY:

在这里插入图片描述

  1. 从 GATEWAY 网口 1 到 GATEWAY 网口 2:

在这里插入图片描述

  1. 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。使用 ipnetmask 进行 运算,就能得到这个网段的地址如 192.168.0.0/24

/24 是指掩码存在为前面的 24 位,也就是 255.255.255.0

通过计算目标地址 ip 也和 netmask 进行 运算得到目标的网段,对比可以知道是否在同个网段。如果相同则可以开始寻找 MAC 地址,如果不相同,则根据路由表将请求转发到网关中。

在 Centos7 下,使用命令 ipconfig 查看各个网卡的 ip 地址和 netmask 掩码:

ipconfig

在这里插入图片描述

使用 route 进行路由表相关的操作:

在这里插入图片描述

添加 route 相关的连接。


总结

你会觉得是不是再上面就没讲了?没错,有缘再见。我们已经讲解了物理层、数据链路层、网络层相关的数据解析和传输流程,而其他的上层应用都是依赖于这些传输的方式,已经能够从电脑 A 到电脑 N 了。发个图自己理解: 在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145558.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

为了让自己心情愉悦,我用python把美妞得图片制成了GIF设置桌面

前言 大家早好、午好、晚好吖 ❤ ~ 要想生活过的去,每天美女必然少不了~ 每天看美女,只为了愉悦心情,心情好了,才长寿。 于是怀揣着愉悦心情的想法,我开始制作GIF动图生成器 这个小工具制作的目的是为了将多张图片组…

舵机的控制

舵机的信号线是做为输入线就是接收PWM信号(定时器产生)。 一般PWM的周期是20ms,那么对应的频率是50hz。那么改变不同的占空比就可以控制转动的角度。 其中占空比从0.5-2.5ms(如果占空比大于2.5ms也只会在最大角度。),相…

Node.js+MySQL开发的B2C商城系统源码+数据库(微信小程序端+服务端),界面高仿网易严选商城

下载地址:Node.jsMySQL开发的B2C商城系统源码数据库(微信小程序端服务端) NideShop商城(微信小程序端) 界面高仿网易严选商城(主要是2016年wap版)测试数据采集自网易严选商城功能和数据库参考ecshop服务端api基于&am…

php学习笔记-代码基本语法-day01

php代码基本语法 PHP(PHP: Hypertext Preprocessor)即“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法学习了C语言,吸纳Java和Perl多个语言的特色发展出自己的特色语法&…

一些微信使用小技巧分享

技巧一:检测僵尸粉 微信好友过多,我们可以通过创建群聊来检测好友。点击右上角图标,选择【发起群聊】,勾选需要检测的好友,点击【完成】。能进群的都是朋友关系,不能进群的会删或者拉黑你。不过需要注意的是…

VS2022点云库PCL1.12配置过程中遇到的一些奇葩问题

最近处于换工作的间歇期,原来配置的电脑交公了,各种程序数据都做了搬家。对这些程序重新配置,可以说是一地鸡毛。系统对不上,各个开源库版本一团乱麻,尤其是配置PCL库的时候,遇到了各种奇奇怪怪的问题&…

二十八、Docker (4)

🌻🌻 目录一、Dockerfile入门1.1 Dockerfile 常用命令1.2 Dockerfile 搭建 jdk 环境1.3 Dockerfile 搭建 tomcat 环境镜像1.4 Dockerfile 创建微服务 java 镜像二、使用Nexus搭建Docker镜像私有仓库2.1 安装 Nexus2.2 访问配置 Nexus2.3 配置 Docker 服务…

自动驾驶助力智慧港口建设,景联文科技提供数据标注服务

“在无人集卡出现以前,岸桥式起重机需要把停靠在岸边的船舶上数百个集装箱全部吊起,放到一旁的集装箱卡车上,运向堆场,等待集装箱卸货后再进行下一次往返工作。为保证工作效率,需要上百位司机驾驶着集卡在港口中来回往…

拉伯证券|磷酸铁锂电池在储能市场的应用有哪些?

时隔四个月,中国有色金属工业协会硅业分会重启硅料报价。本周,单晶复投料成交均价为17.82万元/吨,单晶细密料成交均价为17.62万元/吨。综合其他组织报价数据,硅料已全线跌破20万元/吨,作为对比,上一年10月底…

Java入门知识以及细节(1.3w字笔记)

欢迎来到我的主页:【一只认真写代码的程序猿】 本篇文章收录于专栏【Java入门学习】 如果这篇文章对你有帮助,希望点赞收藏加关注啦~ 目录 Java和C的区别 Java中的运算 Math.random()函数 跳出多重循环的两种break方法 数组中的使用以及Java中的…

windows下图像标注软件Labelme安装及使用教程

文章目录一.Labelme简介二.安装labelme三.使用labelme进行图像标注一.Labelme简介 LabelMe 是一个用于在线图像标注的Javascript标注工具。与传统图像标注工具相比,其优势在于我们可以在任意地方使用该工具。此外,它也可以帮助我们标注图像,…

TCP 三次握手 四次挥手

请描述TCP三次握手和四次挥手,这是非常常考的一道面试题。 大家不要去追求过多的细节,你如果是搜一些文章或者答案的话,它会给你描述的很细。 然后我/你看到会很懵,因为这里面如果讲细了的话,需要很多这种网络请求的相…

Go语言基础2

一、注释 单行注释 // 我是单行注释多行注释 /* 我是多行注释 我是多行注释 我是多行注释 */二、变量 1. var name type (声明变量时将变量的类型放在变量的名称之后) var,声明变量的关键字name,变量的名字type,变量的类型 eg:单个定义…

FFMPEG完美入门资料---003---FFmpeg 架构

3.1 FFmpeg 文件结构 libavformat 主要存放 ffmpeg 支持的 各种编解码器 的实现及 ffmpeg 编解码 功能相关的数 文件简要说明allcodecs.c简单的注册类函数avcodec.h编解码相关结构体定义和函数原型声明dsputil.c限幅数组初始化dsputil.h限幅数组声明imgconvert.c颜色空间转换相…

剑指offer(C++)-JZ63:买卖股票的最好时机(一)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 题目描述: 假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请…

FreeMen正式上线,让工作更自由

“让工作更自由”,开屏页上六个大字宣告着FreeMen正式上线,全新的FreeMen APP也正式登录各大手机应用市场。作为一款专注IT技术者圈子的APP,其上线标志着助力程序员职业道路上向前迈进一大步。 FreeMen相关负责人表示,基本上10个职…

基于java+Springboot操作系统教学交流平台详细设计实现

基于javaSpringboot操作系统教学交流平台详细设计实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

【C语言】使用指针时出现的各种错误总结以及处理方法

🏖️作者:malloc不出对象 ⛺专栏:《初识C语言》 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录前言一、什么是野指针二、野指针出现…

Redis主从哨兵集群

主从 主从同步原理 1.全量同步 1.从节点刚连接到主节点时,主动请求数据同步 2.主节点判断是否是第一次同步,如果是,就返回主节点的数据版本信息 3.随后,主节点执行bgsave,生成RDB文件,并发送给从节点 4.这…

Java时间类

时间在Java中是两个类 Date 和 Calendar Date类 Date是在Java.util包中的也就是工具包。 测试 输出的是当前的系统时间 修改idea中的注释的颜色: 是date不是data package org.data; import java.util.Date; public class Test { public static void main(…