Linux网络基础全面解析:从协议分层到局域网通信原理

Linux系列


文章目录


前言

Linux系统部分的学习告一段落,接下来我们将步入Linux网络部分。在本篇文章里,我们会着重介绍网络部分的基础概念,助力大家搭建起初步的知识框架。不过,本文不会对知识点进行深入剖析。


一、计算机网络背景

特别声明:为了让逻辑自洽,以便大家更好理解,下面的故事是编的,大致方向是没错的

1.1 认识网络

我们知道,计算机最初被应用于军事领域,用于处理海量数据。那时,每台计算机都是独立运行的个体。想象一下,在一个军事指挥中心,有情报分析人员要整理数据、审核人员要核对数据准确性、战术研究人员要依据数据开展模拟实验等。这些工作理论上可以同时进行,但由于计算机之间无法传输数据,他们只能依次等待,原本可以并行开展的任务,变成了按顺序逐个执行。这就凸显出问题:当多人需要基于同一份数据协同工作时,数据难以转移成为极大阻碍。正因如此,网络的诞生成为必然,它打通了数据流通的壁垒,让协同作业得以高效实现。

基于上述需求,网络应运而生。起初,计算机之间通过线缆连接,实现信息传输。随着应用场景的拓展,"服务器"的概念诞生。各计算机能够将自身数据上传至服务器,当其他主机有需求时,可直接从服务器将数据拉取到本地。如此,最初的局域网雏形便形成了。

随着计算机技术的进步,各类实验室开始部署小型计算机网络用于学术研究。然而,不同实验室的网络之间无法直接传输数据,导致学术成果难以高效共享,严重制约了协作效率。

为打破这种信息孤岛,将不同实验室的局域网连接起来实现跨网络传输的需求日益迫切。在历史进程中,各个实验室的子网逐渐互联,这种子网的集联催生出规模更大的网络-------广域网。与此同时,新的问题随之涌现:

  • 地理距离限制:当两个实验室位于不同楼层或楼宇时,会面临信号衰减等
  • 设备定位难题:跨网络传输时,如何精准识别数据该发往哪个实验室的哪台设备

为解决这些问题,能够连接不同子网的路由器、交换机等网络设备应运而生(具体原理后续章节详细解析)。

1.2 认识协议

协议的本质是一种规则性约定,其诞生旨在解决网络通信中的各类实际问题。数据在网络传输过程中可能面临以下核心挑战:

  • 传输可靠性:如何确认数据是否成功抵达目标主机;
  • 数据处理逻辑:接收方如何解析和处理收到的数据;
  • 路径寻址准确性:如何确保数据按正确路径传输至下一个节点。

通过预先约定"成功标识""数据接收确认机制"等规则,不仅能降低主机间的通信成本,更能显著提升交互效率。计算机间的通信依赖光信号或电信号,通过频率高低信号强弱来编码二进制信息(0和1)------这正是网络协议的核心价值之一。

协议部分后续的文章我们会详细介绍

二、网络协议初识

2.1 协议分层

接下来我们通过下面示例进一步了解协议:

日常打电话时,我们是通过接口与电话机交互。电话机依据底层协议 ,将信息传递给另一部电话机,随后这部电话机再经接口把信息传达给对方用户。从本质上看,这一过程是人与电话的沟通,但在逻辑层面,我们常觉得是人与人、电话与电话在交流。

打电话时,我们开口说的第一声"喂" ,类似于语音层通信中的一次握手。在这个过程中,人们并不在意电话之间遵循的协议,电话也无需理会人与人交流使用的语言(汉语、英语)。这便是协议分层的优势体现:层与层之间低耦合、高内聚,各层专注自身功能,互不干扰 。

网络通信也使用了协议分层思想, 在这个例子中, 我们的协议只有两层,但是实际的网络通信会更加复杂, 需要分更多的层次,为了实现解耦,会在每一层都提供对应的协议,下面我们来学习一下。

2.2 OSI七层模型

``

OSI(国际标准化组织)是网络协议制定领域极具权威性的机构,网络分层标准由其制定。基于网络分层需求,OSI构建了七层网络模型,自下而上依次为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 。

2.3 TCP/IP协议栈

由于部分层次的功能复杂庞大,难以完全融入操作系统,在工程实践中,网络协议的分层结构最终被简化为五层 ,即物理层、数据链路层、网络层、传输层和应用层 ,会话层与表示层未被直接纳入协议架构。不过,在代码编写过程中,开发者会发现,尽管这两层未在底层协议中明确体现,但在实际编程实现中是不可或缺的。通常,会话层与表示层的功能并非由操作系统内核实现,而是由上层应用程序来完成 。

在操作系统里,网络层和传输层是尤为关键的两层协议。传输层中最具代表性的协议是TCP(传输控制协议),网络层中则是IP(网际协议) 。

物理层:负责光/电信号的传输方式。像常见的以太网网线、光纤,以及如今WiFi无线网借助的电磁波等,都属于物理层范畴。 它决定了网络的最大传输速率、传输距离和抗干扰能力等。集线器(Hub)就工作在这一层。

数据链路层:主要处理设备间数据帧的传送与识别。涵盖网卡驱动、冲突检测。存在以太网、令牌环网、无线LAN等标准。交换机(Switch)工作于此层。

网络层:承担地址管理和路由选择任务。以IP协议为例,用IP地址标识主机,通过路由表规划主机间数据传输路径(路由)。路由器(Router)工作在网络层。

传输层:负责实现两台主机间的数据传输。比如传输控制协议(TCP),能保障数据从源主机可靠发至目标主机。

应用层:负责应用程序之间的通信,像简单电子邮件传输、文件传输协议等。网络编程很多时候针对的就是应用层。

2.4 网络协议栈与OS的关系

在之前我们学习了,Linux系统部分的知识,而今天我们把网络协议栈也有了大致了解,那么这两个又存在什么样的对应关系呢?

在整个协议栈体系中,网络层与传输层的核心功能均由操作系统内核实现 (即内置在操作系统底层架构中),当主机A通过网络向主机B发送数据时,本质上是用户A与用户B通过网络进行通信。在此过程中,数据必须通过网卡才能发送至网络,而用户无法直接访问硬件设备,因此数据需在协议栈中逐层传递,这一过程会贯穿整个网络协议栈。同理,用户B若想获取A发送的数据,必须由网卡接收数据,再经过逐层解析与转换,最终才能获取数据。所以网络通信的本质就是在访问硬件!!

但是我们的数据要想贯穿协议栈就必须访问操作系统,而操作系统又不允许用户直接访问操作系统,所以, 我们对应的系统在网络层就必须给我们提供系统调用!!! 而开发者根据系统调用, 就能开发出各种各样的应用协议。

2.5 网络协议在网络传输时的作用

我们已经了解到,在网络协议栈的分层结构中,每一层都有对应的协议,而协议的核心作用是解决网络通信中的各类问题。接下来,我们通过一个的例子来模拟网络通信过程,直观呈现协议所发挥的关键作用:

每一层,具有下滑线的为该层的有效载荷,新添加的为报头,报文=报头+有效载荷

当客户A在给服务器发送"你好"请求时,该数据需要贯穿协议栈到达网卡进入网络,为了保证数据安全高效的传递,在网络协议栈的每一层,我们都会给该数据添加一些报头(专业名词),如:应用层:添加软件版本号、传输层:添加数据序号(防止传输过程中,数据紊乱)等。当接收方收到数据后,会对该报文逐层解包,并将解包后的报文再次传递给上层,在通信双方看来,各自都是在和对方对应的网络层直接通信,并不关心他的上一层,或下一层具体做了什么事。

在网络协议栈的分层结构中,每一层添加的报头本质上多为结构体对象。由于不同主机遵循同一协议标准,共享相同的结构体定义,因此接收方能够识别发送方添加的报文格式,并完成解析工作。这一机制确保了异构设备在网络中实现标准化通信。

我们还能发现, 当我们的数据包到达目标主机的时候, 从底向上的交付的过程, 其实就是去掉报头的过程。 我们把它, 叫做解包, 而通信的过程, 本身就是做不断地封装和解包的过程!
此处示例为方便理解每层只展示了一个协议,但实时上同一层存在许多协议

为此我们还需要知道下面两个实现思想:
第一个问题

若直接将碗中水倒入水桶则无法分离,但若用瓶子装水再放入水桶,取瓶即可分离。
类比协议:每层协议封装时需用报头(如瓶身)标记载荷边界,便于接收方逐层解包(如取瓶倒水),实现报头与载荷分离。

第二个问题

瓶身若标注"饮用"(类似报头信息),水桶管理者会将瓶中水分给"饮用水区"而非"浇花区"。
类比协议:报头需标明载荷归属的上层协议,确保数据精准分发给对应模块,即"分用能力"。

总结:
1、任何协议都必须提供,一种将报文和有效载荷分离的能力。
2、任何协议都要在报头中提供,决定将自己的有效载荷交付给上层哪个协议的能力。

三、网络通信

接下来我们以,以太网通信(局域网)为例,具体介绍

这是一间教室,老师正在给同学们上课。班级里有很多学生,其中有两位同学分别叫张三和李四。

当老师说"张三,站起来,你作业写没写"时,全班同学都听到了这句话,但只有张三会站起来。为什么李四没有反应?因为同学们在听到老师的"报文 "后,会提取其中的关键信息------老师喊的是"张三"而非自己的名字,因此判断该消息与己无关,便将其"丢弃"了。

随后,张三回答:"老师,我交给您了,您忘记了。"这时全班同学又都听到了这句话,但其他同学(如李四)不会回应,因为他们意识到这是张三与老师之间的对话,并非针对自己。于是,其他同学再次将这条消息"丢弃",只有老师会处理并回应张三的回答。

在这个场景中,老师和张三都认为彼此在直接沟通,但实际上全班同学都接收到了通信内容。只不过其他同学通过"提取报文中的目标标识 "(如名字),判断自己并非接收方,从而忽略了消息。这种"一对多广播发送,但接收方仅处理目标为自己的消息"的模式,正是局域网(如以太网)的通信原理------数据在局域网中广播传输,每个设备通过解析报头中的目标地址(类似"名字"),决定是否处理该数据。在主机间通信时每个主机都已Mac地址作为自己的名字,该地址存在于数据链路层 的报文中。

当主机H1向主机H10发送数据时,数据会以帧的形式通过以太网进行传播。在此过程中,H2、H3、H4等局域网内的所有主机都会接收到该帧,并对其进行解包处理。这些主机会首先检查帧头部中的目标MAC地址,发现该地址并非自己的MAC地址后,便会将整个帧丢弃。而H10主机在接收到该帧后,同样会对帧头部进行检查,当其发现目标MAC地址与自己的MAC地址相匹配时,就会将该帧的数据部分向上传递至网络层,随后再逐层进行解包处理,最终将数据交付给对应的应用程序。这就是以太网中主机的通信原理。

在局域网环境中,多台主机同时发送消息时,可能会引发数据碰撞问题在以太网中,当光电信号发生碰撞时,波形会紊乱,导致信息混乱。若想干扰局域网正常通信,一种简单的方式是持续向网络中发送垃圾信息,使其与正常信息频繁碰撞。

为解决这一问题,发送数据的主机需执行碰撞避免算法(由以太网驱动程序实现)。其核心原理是:当检测到碰撞发生时,主机暂停发送并随机延迟一段时间后重新尝试,通过"错峰发送"降低再次碰撞的概率。

局域网通信的安全隐患与应对

  1. 数据明文(裸漏、不加保护)传输风险

    当主机H1向H10发送数据时,信息会以明文形式在局域网中传播。理论上,其他主机(如H2)虽默认会丢弃非目标帧,但通过将网卡设置为混杂模式(非正常工作模式),可强制接收并解析所有流经的数据帧。此时,若数据未加密,H2等主机便可窃取并读取通信内容。

  2. 数据加密的重要性

    应对上述风险的有效手段是上层数据加密。例如,在应用层对数据进行加密处理后,再将密文传递给下层协议栈。即使数据在局域网中被截获,攻击者也难以破解加密后的内容。反之,若数据全程以明文形式传输(未加密),则存在极高的信息泄露风险。

总结

局域网的碰撞问题可通过驱动层的算法优化缓解,而通信安全的核心在于数据加密------通过上层协议对数据"加密保护",即使我们的数据被非法窃取,也不会出现安全风险。

相关推荐
qq_5085760922 分钟前
sudo apt update是什么意思呢?
linux
Hello.Reader26 分钟前
SCGI 服务器详解
运维·服务器
高峰聚焦26 分钟前
【Nextcloud】使用 LNMP 架构搭建私有云存储:Nextcloud 实战指南
linux·服务器·nginx·架构
虾球xz34 分钟前
游戏引擎学习第289天:将视觉表现与实体类型解耦
c++·学习·游戏引擎
易·木40 分钟前
在Linux服务器上部署Jupyter Notebook并实现ssh无密码远程访问
linux·服务器·jupyter
hgdlip42 分钟前
手机怎么查看网络ip地址?安卓/iOS设备查询指南
网络·tcp/ip·智能手机
jialan7542 分钟前
linux关闭某端口暂用的进程
linux·运维·服务器
癸酉金鸡1 小时前
将 /dev/vdb1 的空间全部合并到 /dev/mapper/centos-root(即扩展 CentOS 的根分区)
linux·运维·centos
肖永威1 小时前
HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)
linux·docker
liuzhangfeiabc1 小时前
[luogu12542] [APIO2025] 排列游戏 - 交互 - 博弈 - 分类讨论 - 构造
c++·算法·题解