[Linux] 网络及其原理简单概述: 协议、协议分层、网络协议栈、局域网内部通信原理、不同局域网通信原理 简单介绍...
Linux 网络概述
网络发展
独立模式
网络互联
网络
冯诺依曼体系
设计的.计算机之间也通过线路连接起来
, 不就有了不同计算机之间 数据交互的可能性
了吗?"一根线"
将两台计算机中的网卡设备连接起来
, 让两台计算机可以通过网卡进行数据交互
. 那么, 这跟线其实就可以看作 "网线"
. 那么 其实就可以将 这两台通过网线连接起来的计算机看作
一个 只有两台计算机的 "网络"
."网络"
.计算机内部的设备
其实都是 通过不同的线路相连接
起来的, 并且可以相互传输数据, 那么 也同样可以将 计算机内部的结构看作为一个小型的网络结构
网卡设备连接起来
了, 只不过 这里的线要比
一个计算机内部的设备之间相连接的线要长
的多.内部设备之间连接的线
比较短
, 且比较密集
. 在实际中, 这些线传输数据 可能相互之将会造成一定的干扰.长
, 没有那么密集, 一般情况下不会出现不同的线互相干扰的情况, 或干扰不强. 但是, 长线有长线的问题:可靠性
, 即 如何能保证数据在长线中传输时, 不会发生数据丢失或损坏等问题呢?如果发生了怎么样弥补呢?效率
, 即 如何保证数据在长的线中传输的速度要快一些呢?如何寻找到对方
, 即 这么长的线, 如何找到传输数据的目的方呢?
线太长会出现的问题
展开的~局域网LAN 和 广域网WAN
交换机
、路由器
等交换机
, 通常用于在 同一个计算机网络中连接多个设备
, 并通过网络协议来实现数据的传输和交换. 因为计算机太多连接会出现一些问题, 交换机可以减少的出现的问题, 比如 安全性、传输效率等问题.路由器
, 当不同的计算机网络之间也需要交换数据时, 就需要使用路由器, 将不同的计算机网络之间连接起来. 交换机会根据 不同网络的网络协议来实现数据包的转发
. 实现网络之间的通信.认识 “协议”
生活中的单的例子
来解释一下什么是协议.早就约定好的
. 这些约定好的 什么手势表示什么内容, 其实就是一种协议
.在网络上, 不同计算机传输的数据也是以二进制的形式传输的
, 但是 二进制的形式可能有所不同:有些可能用 频率的强弱来表示10, 有些可能使用信号的波峰波谷来表示10. 即 不同的主机之间虽然都是二进制的形式传输信息. 但是由于 表示的形式不同, 这些二进制数据就不一定可以被正确、正常的读取到
.只约定好数据格式, 是不能做好不同主机之间的通信的
.游戏规则
其实就制定了一个传递 数据的格式
, 每个人都要做动作且点其他人的名. 一般来说, 这么简单的游戏规则 大家都可以听得懂.6个人一起玩
, 5个人都是说中文
, 但是有 一个人说法语、日语或者其他可能听不懂的语言
. 别人怎么玩
?实现主机间正常的通信
, 其实 除了约定好数据格式之外, 还需要遵守制定好的标准
.- 计算机生产厂商有很多
- 计算机操作系统, 也有很多
- 计算机网络硬件设备, 还是有很多
制定出一个可以让所有的厂商、操作系统、网络硬件同一约定的标准
.网络协议
. 网络协议, 一般包括了数据传输的格式、传输速率、错误检测与纠正等方面的规定. 以方便数据的传输、主机的通信.协议的分层
不支持在结构体内定义成员函数
进程地址空间
的概念. 在介绍Linux文件系统时, 我们介绍了 file_struct
知道了Linux中一切皆文件. 这两种 实现形式其实都是软件分层的一种实现. 系统是一层, 中间是一层, 还有上层的软件或底层硬件又是一层.-
对软进行分层的同时, 其实也对软件的问题进行了归类.
进行分层之后, 其实已经将不同层的问题分开了, 因为 不同层之间基本上就是调用与被调用的关系. 当某个功能出现问题之后, 可以通过定位功能的实现层级来确定问题的出现层级, 可以进一步定位问题.
-
软件分层其实本质上就是: 软件上的解耦
软件分层之后, 层与层之间是调用与被调用之间的关系, 就将不同的功能之间进行了解耦
-
软件分层 也可以便于我们 进行代码分析
网络协议其实也是分层的
打电话
这个例子来简单的理解一下 协议的分层
用相同的语言来交流
的. 如果使用不同的语言 很可能就无法交流.打电话的人会认为 自己是与对方直接通信的
.模拟信号
, 但是数据传输需要 数字信号
.数字信号再在通讯设备之间传输
的.- 人, 用户层级. 人与人之间通过一定的语言(协议)进行通信.
- 设备层级. 设备之间通过一定的协议 传输数字信号.
人是与人通信的
. 那么 同理, 其实也可以看作 设备是与设备通信的.
同层协议设备之间直接通信, 可以忽略底层的网络.
这也就是 网络协议是分层的. 那么, 不同层就需要有自己的协议.
调用不同层级提供的接口
就可以了, 不需要关注底层是如何实现的.网络协议栈
的内容.网络协议栈
OSI七层模型
使得网络设计和实现更加模块化和可控
. 不同层级之间更加独立, 方便扩展与更新
. 可以根据不同层级的功能和责任, 快速定位错误 问题
.TCP/IP 五层(四层)模型
TCP/IP五层(四层)模型
物理层:
负责光/电信号的传递方式
. 比如现在以太网通用的网线(双绞 线)、早期以太网采用的的同轴电缆(现在主要用于有线电视)、光纤, 现在的wifi无线网使用电磁波等都属于物理层的概念。物理层的能力决定了最大传输速率、传输距离、抗干扰性等. 集线器(Hub)工作在物理层.数据链路层:
负责设备之间的数据帧的传送和识别
. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太网、令牌环网, 无线LAN等标准. 交换机(Switch)工作在数据链路层.网络层:
负责地址管理和路由选择
. 例如在IP协议中, 通过IP地址来标识一台主机, 并通过路由表的方式规划出两台主机之间的数据传输的线路(路由). 路由器(Router)工作在网路层.传输层:
负责两台主机之间的数据传输
. 如传输控制协议 (TCP), 能够确保数据可靠的从源主机发送到目标主机.应用层:
负责应用程序间沟通
,如简单电子邮件传输(SMTP)、文件传输协议(FTP)、网络远程访问协议(Telnet)等. 我们的网络编程主要就是针对应用
TCP/IP四层模型
- 对于一台
主机
, 它的操作系统内核实现了 传输层到物理层 的内容;- 对于一台
路由器
, 它实现了从 网络层到物理层;- 对于一台
交换机
, 它实现了从 数据链路层到物理层;- 对于
集线器
, 它只实现了 物理层;
TCP/IP网络协议栈 与 操作系统 的关系 **
网络中不同层级的协议 其实是操作系统整个体系中各个部分中的一个模块
.传输层到用户层
, 操作系统是提供有 系统调用
的进行操作的.TCP/IP协议是操作系统中的一个模块, 网络协议栈 实际上是隶属于操作系统的
用户产生的数据包(网络信息)的流向, 在主机内是 自顶向下 或 自底向上 流动的
. 为什么呢?每个层级都看不到其下层的传输过程
.同层协议都认为自己在和对方直接通信
重新以计算机的视角看待 网络协议栈
提现在代码逻辑方面
提现在数据上
我们在网上买东西的时候, 比如一个键盘、鼠标、显示器等. 并不是像 我们直接在超市买东西 那样, 直接得到我们买的东西.
而是需要从 商家 经过 快递 再到 买家手里. 这是 在网上买东西时, 一个商品的运输过程.
而且, 商家也并不会直接将单独的一个商品 给快递公司, 快递公司也不是直接将商品给到买家的.
商家首先会对商品进行包装. 然后快递公司会对商品进行二次包装, 并且快递公司二次包装的时候 还会添加一些额外的信息: 快递单号、发件信息、收件信息等. 这些信息并不是给买家看的, 而是快递在运输时使用的.
商品 从 商家到买家手中, 是经历了一些运输过程的, 并且 为了方便、安全的运输, 商家、快递公司会对商品添加一定的额外信息. 最终到买家手中的才会是一个完整的商品.
而, 买家收到的商品并不仅仅是一个目的商品, 还有许多的其他物品或信息. 只不过这些物品和信息一般不需要买家关注.
商家 和 买家, 看做两台主机的用户. 快递公司就可以看做是下面的 网络协议栈.
-
快递在运输过程中, 会多出快递单等信息. 快递单实际上并不是给用户看的. 而是给快递公司内部 和 快递小哥看的.
快递单上的数据
就可以看做 是快递公司内部和快递小哥之间的协议
.这一点, 也反映了
实际的 网络通信中, 为了维护被传输的数据 实际是需要在原数据的基础上添加其他数据(协议数据)的
.这是
协议在数据上的提现
.而, 同层协议都认为自己再与对方直接通信. 就好比商家与买家直接交流, 只要快递正常运输, 这个过程双方是不在乎的, 也就不在乎快递单上的内容.
那么也就是说, 协议数据实际上是为了同层级通信 而添加的.
协议数据是为了同层级通信, 那么同层级就需要都能读取协议数据. 那么
每一个层级就需要制定自己的协议
. 进而根据协议来添加同层级可以读取的协议数据. -
快递公司和快递小哥 会根据快递单上的数据 来运输商品. 快递是从哪里发货的, 通过什么途径, 送到什么地方等.
这则反映了
实际的 网络通信中, 被传输的数据 会根据协议数据 通过设定、编写的代码逻辑 在不同的主机之间进行传输
.可能感受不到这是
协议在代码逻辑上的提现
数据包(网络信息) 在主机内是 自顶向下 或 自底向上 流动的
同层协议都认为自己在和对方直接通信, 每一个层级就需要制定自己的协议
实际的 网络通信中, 为了维护被传输的数据 实际是需要在原数据的基础上添加其他数据(协议数据)的
-
当主机一要向主机二传输 “你好” 信息时, 生成的信息数据包 在主机一内部的网络协议栈中 的变化 是这样的:
首先, 主机一 产生的数据 在主机一内部 的
流向是从上到下
的.并且, 传输过程中 不同层会在 接收到的上层数据包中
添加本层的协议数据
, 这部分数据是拼接在原始数据的开头
部分的-
实际上,
每层添加的这部分协议数据, 被称为 报头
即, 不同层会为接收到的数据包 添加报头
整个过程 被称为
对数据进行
封装
的过程
-
-
主机一 将数据 传输到主机二时, 是先传输到主机二的物理层的
-
主机二 接收到数据之后, 数据在主机二内部的网络协议栈的变化是这样的:
首先, 接收到的数据包 在主机二内部的网络协议栈中的 流向是从下到上的.
然后 当前层会
将发送方对应层添加的协议数据(报头)进行分析、解包
, 然后将解包后的数据包 向上层传输这个动作, 其实就是
同层协议可以看作是与对方直接通信
. 因为对应层只会针对相应的报头进行解包
, 那么就可以看作是同层协议直接与对方通信
最终, 经过层层的解包, 还 原出主机一发送的, 给用户看的数据
局域网内部通信原理简单介绍
本系列文章在介绍网络时, 非必要不会涉及物理层内容
局域网是 对较小的地理范围内所建立的一组相互连接的计算机和网络设备的集合
局域网又被称为以太网. 关于以太, 还有一个故事, 感兴趣的话可以去了解一下.
每位学生和老师都是局域网内的主机
.MAC地址
.MAC地址 是 识别网络中物理网络设备的唯一标识符. 所有物理网络设备的MAC地址都是唯一的.
MAC地址由一个48位的二进制数字组成, 一般表现为 12位的十六进制数
在Win和Linux 都可以通过指令的方式查看 当前主句物理网络设备的MAC地址:
Win:
打开 Windows Powershell 或者 CMD, 执行
ipconfig /all
即可查看 当前主机网络的信息, 可以在其中找物理设备的MAC地址:Linux:
打开终端, 执行
ifconfig
, 即可查看 当前主机的部分网络信息:
唯一的标识符
, 这个标识符就是主机中 物理网络设备的MAC物理地址
物理网络设备的MAC地址是全球唯一的
班级里, 老师点名学生回答问题, 其实就是在找学生的 “MAC地址”. 找到了, 学生就可以回答问题.
如果, 许多的主机同时发送消息, 那么就可能非常的混乱, 就导致主机之间互相干扰, 进而扰乱通信
. 我们将这种现象称为 碰撞
, 并将可能发生碰撞的一部分主机、设备称为 碰撞域
碰撞, 其实就像班级里许多学生都在说话, 乱糟糟的. 这时候, 班级内的人传达信息, 由于被其他人干扰了其实很有可能不能正确、完整的传到目标人那.
碰撞检测
, 检测是否有其他主机已经在通信. 如果有就进行 碰撞避免
, 即 等其他主机不通信了, 然后再通信局域网通信的简单原理图
.以太网中的不同主机是都可以看到以太网的
. 那么, 从系统的角度来看待以太网的话, 其实以太网就是一个 临界资源
不同局域网通信原理简单介绍
不同的是 封装完毕的数据包的转发的过程
需要通过路由器进行转发
.局域网一内的主机与局域网二内的主机直接通信
想要局域网一与局域网二通信, 就可以通过将数据包传输给路由器, 再由路由器传输给另一个局域网中的目标主机
.- 局域网一的主机, 将封装完毕的数据包 通过 以太网 直接发送给路由器
- 路由器 将以太网协议数据 进行解包, 然后 向上传输到路由器自身的IP层
- 再将数据包向下传输到路由器自身的数据链路层, 添加局域网二数据链路层协议的协议数据 封装数据包
- 然后 再将封装好的数据包 直接传输到 局域网二的目标主机
不同局域网之间
的通信不能通过MAC地址进行通信, 而是 必须要通过IP地址进行通信
路由器就可以通过 ip 判断需要将接收到的数据包 向哪个局域网转发
.IPA
, 局域网二主机的ip为 IPB
, 即 目标ip为IPB. 那么, 路由器在接收到数据包之后, 就可以通过目标ip, 将数据包转发到子网范围包括目标ip 的局域网二中.从IP层往上(包括IP层), 发送主机和接收主机 看到的数据是一模一样的.
数据包 封装的部分细节
- 应用层:
TFP
\HTTP
\HTTPS
… - 传输层:
TCP
\UDP
\ICMP
… - 网络层:
IP
\ARP
\RARP
…
接收主机如何确定要将有效载荷交付给上层哪一个协议呢?
有效载荷: 解包后, 需要向上层交付的数据包内容
发送主机在封装报头时, 就需要考虑未来解包时, 将自己的有效载荷交付给上层的哪一个协议
有效载荷的分用
-
一般而言, 任何报头属性里面, 一定要存在一些字段, 支持我们进行封装和解包
即, 报头中 一定要
存在描述 数据包哪些部分是报头, 哪些部分是有效载荷 的字段
-
一般而言, 任何报头属性里而, 一定要存在一些字段, 支持我们进行分用
即, 报头中 一定要
存在描述 有效载荷需要交付给上层哪一个协议 的字段
作者: 哈米d1ch 发表日期:2023 年 4 月 23 日