上一篇文章中,我们只是懂了⼀些基本概念,还是达不到我们的⽬标,下⾯我们再次重新理解协议和协议分层。
首先,即便是单机环境,计算机内部各个组件之间也存在着复杂的通信协议体系。这些协议确保了硬件设备之间能够高效、可靠地协同工作。例如:
这些协议通常由硬件厂商直接实现,封装在设备控制器中,因此用户几乎感受不到它们的存在。由于通信距离极短(通常在主板范围内),信号衰减和干扰问题较少,通信延迟可以控制在纳秒级别。
而当通信范围扩展到网络环境时,情况发生了根本性变化,说白了就是主机之间的距离变远了,从而会引发新的问题:
四个问题,恰好对应了TCP/IP模型从下至上的四层核心功能:
问题 | 对应的核心挑战 | 负责解决的协议层 | 关键机制 |
|---|---|---|---|
如何处理数据? | 数据格式化、分段、寻址 | 所有层共同完成 | 封装/解封装 |
数据丢了/坏了怎么办? | 通信可靠性 | 传输层 (TCP) | 校验和、序列号、确认与重传 |
如何定位目标主机? | 全局寻址与路由 | 网络层 (IP) | IP地址、路由器、路由协议 |
数据当下要去哪里? | 本地寻址 | 数据链路层 | MAC地址、ARP协议、交换机 |

可以把TCP/IP协议想象成一套为“远距离协作”而生的“国际物流体系”:
物理层:就是公路、铁路、海洋这些物理道路。它只负责运输“包裹”(比特流),不关心里面是什么。
数据链路层:就像每个城市内部的快递站点和邮递员。他们负责在本地(同一个局域网内)根据“门牌号”(MAC地址)收发包裹。
网络层(IP):就像物流公司的分拣中心。它关心的是全球的“收货地址”(IP地址)。它决定一个包裹是发往北京还是纽约,并规划出最佳的跨国运输路线(路由)。
传输层(TCP):就像物流公司的客服和保价系统。它确保包裹不丢失(重传)、不损坏(校验)、按顺序(排序) 地送达。如果包裹丢了,客服(TCP)会协调重新发送一份。
应用层:就是包裹里的具体物品和说明书。比如是一本用英文写的书(HTTP协议),还是一份用中文写的合同(SMTP协议)。收件人(应用程序)需要能看懂这份说明书才能处理里面的物品(数据)。
如果没有这套“国际物流体系”(TCP/IP),你想从中国寄一个包裹到美国,几乎是不可能的:你不知道地址怎么写、路该怎么走、包裹丢了怎么办、对方怎么打开它。
所以,为什么要有TCP/IP协议?本质就是通信主机距离变远了
1. TCP/IP协议的本质是一种解决方案
这个“解决方案”的思维体现在:
TCP/IP没有幻想一个完美的底层,而是在不可靠的基础上,通过上层协议(如TCP)来构建可靠性(重传、校验)。
TCP/IP协议栈本身并不关心你传输的数据是电子邮件、网页还是视频流。它只是提供了传输(TCP/UDP) 和寻址(IP) 这两种最基础、最通用的能力。具体用什么数据格式(应用层协议),交给上层的开发者去决定。这就像邮政系统只负责运送包裹,而不关心包裹里是礼物还是文件。
IP协议通过统一的地址(IP地址)和路由规则,将一个个原本孤立的网络(如一个公司的局域网、一个ISP的网络)连接成了“网络的网络”,这就是Internet(因特网)一词的来源。
TCP/UDP协议确保了不同操作系统(Windows, Linux, macOS)上的不同应用程序,能够基于相同的规则理解彼此发送的数据流。
2. TCP/IP协议能分层,前提是因为问题们本身能分层
分层不是凭空想出来的,而是因为通信中面临的问题本身就是有层次、有界限的。
我们可以将复杂的通信问题自顶向下地分解:
1. 应用问题:我的微信要怎么才能收到朋友发来的消息?
2. 可靠性问题:确保消息完整、按顺序送达,不会丢了一半或乱序。
3. 寻路问题:我的消息在中国,朋友在美国,网络道路千万条,究竟该走哪一条才能送到?
4. 本地问题:消息已经到了朋友家的路由器,最后一步怎么准确找到他正在玩手机的Wi-Fi网卡?
5. 物理问题:如何在网线/光纤/空气中,用物理信号(光、电、电磁波) 把表示0和1的比特流传出去?
每一层都专门解决一个特定范畴的问题,并且只与它的相邻层打交道。
两个不同的主机(操作系统不同,可能你是Linux,对方是Windows)远距离通信时,你们俩都不是一个结构的,实现方式都不同,怎么能通信呢?
所以就需要相同的通信标准,这个相同的标准就是网络协议栈,而两个主机通信的本质就是两个网络协议栈在通信,网络协议栈的核心又是TCP/IP协议,所以我们将这个协议整体称为TCP/IP协议

目前我们尚未接触具体协议,但是如何朴素的理解协议,我们已经可以试试了。 我们知道,OS源代码一般都是用C/C++语言写的。
下面,仔细看看下图:

📌 问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗? 回答:答案是肯定的!因为双⽅都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗? 关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型 因为协议栈是分层的,所以,每层双方都有协议,同层之间,互相可以认识对方的协议。
局域网通信标准有:以太网,令牌环网,无线LAN
1. 两台主机在同一个局域网,是否能够直接通信?
答案是:是的,完全可以直接通信。 这是局域网最根本的特性。它们之间的通信不需要经过路由器(除非有特殊策略),就像在同一个教室里的两个人可以直接对话,不需要通过邮局寄信。
2. 通信原理(以太网为例)——“原理类似上课”
我们可以把一个局域网(比如一个Wi-Fi网络)想象成一个教室。
通信过程就像一次课堂提问:
想通信:主机A(比如你的电脑)想给主机B(比如同一Wi-Fi下的网络打印机)发送数据。
喊名字(寻址):主机A不会直接发送数据,而是先大声地向整个教室广播(Broadcast) 一个问题:“请问IP地址是192.168.1.5(主机B)的MAC地址是什么?” 这个过程就是ARP(地址解析协议)。
认领:教室里所有主机都听到了,但只有IP地址是192.168.1.5的主机B会站起来(响应)说:“是我!我的MAC地址是 XX:XX:XX:XX:XX:XX”。这个回应是单独对主机A说的(单播Unicast)。
传递纸条(数据传输):现在主机A知道了主机B的“学号”(MAC地址)。它就可以把要发送的数据包封装好,在包的首部写上目标MAC地址(主机B的地址) 和源MAC地址(自己的地址),然后递给“班长”(交换机)。
班长分发(交换机转发):“班长”(交换机)有一个花名册,记录着每个“同学”(主机)的“学号”(MAC地址)和坐在哪个位置(端口号)。它看到纸条(数据帧)上是给主机B的,就只会把它递到主机B的座位上(从对应的端口转发出去),不会打扰其他同学。
接收处理:主机B收到纸条,打开一看,是主机A发来的数据,于是开始处理。
整个过程的关键是:数据是在“教室”(局域网)内部直接传递的,没有经过“校长”(路由器)。
3. 唯一标识:MAC地址
MAC地址(Media Access Control Address),也叫物理地址、硬件地址,就是局域网中设备的唯一、永久的身份证号。
MAC地址(Media Access Control Address)是数据链路层唯一标识网络上的每个设备。它用于在同一本地网络段(即同一个广播域,如连接在同一个交换机下的所有设备)中,实现设备间的直接通信。
长度:48位(6字节),通常表示为16进制数,用冒号或连字符分隔(例如:08:00:27:03:fb:19 或 08-00-27-03-fb-19)。
结构:
特性和管理
查看方法
ipconfig /all 命令。在物理地址 (Physical Address) 一栏查看。
ifconfig 或 ip addr show 命令。
关于MAC帧协议的具体内容将在后续讲解数据链路层时深入讨论

注意:
这里可以试着从系统角度来理解局域网通信原理:
说白了以太网就是一个共享的资源,也就是临界资源,那每个主机就需要互斥访问
初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程

而其中每层都有协议,同时在上文中我们已经知道了,每一层都专门解决一个特定范畴的问题,并且只与它的相邻层打交道,而不需要了解其他层的具体实现细节,所以当我进行上述传输流程的时候,要进行封装和解包

下面我们明确一下概念

然后,我们在明确一下不同层的完整报文的叫法
段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)数据首部(header),这个过程称为封装(Encapsulation)最后,再整体复盘一下:

在网络通信过程中,数据并非直接传输到目标主机。首先,数据会按照协议层级自上而下逐层封装,通过底层协议完成实际传输。接收方的主机则按照相反顺序,从底层开始自下而上逐步解封,最终将数据交付给目标应用。
其实我们仔细观察可以看出,整个网络协议栈的封装和解包的过程,其实就是与我们数据结构栈的入栈和出栈的过程是一样的
下图为数据封装的过程

下图为数据分用的过程

📌 从今天开始,我们学习任何协议,都要先宏观上建立这样的认识:
关于上面的问题我们在后文会详细展开讨论
所以,为什么要自顶向下封装呢?因为我们要贯穿整个操作系统,贯穿整个协议栈,数据是通过网卡发出去的,而操作系统就是硬件(网卡)的管理者
IP 协议有两个版本,,IPv4 和 IPv6 。我们整个的专栏,凡是提到IP协议,没有特殊说明的,默认都是指 IPv4,这是目前互联网上最广泛使用的协议,不过IPv6的普及也正在加速推进,尤其在中国发展迅速
跨网络传输时,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
下面是一张示意图:

注意:
首先理解一下IP地址的意义
IP地址不仅仅是主机的标识符,它更核心的意义是定位主机所在的网络。
如下图:

1. 网络结构与设备
2. 数据传输的分层流程(以用户A发送“你好”为例)
所以
1, 路由器的作用就是“根据IP地址中的网络部分,决定数据包该往哪个方向走下一跳” 2. 目的IP地址的存在,就是为了解决“如何找到目标主机所在的网络”这个问题。
然后结合封装与解包,体现路由器解包和重新封装的特点

所以,网络层的数据报都是相同的,而MAC地址是硬件层使用的,是一直在变的
MAC地址和IP地址的区别
我们用一个比喻来解释:快递过程
想象一下你要从北京寄一个包裹给上海的一个人。
1. IP地址 (最终地址):
2. MAC地址 (下一站地址):
在这个比喻中:
IP地址(上海)是最终目标,全程不变。
MAC地址(北京中心->上海中心->浦东站点)是下一站的中转地址,每经过一个路由器(集散中心)都会改变。
结论
IP地址负责宏观的、全局的、逻辑上的寻址,在传输过程中不变,决定了数据的最终目的地。MAC地址负责微观的、本地的、物理上的寻址,每经过一个网络设备都会改变,决定了数据的下一站。目的IP是一种长远目标,Mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据
最后,提炼IP网络的意义和网络通信的宏观流程

IP网络层存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络,屏蔽最底层网络的差异