【Linux第十九章】网络基础

前言 🚀

很多人在刚接触计算机网络时,会先记住一堆名词:OSITCP/IPIPMAC交换机路由器端口号。但如果这些概念彼此之间没有串起来,就很容易陷入"背过了定义,却不知道它们为什么会同时出现"的状态。

网络的核心目标,其实就是让不同机器在存在硬件差异、链路差异、路径差异的前提下,仍然能够稳定地交换数据。为了做到这一点,网络没有选择用一个协议包打天下,而是采用分层协作的方式:每一层只解决自己负责的问题,再通过封装与解包,把完整的数据传输流程拼接起来。


一. 为什么网络一定需要协议 🧠

协议本质上就是一种约定。现实世界里,快递单是一种约定,电话拨号规则是一种约定;在计算机系统里,文件格式、系统调用、网络报文头也都是约定。

计算机之间传输的本质仍然是光电信号,但不同机器的硬件结构、网卡实现、操作系统接口都可能不同。如果没有统一协议,不同设备之间就无法可靠互通。

主机之间看起来像是在"端到端直接通信",例如应用层看到的是客户端与服务器建立连接;但在真实网络中,数据往往需要经过交换机、路由器等多个中间节点逐跳转发。于是网络必须同时解决下面几类问题:

  1. 数据该怎么表示,接收方如何正确解析。
  2. 当前报文应该发给谁,如何找到目标主机。
  3. 如果中途经过多个网络节点,下一跳该交给谁。
  4. 数据在传输中丢了、乱了、冲突了怎么办。
  5. 不同层次的问题如何拆分,避免所有逻辑混在一起。

这也是分层模型出现的根本原因:不是因为"问题多所以硬分层",而是因为网络天然需要抽象与职责分离。


二. OSI 与 TCP/IP:理论模型和工程实现的关系 🗺️

OSI 更像一张"理想蓝图",它告诉我们网络通信可以拆成哪些逻辑层次;TCP/IP 则是互联网真正长期落地的协议体系,是工程实践上的主流方案。

2.1 OSI 更适合教学理解

OSI 七层模型把网络划分得非常清晰:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。它的优点是边界明确,适合学习者理解"每层到底在解决什么问题"。

2.2 TCP/IP 更接近真实实现

互联网并不是严格按 OSI 七层逐一实现的,而是采用更实用的 TCP/IP 协议栈。常见理解中可以把它看成四层或五层:

层次 典型协议 / 设备 主要职责
应用层 HTTPFTPSMTP 面向具体应用提供通信语义
传输层 TCPUDP 进程到进程通信、可靠性/效率控制
网络层 IP、路由器 主机到主机寻址与跨网络转发
数据链路层 以太网、交换机 局域网内基于 MAC 的帧传输
物理层 网线、光纤、集线器 比特流与光电信号传输

OSI 提供理论框架,TCP/IP 提供工程落地。 真实网络协议栈通常隐式遵循 OSI 的思想,但不会机械照搬七层模型。


三. 网络中的关键设备:集线器、交换机、路由器 🧱

3.1 集线器:工作在物理层

集线器的作用比较原始,本质上是对信号进行放大和转发。它不理解帧结构,也不识别目标设备,只是把接收到的电信号向其他端口扩散出去。

因此,集线器所在网络更容易出现冲突与无序传输,现代局域网中已经很少作为核心设备使用。

3.2 交换机:工作在数据链路层

交换机根据 MAC 地址转发以太网帧,主要用于同一局域网内部 连接多台设备。它会维护一张 MAC 地址表,从而把数据尽量准确地送到目标设备,而不是像集线器那样全网广播。

因此,交换机解决的是局域网内部的数据帧转发问题 ,它提升了局域网通信效率,但不负责跨网络通信

3.3 路由器:工作在网络层

路由器根据 IP 地址进行路由与转发,用来连接不同网络,例如把家庭局域网接入互联网。它不仅能完成跨网段通信,还常常承担 NAT、防火墙等功能。

可以这样理解:

  • 交换机更关心"同一个局域网里谁是谁"。
  • 路由器更关心"跨网络时下一跳应该去哪"。

💡 避坑指南:

不要把交换机和路由器混为一谈。
交换机解决局域网内的帧转发,路由器解决跨网络的数据包转发。


四. 为什么网络必须分层:封装与解包 🔍

发送数据时,应用层并不是直接把原始内容扔到网线上,而是会从上到下逐层封装。每一层都会在上层数据外面再加上自己的协议头,用于表达本层需要解决的问题。

4.1 封装过程

假设应用层要发送一段 "你好",它向下经过协议栈时,大致会经历这样的过程:
应用层数据
加上传输层报头
加上IP报头
加上以太网帧头
交给网卡发送

最终发出去的不只是"内容",而是:

  • 应用层有效载荷
  • TCP/UDP
  • IP
  • 以太网帧头

4.2 解包过程

接收端收到数据后,会从下到上逐层解包:

  1. 数据链路层先识别帧格式。
  2. 网络层解析 IP 头,确认目标是否是自己。
  3. 传输层根据 TCP/UDP 头找到目标进程。
  4. 应用层再拿到真正有效的数据。

封装解决"怎么发出去",解包解决"怎么还原并交给正确的上层模块"。

4.3 报头为什么重要

报头不是装饰,而是协议的结构化表达。就像快递单不是包裹内容本身,却决定包裹能否被正确送达一样,网络报头承担了目标定位、协议分用、校验与控制等职责。


五. 局域网通信、碰撞域与以太网 ⚙️

在同一局域网中,两台主机通常可以直接通信,因为它们共享同一链路环境,可以通过 MAC 地址在数据链路层完成交互。

但局域网并不意味着天然没有冲突。早期共享介质以太网中,多台设备可能同时发送数据,导致碰撞。于是需要通过碰撞检测或碰撞避免机制,让某一时刻链路上尽量只有一个有效发送行为。

存在碰撞可能性的逻辑范围,就可以理解为碰撞域。

现代交换式以太网已经大幅降低了碰撞问题,但理解碰撞域依然很重要,因为它体现了网络中"共享资源需要仲裁"的本质。


六. IP 地址、MAC 地址与下一跳关系 🧩

6.1 IP 地址解决主机到主机的问题

IP 地址用于在网络层标识主机。公网 IP 在互联网范围内具有全局唯一性;内网 IP 只要求在所属局域网或子网内部唯一,不同局域网中的内网地址可以重复使用。

因此,IP 地址关注的是"主机在哪里",它服务于跨网络的寻址与路由。

6.2 MAC 地址解决局域网链路上的交付问题

MAC 地址是网卡层面的硬件标识,作用在数据链路层。它主要用于局域网内部把以太网帧交付到某个具体设备。

因此,MAC 地址关注的是"这一跳要交给谁",而不是整个互联网范围内的最终主机定位。

6.3 为什么发往远端主机时目标 MAC 不是最终主机

这是学习网络时最容易混淆的一点。

如果目标主机和自己不在同一局域网,那么当前主机不能直接把帧交给远端设备,因为链路层只负责当前局域网这一跳。于是主机会:

  1. 在网络层把目标 IP 设为最终目的主机。
  2. 在数据链路层把目标 MAC 设为默认网关。
  3. 把帧先交给路由器。
  4. 路由器再根据路由表决定下一跳,并重新封装新的链路层帧头。

所以在多跳转发中:

  • IP 通常在端到端路径上保持目标不变。
  • MAC 会随着每一跳重新封装而变化。
标识 所在层 解决的问题 是否可能逐跳变化
IP 地址 网络层 主机到主机寻址 一般不变
MAC 地址 数据链路层 当前链路的下一跳交付 会变化

💡 避坑指南:

不要把 IPMAC 理解成同一类地址。
IP 负责跨网络定位主机,MAC 负责当前链路上的逐跳交付。


七. 端口号:从主机通信到进程通信 💻

仅有 IP 地址还不够,因为一台主机上往往同时运行多个网络程序。浏览器、数据库、消息服务都可能共用同一台机器,因此需要进一步区分"数据到底该交给哪个进程"。

这就是端口号的作用。

在互联网中:

  • IP 地址实现主机到主机的定位。
  • 端口号实现进程到进程的定位。

例如:

  • 192.168.1.100:80 表示访问该主机上的 Web 服务。
  • 192.168.1.100:3306 表示访问该主机上的 MySQL 服务。

7.1 端口与进程的关系

一个端口号在同一时刻不能随意被多个进程同时占用,否则内核无法确定报文该分发给谁;但一个进程可以根据需要关联多个端口,对外提供多个服务能力。

这可以类比为"打电话 + 转分机":

  • IP 像总机号码,先找到那台主机。
  • port 像分机号,再找到主机里的具体服务进程。

八. 网络协议栈和操作系统的关系 📌

网络并不是独立漂浮在操作系统之外的模块,TCP/IP 协议栈本身就是操作系统能力的一部分。应用程序通常通过 socket 这类系统调用接口,间接使用操作系统提供的网络功能。

也就是说,应用层看到的是编程接口,真正完成封装、解包、校验、路由、缓存和转发逻辑的,是操作系统内部的网络协议栈。

网络编程,本质上是在调用操作系统暴露出来的网络服务能力。


总结 📝

网络基础的重点,不在于孤立记住几个术语,而在于建立一条完整主线:协议是约定,分层是方法,封装与解包是机制,IPMAC 分别解决不同层面的寻址问题,端口号则把通信精确落到进程级别。

从局域网到互联网,从交换机到路由器,从以太网帧到 IP 包,再到 TCP/UDP 和端口号,整个网络体系其实都围绕同一个目标展开:让数据在复杂环境中,仍然能够被可靠地交付给正确的主机与正确的进程。

当这条主线建立起来之后,后续再学习 socket 编程、TCP/UDPHTTP/HTTPS、高性能网络 IO,就不会再觉得它们是零散知识点,而会自然落到同一套通信框架中。

相关推荐
程序猿追2 小时前
HarmonyOS 6.0 网络请求深度解析:从基础调用到生产级封装
网络·华为·harmonyos
桌面运维家2 小时前
BGP路由优化实战:加速收敛,提升网络稳定性
网络·windows·php
陳10302 小时前
Linux:基础开发工具
linux·运维·服务器
sg_knight2 小时前
CentOS 裸机实操:5分钟完成 MinIO 单机部署与公网访问
linux·python·centos·文件管理·minio·ftp·oss
dgvri2 小时前
Linux(CentOS)安装 MySQL
linux·mysql·centos
Coder个人博客2 小时前
06_apollo_third_party子模块整体软件架构深入分析文档
linux·人工智能·架构
我爱学习好爱好爱2 小时前
Ansible 常用模块详解:cron、archive、unarchive实战
linux·服务器·ansible
十年编程老舅2 小时前
Linux 多线程高并发编程:读写锁的核心原理与底层实现
linux·c++·linux内核·高并发·线程池·多线程·多进程
乌恩大侠2 小时前
【KrakenSDR】MATLAB接口
服务器·网络·matlab