Linux 网络基础(一)认识协议,网络协议,网络协议分层框架搭建,网络传输基本流程,跨网络的数据传输

目录

一、计算机网络背景

二、数据远距离传输带来的四大核心问题

三、如何解决这些问题?答案是:协议

四、什么是协议

五、协议分层

为什么要分层?

回到网络:分层模型的实际意义

协议分层的优点

六、OSI七层模型

七、TCP/IP四层(五层)模型

八、再识协议

为什么要有TCP/IP协议?

什么是TCP/IP协议?

TCP/IP协议与操作系统的关系

协议的本质

九、网络传输基本流程

​编辑

十、局域网通信

以太网通信

以太网通信原理

令牌环网

[十一、IP地址 vs Mac地址](#十一、IP地址 vs Mac地址)

十二、跨网络的数据传输

十三、总结


一、计算机网络背景

从软盘拷贝到全球互联:计算机网络是怎么一步步诞生的?

很多人第一次接触网络编程,都觉得 TCP/IP、Socket、路由这些概念又抽象又复杂。但如果我们顺着历史脉络往下看,就会发现:网络的诞生,本质上就是为了解决一个最朴素的问题 ------怎么让数据更快、更方便地从一台电脑传到另一台电脑。

下面我们就跟着历史的脚步,一步步看懂网络是怎么从 "软盘拷数据" 走到 "全球互联" 的。

1. 早期的计算机,天生就是 "孤岛"。

我们看上面这幅图,图片里小松、小竹、小梅的场景,就是最真实的写照:

  • 小松、小竹、小梅各有一台独立的终端 A、B、C,数据只能存在本机;
  • 业务①的结果,是小竹业务②的输入,业务②的结果又是小梅业务③的输入;
  • 这就形成了一个串行依赖:小松必须先做完,小竹才能开始,小梅只能等前两个人都结束。

更麻烦的是,电脑之间根本没有直接传数据的模块。小松想把结果给小竹,只能:

  1. 拿着软盘把数据拷进去;
  2. 走到终端 B 前,把软盘插进去;
  3. 再把数据拷到小竹的电脑里。

整个过程全靠人跑,不仅慢,还很容易出错、丢数据。这就是单机孤岛时代的痛点:数据不能共享,人要跟着数据跑,效率极低。

上图就是软盘,软盘可以将计算机上的数据拷贝,还可以将软盘上的数据拷贝到计算机上。但是这种采用软盘的传输数据的方式太过费时,并且拷贝数据还很慢,并且软盘的内存空间较小,并且软盘容易发生数据丢失,所以人们就思考有没有一种更高效传输数据,更高效一点的数据通信的方法?
2. 为了解决 "人跑着传数据" 的问题,工程师们想出了一个简单又有效的办法:加一台公共服务器

再看这幅图:

  • 买一台服务器,把业务①②③的所有数据和程序都集中存在这里;
  • 小松、小竹、小梅各自用自己的电脑,通过网线连到服务器上
  • 小松做完业务①,直接把结果传到服务器上;
  • 小竹不用等小松人跑过来,直接从服务器里取数据做业务②;
  • 小梅再从服务器里拿业务②的结果做业务③。

这个方案直接解决了 "数据依赖" 的问题:

  • 业务切换不用换电脑,数据都在服务器里;
  • 不用再拿着软盘跑,数据传输交给软件来做;
  • 效率瞬间提升,也不怕软盘丢数据了。

这就是 "客户端 - 服务器" 模式的雏形,也是局域网的起点。
3. 局域网 :把一个办公室的电脑都连起来

服务器解决了几台电脑的问题,但如果一个公司有十几台、几十台电脑,怎么办?这时候,两个关键设备登场了:交换机和路由器

  • 同一个办公室的电脑,先连到交换机 上,交换机负责把数据发给局域网里的其他电脑;
  • 不同办公室的局域网,再通过路由器连起来,路由器帮数据在不同网段之间 "找路"。

现在,一个公司里的所有电脑,都能互相通信、访问服务器、共享打印机,这就是局域网

  • 它的核心是 "本地互联",覆盖一个办公室、一栋楼或者一个校园;
  • 交换机负责局域网内的通信,路由器负责跨局域网的通信;
  • 我们现在用的公司内网、家里的 WiFi,本质上都是局域网的一种。

我们先来看一下交换机和路由器的作用 :

  1. 交换机:让同一个局域网里的设备(比如公司里的电脑、手机)互相说话,看的是 MAC 地址。
  2. 路由器:让不同的局域网(比如公司和外面的互联网)互相说话,看的是 IP 地址,顺便还负责给公司设备分配内网 IP。
    4. 广域网 :把全世界的局域网连起来

局域网解决了 "本地" 的问题,但如果大阪的公司想和东京的分公司传数据,麻省理工想和清华大学做科研合作,怎么办?这就轮到 广域网登场了。

上图就是广域网的模型:

  • 大阪、东京、北京、上海、洛杉矶的局域网,各自通过路由器连到主干网上
  • 路由器会帮数据 "跨城市、跨国家" 找路,比如你在大阪发一条消息给东京的同事,数据会经过大阪的路由器→主干网→东京的路由器,最终送到对方的电脑里。

这里有个关键概念要搞清楚:"局域网" 和 "广域网" 不是绝对的,而是相对的:

  • 对大阪的办公室来说,自己的网络是局域网,大阪和东京之间的网络是广域网;
  • 但如果把视角放大,整个日本的网络也可以看作一个 "大型局域网",和美国的网络互联时,才叫广域网。

而我们现在用的互联网,本质上就是一个 "超级广域网":它把全世界无数个局域网、广域网,通过路由器和主干网连在一起,让你能在深圳的电脑上,访问美国的服务器,看欧洲的网页。
5. 写在最后:网络的诞生,从来都不是为了技术,而是为了人

从一开始的 "软盘拷数据",到后来的 "服务器集中管理",再到 "局域网互联",最后到 "全球广域网",网络发展的每一步,都是为了解决同一个问题:让数据不用再跟着人跑,让不同地方的人能更高效地协同工作。

而我们接下来要学的 Linux 网络编程、Socket、TCP/IP,本质上就是在写 "让电脑通过网络互相通信的代码"。而理解了这段历史,就会发现:那些看起来复杂的协议和接口,背后都是一个个朴素的需求和痛点。

二、数据远距离传输带来的四大核心问题

广域网搭建好了,麻省理工学院的数据终于可以传输给清华大学了。但问题来了,横跨一万多公里的长距离传输,远不是 "把网线拉长" 那么简单。在这个过程中,数据会经过无数交换机、路由器和线路,由此衍生出四个必须解决的核心问题,它们是层层递进的关系:

  1. **如何让数据从一台设备准确地到达下一台设备?**数据传输的第一步,是解决 "相邻设备间的通信"。我们要先确保数据能从我们的电脑发给局域网内的交换机,再从交换机发给下一跳路由器,再由路由器发给主干网的下一个节点。这是一切传输的基础。

  2. **如何在茫茫网络中,定位到最终的目标主机?**数据在路上经过了成千上万台设备,你怎么确保它不会迷路,最终能准确找到清华大学的那台计算机?这就需要一套地址系统,给每一台主机一个独一无二的身份标识。

  3. **如何解决长距离传输中数据丢失的问题?**网络链路不稳定、设备拥堵、信号干扰...... 任何一个环节出错,都可能导致数据包丢失。丢包了怎么办?要不要重发?重发哪一段?这是保证数据可靠传输必须解决的问题。

  4. **目标主机收到数据后,该如何处理?**数据终于到了,可这一堆二进制比特流,是浏览器请求的网页,还是游戏发来的指令?目标主机需要一套规则来识别、解析这些数据,交给正确的应用程序处理。

我们会发现,这四个问题,恰好对应了我们后面要学的网络分层模型

  • 问题 1,由 数据链路层 / 物理层解决;
  • 问题 2,由 网络层(IP 协议)解决;
  • 问题 3,由 传输层(TCP 协议)解决;
  • 问题 4,由 应用层(HTTP 等协议)解决。

这正是网络协议分层的根本原因:把一个复杂的大问题,拆解成一层层的小问题,每一层只解决自己的那部分难题,最终实现全球范围内的可靠通信。

三、如何解决这些问题?答案是:协议

前面我们提出了远距离传输的四大难题 ,而解决这一切问题的核心,就是协议 。协议听起来很抽象,其实它就是通信双方事先约定好的一套规则和暗号。我们用两个生活中的例子,就能瞬间理解它的本质。

1. 打电话的约定:协议的核心是 "双方共识"

假设你上大学离家很远,打电话很贵,于是你和爸爸约定了一套 "铃声暗号":

  • 响一声就挂 = 报平安,不用接电话,不产生话费;
  • 响两声就挂 = 生活费不够了,爸爸看到就会给你打钱;
  • 响三声以上 = 有急事,爸爸必须接电话。

此时只要双方都遵守这个约定,就能在不产生话费的情况下传递信息。这里的 "约定",就是协议的本质:通信双方必须遵守的一套共同语言和规则。

放到网络里,解决那四个问题,每一层都需要自己的协议:

  • 如何让数据到达下一个设备?由数据链路层协议解决;
  • 如何定位主机?由 **IP 协议(网络层)**解决;
  • 如何解决数据丢失?由 **TCP 协议(传输层)**解决;
  • 如何处理数据?由 HTTP/HTTPS、FTP 等应用层协议解决。

没有协议,通信双方就像两个说不同语言的人,根本无法沟通。

2. 寄快递的类比:协议就是 "快递单"

再举个更形象的例子:寄快递。当我们寄一个篮球时,真正的信息传递,不仅是篮球本身,还有一张关键的快递单。快递单上写着寄件人、收件人、地址、电话、重量...... 快递公司和收件人,都默认这些信息代表特定的含义:

  • 收件人姓名 / 地址:告诉快递员这是给谁的、要送到哪;
  • 电话:联系不上时用来沟通;
  • 单号:用来查询和追踪包裹状态。

这张快递单,就是你和快递公司、收件人之间的协议。它定义了数据的格式和含义,确保每个环节的参与者都能看懂。

而在计算机里,这些约定好的 "属性信息",通常用结构体(struct)来描述和定义。我们常说的 "协议头",本质上就是一个结构体,里面包含了源地址、目标地址、数据长度、校验码等字段,就像快递单上的各项信息一样。

3. 总结一下:

无论是打电话的铃声约定,还是寄快递的快递单,它们的核心都是协议

  • 协议是通信双方的 "共同语言";
  • 协议规定了数据的格式、含义和处理方式;
  • 正是因为有了分层的协议栈,数据才能在横跨半个地球的网络里,从我们的电脑准确、可靠地送到目标主机。

四、什么是协议

前面我们聊了协议是通信双方的约定,现在我们再深入一步,看看协议在计算机里到底是怎么被实现、又为什么会形成统一的标准。

1. 协议在计算机中的具象化 : struct 结构体

在代码层面,协议就是一组约定好的数据格式,而它最直接的表现形式,就是 C/C++ 中的结构体。比如我们说的 "快递单",可以用一个结构体来描述:

复制代码
struct ExpressProtocol {
    char sender[20];   // 寄件人
    char receiver[20]; // 收件人
    char address[50];  // 地址
    char phone[15];    // 电话
    double weight;     // 重量
};

通信双方只要都按照这个结构体来解析数据,就能看懂彼此发送的信息。

2. 数据传输的本质:从光电信号到约定格式

计算机之间传输数据,底层只是通过网线、光纤传递光电信号 ,用频率和强弱来表示 01。但一堆 0 和 1 本身没有任何意义,要让接收方知道 "哪几位代表地址、哪几位代表数据长度、哪几位是校验码",就必须双方事先约定好数据格式 ------ 这就是协议。没有协议,0 和 1 只是乱码;有了协议,它们才变成有意义的信息。

3. 为什么需要 "网络协议标准"?

如果通信双方只是自己约定一套规则,比如两台电脑之间用自定义的格式传数据,理论上是可以的。但现实中,计算机厂商、操作系统、硬件设备成千上万,每个厂商都自己定一套规则,结果就是:

  • 不同品牌的电脑之间根本无法通信;网络会变成一个个 "孤岛",无法互联。

所以,必须有人制定一套所有人都遵守的共同标准,让不同厂商、不同系统的设备,都能按照同一套规则来通信。这就是我们常说的 "网络协议",比如 TCP/IP 协议簇,正是这套标准,才让全球互联网成为可能。

五、协议分层

  1. 实际在网络协议中,协议是分层的,下面我们先为大家介绍一个打电话的例子,帮助理解

  1. 比如在较早的时候,人们用电话座机打电话,那么打电话时实际上我们并不是直接和对应的人进行交流,而是我们在和电话座机进行交流。

  2. 假设今天我和屏幕面前的你进行交流,首先我"喂"一声,然后这个"喂"先是被我的电话座机接收,然后经过电话座机传输给你的电话机座机,然后你的电话座机再将接收到的信息,再经过电话的喇叭转换,所以你就听到了这个"喂",所以你也"喂"一声,经过相同的转换,然后我就听到了,此时我们就可以进行沟通了。

  3. 上述过程可以看成是两层模型的交流,第一层是我和你在语言层第二层是我的电话座机和你的电话座机在通信设备层。语言层 上我们用汉语/英语对话,只关心说什么内容,完全不关心电话是怎么把声音传过去的;通信设备层上两部座机之间,只关心信号怎么传输、怎么拨号,完全不关心我们说的是汉语还是英语。

  4. 这就是协议分层的核心:

  • 每一层只负责自己的那一件事,有自己的协议约定;
  • 层与层之间通过接口交互,上层不用管下层的实现细节;
  • 逻辑上,每一层都像是在和对方的同一层直接对话(对等通信)。

为什么要分层?

因为问题本身就是分层的。数据从我们的电脑传到千里之外的服务器,路上要解决的问题是层层递进的:

  1. 怎么把数据从电脑发到局域网里的下一台设备?(链路层)
  2. 怎么找到跨网段的目标主机?(网络层)
  3. 长距离传输丢包了怎么办?(传输层)
  4. 收到数据后怎么解析处理?(应用层)

这些问题本身就可以按 "相邻传输 → 寻址 → 可靠传输 → 数据处理" 分成几类,每一类都需要专门的协议来解决,自然就形成了分层模型。

同时分层也会降低复杂度,方便维护和扩展。因为网络系统太庞大了,如果把所有功能都揉在一个协议里,代码会变成 "大泥球",任何一个小改动,都可能影响全局,调试、维护、升级都极其困难,并且厂商之间也没法统一标准。分层之后,每个模块只做一件事,修改或替换某一层,完全不影响其他层。比如:

  1. 你把家里的座机换成手机,底层通信协议变了,但你说的汉语完全不用改;
  2. 你和外国朋友用英语对话,上层语言协议变了,底层座机 / 手机也不用换。

回到网络:分层模型的实际意义

我们再回到网络中,就像上图的跨局域网通信场景,主机 1 要把数据传给主机 7,过程就是按层来的:

  1. 主机 1 先和局域网内的设备通信(链路层);
  2. 数据通过路由器跨局域网传输,找到目标主机(网络层);
  3. 保证数据不丢失、不乱序(传输层);
  4. 主机 7 收到数据后,交给应用层处理(比如 HTTP 请求、文件传输)。

正是因为有了分层,这个横跨多个局域网的复杂通信过程,才能被拆分成一个个简单、可控的模块,最终实现全球互联。

协议分层的优点

下面我们就引出OSI七层网络模型。

六、OSI七层模型

  1. 计算机的网络通信要进行分层,所以需要一个权威的组织来进行制定标准,这个组织叫做国际化标准组织ISO,所以它们就定制了OSI(Open System Interconnection,叫做开放系统互连)七层网络模型,是一个逻辑上的定义和规范。

  2. OSI七层网络模型,将网络从逻辑上分为七层,每一层都有对应的物理设备,比如路由器,交换机等。

  1. 但是在实际实现的过程中,程序员发现完完全全的按照这7层网络模型来设计并不好,Linux中有关于网络模块的实现,而实际实现的时候,在Linux中没有关于应用层,表示层,会话层的实现,通常是将表示层,会话层归纳到应用层中实现,而是仅仅在Linux中实现了传输层,网络层,在底层网卡的驱动程序中实现了数据链路层,而在物理层,即需要支持网卡这个硬件。

  2. 而传输层中又以TCP协议为代表,网络层中又以IP协议为代表,TCP协议和IP协议可是已经写到Linux内核中了,所以TCP/IP协议的重要性不言而喻,所以我们将上述模型简化为TCP/IP网络协议栈,如下。

七、TCP/IP四层(五层)模型

  1. TCP/IP五层(四层)模型,为什么要叫五层呢?因为涉及到物理层,数据链路层,网络层,传输层,应用层 这五层,那么为什么也可以称作四层呢?因为物理层属于硬件,我们是搞软件的,对物理层关注较少也很正常,所以就再次被简化成了四层,即数据链路层,网络层,传输层,应用层。

  2. TCP/IP是一组协议的代名词,还有其他很多的协议,这些协议共同组成TCP/IP协议簇。

  3. 那么TCP/IP网络协议栈就有了5层结构,如下

  1. 因为物理层我们考虑的比较少,我们只考虑软件相关的内容。因此很多时候我们直接称为 TCP/IP 四层模型。一般而言 :
  • 对于一台主机,它的操作系统内核实现了从传输层到物理层的内容;
  • 对于一台路由器,它实现了从网络层到物理层;
  • 对于一台交换机,它实现了从数据链路层到物理层;
  • 对于集线器,它只实现了物理层;
  1. 但是也并不绝对。现在很多交换机也实现了网络层的转发;很多路由器也实现了部分传输层的内容 (比如端口转发);

八、再识协议

上面的内容,我们只是懂了一些基本概念,还是达不到我们的目标,下面我们再次重新理解协议和协议分层。

为什么要有TCP/IP协议?

  1. 首先,即便是单机,就是在我们的计算机内部,其实都是存在协议的,比如:其他设备和内存通信,会有内存协议。其他设备和磁盘通信,会有磁盘相关的协议,比如:SATA,IDE,SCSI 等。只不过我们感知不到罢了。而且这些协议都在本地主机各自的硬件中,通信的成本、问题比较少。

  2. 其次,网络通信最大的特点就是主机之间变远了 。任何通信特征的变化,一定会带来新的问题,有问题就得解决问题,所以需要新的协议咯。

所以,为什么要有 TCP/IP 协议?本质就是通信主机距离变远了

什么是TCP/IP协议?

TCP/IP 协议的本质是一种解决方案

TCP/IP 协议能分层,前提是因为问题们本身能分层

TCP/IP协议与操作系统的关系

  1. 前面我们知道了 TCP/IP 协议栈的分层结构,而下面这张图则清晰地展示了操作系统各部分与网络协议栈对应关系,帮我们理解用户程序是怎么一步步把数据发出去的。
  1. 左侧从上到下依次是用户,操作系统,驱动和设备。右侧是网络协议栈,网络协议栈是分层的,我们就按照五层来进行划分,首先物理层对应硬件,包括网卡 等,紧接着向上是数据链路层,数据链路层对应的是驱动程序,即对应网卡的驱动程序。

  2. 再往上,那么对应网络层,网络层对应的是操作系统中的网络模块的一部分 ,再往上,那么对应的传输层对应的同样也是操作系统中的网络模块的一部分。

  3. 再往上就是应用层,应用层中有各项协议:HTTP、HTTPS、SMTP、DNS等,再往上就是用户了,用户不属于网络协议栈。

  4. 那么我们可以得知,如果用户想要传输数据,那么就要通过网卡这个硬件设备,而操作系统是软硬件的管理者,所以用户不能直接跨过操作系统直接去访问底层网卡这个硬件,而操作系统又不相信任何人,所以操作系统就势必会对外提供系统调用,即网络模块也有相关系统调用,所以此时我们就可以理解下图了。

  1. 网卡就是硬件底层

  2. 数据链路层在驱动程序中

  3. 网络层和传输层两层被集成在OS内核中

  4. 应用层就在OS上层,由用户实现

协议的本质

  1. 我们上面讲过,我们可协议把它想象成:协议就是通信双方提前约定好的,一套一模一样的 "数据模板"。在 C/C++ 语言里,这个模板就是一个结构体(struct)。

  2. 比如,主机 A 和主机 B 约定了这样一个结构体:

  3. 当主机 A 要发送数据 {a=10, b=20, c=30} 给主机 B 时,它会把数据按这个结构体的格式打包,再通过网络发出去。而主机 B 收到这串二进制数据后,只要用同样的 struct protocol 结构体去解析,就能准确地还原出 a=10, b=20, c=30 这三个值。

  4. 所以,问题的答案是:主机 B 一定能识别并提取出这些数据。因为它们双方都认识这个结构化的数据类型,就像都看得懂同一张 "快递单" 一样。这就是协议的本质 ------通信双方的共识。

  5. 再延伸到我们之前讲的分层模型,会发现这个逻辑完全适用:网络协议栈是分层的,每一层都有自己的 "结构体" 协议。发送方会给数据层层加上各层的协议头(也就是一层层的结构体),接收方则按相反的顺序,一层层解析这些协议头。同一层的协议,必须是双方都认识的 "共同语言",这样才能实现端到端的通信。

九、网络传输基本流程

  1. 假设现在有一个安卓手机向 Windows 电脑发送数据,安卓手机底层基于 Linux 内核,电脑运行 Windows 系统,二者操作系统内核、用户界面差异巨大,却能稳定收发数据,核心原因是所有操作系统的网络模块都遵循统一的国际标准(TCP/IP 协议栈)

  2. 不管是 Linux 还是 Windows,内核中实现的 IP 协议、TCP 协议,其数据结构、字段定义、处理逻辑完全一致。就像两个来自不同地区的人,只要使用同一种通用语言,就能无障碍对话;不同操作系统的主机,只要遵循同一套协议标准,就能互相解析、理解对方的数据。

  3. 那么此时上图中手机的用户想要发送数据给电脑,那么就要将数据一层一层的贯穿网络协议栈,从应用层向下递达到传输层,从传输层向下递达到网络层,从网络层向下递达到数据链路层,从数据链路层向下递达到物理层中的网卡,然后经过网卡将数据发送出去。

  4. 那么此时电脑的网卡就接收到了数据,那么电脑的网络协议栈就开始从低至上的拆解数据,从物理层中的网卡向上递达给数据链路层,数据链路层将数据向上递达到网络层,从网络层向上递达到传输层,从传输层向上递达到用户层,所以电脑就可以获取到手机发来的数据了。

  5. 所以网络通信的完整过程,就是数据在发送方层层封装、在接收方层层解封装的双向流程。

  6. 在这个网络协议栈中,由于不同分层都会有不同分层的设备,但是处于不同分层的设备要发挥作用只能向从当前层向下贯穿网络协议栈,或者从最下层向上贯穿网络协议栈到本层,所以处于不同分层的设备一定会包含当前层以及它向下层的内容。

  7. 在传输层发挥作用的,对于一台主机,它的操作系统内核实现了从传输层到物理层的内容

  8. 在网络层发挥作用的,对于一台路由器,它实现了从网络层到物理层的内容

  9. 在数据链路层发挥作用的,对于一台交换机,它实现了从数据链路层到物理层的内容

  10. 在物理层发挥作用的,对于一台集线器,它实现了物理层的内容

  1. 所以现在就有两个用户,左侧用户想要给右侧用户发送"你好"这个数据,右侧用户想要接收数据,所以两者本质上就是通过网络协议栈进行通信。

  2. 用户 A 要发送 "你好" 数据,数据会从应用层向下,贯穿整个协议栈,每一层都给数据 "加头",形成报文 = 报头 + 有效载荷

  3. 应用层:原始数据 "你好" 作为有效载荷,加上应用层报头(比如 FTP、HTTP 的协议头),形成应用层报文;

  4. 传输层:接收应用层报文,加上 TCP/UDP 报头(包含序号、端口号等),构成传输层报文;

  5. 网络层:接收传输层报文,加上 IP 报头(包含源 IP、目标 IP 地址),构成 IP 数据包;

  6. 数据链路层:接收 IP 数据包,加上以太网报头(包含源 MAC、目标 MAC 地址),构成以太网帧;

  7. 物理层:网卡将封装好的以太网帧转换成电信号 / 光信号,通过网线发送到网络中。

  8. 数据到达主机 B 后,流程与发送方相反,从物理层向上,层层剥掉报头,还原原始数据:

  9. 物理层:网卡接收电信号 / 光信号,还原为以太网帧;

  10. 数据链路层:剥掉链路层报头,取出 IP 数据包,将数据向上传递给网络层;

  11. 网络层:剥掉 IP 报头,取出传输层报文,将数据向上传递给传输层;

  12. 传输层:剥掉传输层报头,取出应用层报文,根据端口号分用,将数据向上传递给应用层;

  13. 应用层:剥掉应用层报头,最终还原出 "你好" 数据,交给用户 B 。

  14. 从图中红色箭头能看到,每一层的协议都只关注对方主机的同层协议,认为是在直接对话:

  • 主机 A 的应用层,直接把数据交给主机 B 的应用层;
  • 主机 A 的传输层,直接把数据交给主机 B 的传输层;
  • 主机 A 的网络层,直接把数据交给主机 B 的网络层;
  • 主机 A 的数据链路层,直接把数据交给主机 B 的数据链路层。

但实际传输中,数据是靠物理层的信号传递,层层封装后到达主机 B,同层通信是 "虚拟" 的,真正的传输是靠底层介质完成

  1. 最后经过一系列传输,报文最终会送达目标主机的网卡,此时目标主机需要对报文进行解包与分用。解包,就是将报文中对应当前层级协议的报头剥离,把报头与有效载荷分离开来,而分离的前提,是通信双方遵循同一套协议格式约定。分离的依据,就是按照各层协议规定好的报头长度、固定结构、字段位置进行分离。

  2. 报文最初存储在网卡这个外设中,根据冯・诺依曼体系结构的规定,CPU 要处理外设数据,必须先将其拷贝到内存中,因此网卡会把收到的报文数据拷贝到主机内存里,操作系统才能对其进行处理,数据链路层、网络层、传输层的协议处理逻辑,也都运行在内存中。

  3. 当报文数据进入内存后,就有了确定的起始地址,而网络协议栈的每一层,都使用双方预先约定好的 struct 结构体来定义报文格式,包括字段的顺序、长度、含义都完全一致。因此操作系统可以将报文的起始地址,强制转换为对应协议的结构体指针,通过访问结构体的成员变量,就能直接读取报头中的信息,实现报头与有效载荷的分离,再根据报头中的协议标识,将有效载荷分发给上层对应的协议模块,继续后续处理。

  4. 在网络通信里,发送方封装数据时,每一层的协议头都会提前为 "后续解包" 做准备:要么在报头里写清楚自己的长度,要么就用固定大小的报头,这样接收方拿到数据后,就能知道 "报头到哪结束,有效载荷从哪开始"。

  5. 当数据到达接收方的网卡,最先处理它的是数据链路层。它会先根据报头里的长度信息,把以太网帧的报头和里面的有效载荷分开,然后调用协议里的 "分用函数",根据报头里的协议类型字段,判断这个有效载荷该交给网络层的哪个协议(比如 IP 协议)处理。分用的核心就是:发送方和接收方用的是同一套协议,发送方在封装时写清了 "上一层该用什么协议",接收方就能按这个约定,把数据精准递交给对应的协议模块。

  6. 被递送到网络层后,IP 协议会重复同样的步骤:先把 IP 报头和有效载荷分开,再根据 IP 报头里的协议字段,判断数据该交给传输层的 TCP 还是 UDP 协议处理。传输层拿到数据后,又会解析 TCP/UDP 报头,根据端口号把数据交给对应的应用层协议(比如 HTTP、FTP),最终还原出用户要发送的原始数据。

  7. 简单说,整个过程就是:每一层都先剥离自己的报头,再根据报头里的 "协议标识",把里面的数据分发给上一层对应的协议,一层一层往上递,直到交给最终的应用程序。

12. 所以通信的过程本质就是不断的封装和解包的过程。

  1. 下面我们归纳大部分协议的关于封装和解包的两个特性
  • 几乎任何层的协议,都要提供一种能力,将报头和有效载荷分离的一种能力 (解包)
  • 几乎任何层的协议,都要在报头中提供,决定将自己的有效载荷交付给上层的哪一个协议的能力(分用)

14.整个过程就是入栈和出栈 : 入栈也就是封装,数据从应用层向下传递,每一层都加上自己的报头,最终形成完整的以太网帧,由网卡发送出去;出栈也就是解包,数据到达对端后,从数据链路层向上处理,每一层剥离对应的报头,最终还原出原始数据并交给用户进程。

  • 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
  • 除了报头,剩下的叫做有效载荷
  • 所以 报文 = 报头 + 有效载荷

然后,我们再明确一下不同层的完整报文的叫法

  • 不同的协议层对数据包有不同的称谓,在传输层叫做段 (segment),在网络层叫做数据报 (datagram),在链路层叫做帧 (frame)。
  • 应用层数据通过协议栈发到网络上时,每层协议都要加上一个数据首部 (header),称为封装 (Encapsulation)。
  • 首部信息中包含了一些类似于首部有多长,载荷 (payload) 有多长,上层协议是什么等信息。
  • 数据封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部,根据首部中的 "上层协议字段" 将数据交给对应的上层协议处理。

下图是数据封装的过程:

数据封装是发送方的 "打包" 过程:用户数据从应用程序出发,沿协议栈从上到下依次添加应用层首部、TCP 首部、IP 首部和以太网首部 / 尾部,层层封装后形成符合格式要求的以太网帧,再由网卡发送到网络中。

下图是数据分用的过程:

数据分用则是接收方的 "拆包" 与分发过程:以太网驱动收到帧后,先根据帧类型字段将数据递交给 IP、ARP 或 RARP 协议;IP 层再根据首部的协议值分发给 TCP、UDP、ICMP 或 IGMP 协议,传输层最终根据端口号,将数据交付给对应的应用程序,完成数据还原与递达。

十、局域网通信

以太网通信

在讲解以太网通信之前,我们先讲一个故事帮大家带入一下:

在一间教室里,老师要叫张三回答问题。老师对着全班喊出 "张三" 的名字,全班同学都听到了这条广播信息。每个同学都会把名字和自己的名字比对,只有张三发现名字匹配,知道这是在叫自己,于是站起来回应;其他同学发现和自己无关,就会忽略这条信息。当张三回答问题时,他的声音也会传遍整个教室,所有人都能听到。其他人会再次确认信息不是发给自己的,便自动忽略;而老师作为接收方,则会完整接收并确认这条回答。如果教室里有人说话、环境嘈杂,导致老师听不清张三的回答,就会维持秩序让大家安静下来,让张三重新再说一遍,确保信息能被准确接收。

这个故事里,教室就是以太网局域网,每个同学的名字就是主机的 MAC 地址,老师喊话和张三回答,就是以太网里 "广播寻址、单播通信" 的过程,而维持秩序、重新回答,就是以太网的冲突避免与重传机制

以太网通信原理

  1. 局域网有很多中,以太网就是局域网的一种,并且以太网也是局域网中最具有代表性,应用场景最广泛的一种局域网。

  2. 类似于上面的场景,每台主机在以太网上,都要有自己唯一的一个的标识 ,那么这个标识应该如何理解呢?这个唯一标识其实就是mac地址 ,每台计算机都要有网卡这个硬件,每一个网卡都有唯一的mac地址,mac地址在网卡出厂的时候就已经确定了,不能修改,mac地址是唯一的。

  3. 那么操作系统是软硬件资源的管理者,所以操作系统自然可以通过网卡驱动程序管理网卡,进而操作系统就可以获得网卡的mac地址,所以此时每台主机都可以获得自己的唯一标识的mac地址。

MAC 地址用来识别数据链路层中相连的节点;长度为 48 比特位,即 6 个字节。一般用 16 进制数字加上冒号的形式来表示 (例如: 08:00:27:03:fb:19),它在网卡出厂时就确定了,不能修改,mac 地址通常是唯一的 。后面我们详细谈论数据链路层的时候,会谈 mac 帧协议,此处我们做一个了解即可。

  1. 上图是一个局域网中的10个相连的主机,分别是主机H1到H10,主机H1到H10分别对应自己的网卡M1到M10,并且每一个网卡上都有自己唯一的mac地址。

  2. 在一个由 10 台主机(H1-H10)组成的以太网局域网中,每台主机的网卡(M1-M10)都有唯一的 MAC 地址,这是局域网通信的基础。当主机 H1 要向 H10 发送数据时,数据会先在发送方经过协议栈封装,数据链路层会在报文中加入源 MAC 地址(M1)和目标 MAC 地址(M10),再通过网卡广播发送到整个局域网。此时,所有主机的网卡都会收到这个报文,它们会对比报文中的目标 MAC 地址和自身 MAC 地址,只有 H10 发现匹配,才会接收数据并继续解封装,其他主机则直接丢弃报文。

  3. 如果局域网内多台主机同时发送数据,就会出现信号碰撞,导致数据损坏。为了解决这个问题,以太网引入了碰撞避免算法:主机在发送数据时会监听网络,一旦检测到碰撞,就会等待一段随机时间后再重传,这样就能分散多台主机的发送时机,大大降低再次碰撞的概率,保证同一时间内基本只有一台主机在发送数据。而会发生数据碰撞的整个局域网区域,就被称为 "碰撞域"。

  4. 另外,网卡有两种工作模式:默认的正常模式下,只有目标 MAC 地址匹配的报文才会被接收;而混杂模式下,网卡会接收所有收到的报文,不管 MAC 地址是否匹配。这也意味着,局域网内的数据如果不加密,就可能被其他主机捕获,所以敏感数据需要加密传输,确保只有目标主机能解密读取。

  5. 为了解决传统以太网碰撞概率高的问题,交换机应运而生。交换机工作在数据链路层,它会通过学习主机 MAC 地址与端口的对应关系,建立 MAC 地址表。当收到数据时,交换机会直接根据目标 MAC 地址,将数据转发到对应的端口,而不是广播到所有端口,这样就把原来的大碰撞域分割成了多个小碰撞域,大幅减少了数据碰撞的可能,提升了网络效率。这也要求交换机必须实现从物理层到数据链路层的协议栈功能,才能完成这样的转发工作。

令牌环网

  1. 因为局域网的种类天然的有多种,局域网可以有以太网,也可以是无线LAN,也可以是令牌环网。

  2. 令牌环网其实已经逐渐被淘汰了,所以我们就简要的讲解一下令牌环网的原理,令牌环网其实就是要求要在令牌环网想要进行发送数据的设备需要先申请"令牌",这个令牌实际上就是一个特定的数字,那么令牌环网可以保证只有一个"令牌",在同一时间,只允许一个主机申请这个"令牌",持有"令牌"的主机可以向令牌环网中发送数据,未持有"令牌"的主机不可以向令牌环网中发送数据,即其它未持有"令牌"的主机只能等待持有"令牌"的主机释放"令牌"后它们才可以申请"令牌",处于令牌环网的所有主机都可以接收令牌环网中的数据,当持有"令牌"的主机向令牌环网中完成了数据发送之后,持有"令牌"的主机就会释放"令牌",这时候其它想要在令牌环网中发送数据的主机才可以过来申请"令牌"进行它们的数据发送,这样就保证了同一时间只有一个主机才能在令牌环网(局域网)中发送数据,这样也就不会出现数据碰撞,自然也就可以保障令牌环网(局域网)这个共享资源在同一时刻只能有一个主机发送数据,所以令牌环网这样通过"令牌"的方式实现局域网的方式自然也是没有问题的。

  3. 那么我们此时思考一下,这个令牌环网非常像我们之前学习的什么?没有错,锁,锁的原理是保证共享资源在同一时间只允许一个执行流访问,并且以太网的机制不也就类似于这个锁,以太网通过碰撞检测,碰撞避免算法,同样可以保证以太网在同一时间只允许一个主机发送数据,所以说无论是令牌环网还是以太网其实都是类似于系统中的锁的原理一致,只不过具体的实现方案不同,由此可以看出,网络和系统还是有很多的相通之处的。

十一、IP地址 vs Mac地址

  1. IP 地址工作在网络层 ,是给整个互联网用的 "全局地址",它的核心作用是标识主机在整个网络中的位置,用来完成跨网段、跨路由器的路径选择。而 MAC 地址工作在数据链路层,是给单个局域网用的 "局部地址",它只用来标识局域网内的具体设备,只在当前网段内有效,出了这个网段就没有意义了。

  2. IPv4 地址是4 字节 32 位,格式是点分十进制,比如192.168.2.2,每一段的范围是 0-255;IPv6 地址则扩展到了 16 字节 128 位,用冒号分隔的 8 组十六进制数表示,解决了 IPv4 地址不足的问题。而 MAC 地址固定是6 字节 48 位,用冒号分隔的 6 组十六进制数表示,格式比如52:54:00:6b:82:56,由设备出厂时固化在网卡中。

  3. IP 地址是全程不变 的,源 IP 和目的 IP 从发送主机发出,经过多个路由器转发,到接收主机的整个过程中,都不会被修改。路由器正是靠目的 IP 来判断数据的最终目的地,决定转发路径。而 MAC 地址是逐跳变化的,它只负责当前局域网内的投递:数据从主机发往路由器时,目标 MAC 是路由器的入口网卡地址;路由器转发到下一个网段时,会把原来的 MAC 地址丢弃,重新封装成新的源 MAC(路由器出口网卡)和目标 MAC(下一跳设备),出了当前局域网,MAC 地址就会被完全替换。

  4. IP 地址是 "跨网定位的全局标识",决定数据要去哪个网络、哪台主机,全程不变;MAC 地址是 "局域网内的局部标识",只负责当前链路的下一跳投递,每经过一个网段就会被路由器重新封装替换。

十二、跨网络的数据传输

那么在上面我们了解了局域网中的数据传输,下面我们学习一下两个不同的局域网,即两个子网,即跨网络的数据是如何进行传输的:

在两个不同局域网之间:左侧是以太网,主机 A 的 IP 为192.168.2.2;右侧是令牌环网,主机 B 的 IP 为172.168.2.2。中间通过一台双网卡路由器连接,路由器左侧网卡 IP 为192.168.2.1、MAC 为MAC_left,右侧网卡 IP 为172.168.2.1、MAC 为MAC_right。路由器的核心作用是实现跨网络传输,它同时接入两个局域网,既可以接收左侧以太网的数据,也能向右侧令牌环网转发数据,且支持不同局域网的链路层协议(以太网 / 令牌环网),这要求路由器搭载对应类型的网卡与驱动程序。

发送方主机 A:从上到下的层层封装

主机 A 要向主机 B 发送数据,数据会从应用层到物理层依次封装,每一层添加对应报头:

1. 应用层与传输层:应用层生成原始数据后,传递给传输层,传输层添加包含端口号、序号等信息的传输层报头,形成传输层段,向下交付给网络层。

**2. 网络层(IP 层) :**网络层为传输层段添加 IP 报头,其中源 IP 为192.168.2.2,目标 IP 为172.168.2.2。主机 A 判断目标 IP 不在自身所在的192.168.2.x 网段,因此确定数据需通过路由器转发。

3. 数据链路层:数据链路层添加以太网报头,源 MAC 地址为主机 A 的网卡 MAC地址(MAC_A),目标 MAC 为路由器左侧网卡的 MAC 地址(MAC_left),同时添加链路层尾部校验,封装为完整的以太网帧。

4. 物理层:网卡将以太网帧转换为电信号,发送到以太网中,此时局域网内所有主机都会收到该帧,但仅路由器会匹配目标 MAC 地址。

路由器:解封装与重新封装的转发过程

路由器收到以太网帧后,会完成 "解包 - 路由判断 - 重新封装" 的核心流程:

  1. 左侧接收与解封装:路由器左侧网卡接收以太网信号,还原为以太网帧后,数据链路层剥除以太网报头,取出内部的 IP 数据报,传递给网络层。

  2. 网络层路由判断:路由器解析 IP 报头,发现目标 IP 为172.168.2.2,与自身 IP 不匹配,因此不会向上交付数据,而是查询路由表,确定目标主机位于右侧令牌环网,需转发至该网段。

  3. 右侧重新封装:路由器为 IP 数据报添加令牌环网报头,源 MAC 为自身右侧网卡的 MAC地址 (MAC_right),目标 MAC 为主机 B 的网卡 MAC(MAC_B),封装为令牌环网帧后,通过右侧网卡发送到令牌环网中。

接收方主机 B:从下到上的层层解包

令牌环网中的主机 B 收到数据后,按与封装相反的顺序逐层解包:

**1. 物理层与数据链路层:**主机 B 的网卡接收令牌环网信号,还原为帧后,数据链路层剥除令牌环网报头,取出 IP 数据报,传递给网络层。

**2. 网络层与传输层:**网络层剥除 IP 报头,取出传输层段并传递给传输层;传输层剥除传输层报头,还原出原始应用层数据。

**3. 应用层交付:**最终数据被交付给主机 B 的对应进程,完成跨网络通信。

十三、总结

本文系统介绍了计算机网络的发展历程、核心概念和分层模型。主要内容包括:1. 网络发展历史:从单机孤岛、软盘拷贝到客户端-服务器模式,再到局域网和广域网的演进过程,最终形成全球互联的互联网。2. 远距离传输的四大核心问题:相邻设备通信、主机定位、数据丢失处理和接收方数据处理,分别对应数据链路层、网络层、传输层和应用层的功能。3. 协议的本质:通信双方约定的结构化数据格式,体现为各层的协议头和分用机制,确保数据能被正确解析。4. 分层模型:重点介绍OSI七层模型和实际应用的TCP/IP四层(五层)模型,分析各层的功能及相互关系。5. 网络传输流程:详细说明数据封装、解包和分用的完整过程,以及跨网络通信时路由器的转发机制。6. 局域网通信原理:包括以太网的MAC地址寻址、碰撞检测和令牌环网的工作机制。7. IP地址与MAC地址的区别:IP用于全局寻址,MAC用于本地链路传输。

谢谢大家的观看!

相关推荐
我叫小白菜2 小时前
【Linux】Linux常用命令
linux·运维·服务器
吃着火锅x唱着歌2 小时前
深度探索C++对象模型 学习笔记 第四章 Function语意学(1)
c++·笔记·学习
秋风&萧瑟2 小时前
【Linux系统编程】进程间的通信-管道
linux·服务器·php
BizViewStudio2 小时前
GEO vs SEO vs SEM:2026 年品牌流量获取的三元格局分析
大数据·运维·网络·人工智能·ai
Harvy_没救了2 小时前
【网络运维】CentOS 7 部署 LAMP 与 LNMP 实战指南
运维·网络·centos
酿情师2 小时前
记第一次打春秋云境-Initial 靶场(没打完,记录一下,不是WP!!!)
服务器·网络安全
我的世界洛天依2 小时前
洛天依讲编程:调音教学|调性 ——MIDI 里的「钩子函数」
linux·前端·javascript
Full Stack Developme2 小时前
Hutool File 教程
linux·windows·python
汽车仪器仪表相关领域2 小时前
Kvaser U100:工业级单通道CAN/CAN FD转USB接口,恶劣环境下的可靠通信桥梁
linux·运维·服务器·人工智能·功能测试·单元测试·可用性测试