【Linux网络】网络传输基本流程
文章目录
- 1. 再识协议
- 1.1 为什么要有TCP/IP协议?
- 1.2 什么是TCP/IP协议?
- 1.3 TCP/IP协议与操作系统的关系(宏观上,怎么实现的)
- 1.4 所以究竟什么是协议?
- 2. 网络传输基本流程
- 2.1 局域网络传输流程图
- 局域网(以太网为例)通信原理
- 认识MAC地址
- 数据包封装和分用
- 2.2 跨网络传输流程图
- 网络中的地址管理 - 认识IP地址
1. 再识协议
上一篇文章中,我们只是懂了⼀些基本概念,还是达不到我们的⽬标,下⾯我们再次重新理解协议和协议分层。
1.1 为什么要有TCP/IP协议?
首先,即便是单机环境,计算机内部各个组件之间也存在着复杂的通信协议体系。这些协议确保了硬件设备之间能够高效、可靠地协同工作。例如:
- 内存通信协议:CPU与内存之间通过特定的总线协议(如DDR4、DDR5)进行数据交换,这些协议规定了时序、带宽和寻址方式等关键参数。
- 存储设备协议:
- SATA(Serial ATA)协议用于连接硬盘和固态硬盘,提供最高6Gbps的传输速率
- IDE(Integrated Drive Electronics)是早期的并行接口标准
- SCSI(Small Computer System Interface)主要用于高性能服务器存储设备
- 新兴的NVMe协议则专门为闪存存储优化,通过PCIe通道提供超高速率
这些协议通常由硬件厂商直接实现,封装在设备控制器中,因此用户几乎感受不到它们的存在。由于通信距离极短(通常在主板范围内),信号衰减和干扰问题较少,通信延迟可以控制在纳秒级别。
而当通信范围扩展到网络环境时,情况发生了根本性变化,说白了就是主机之间的距离变远了,从而会引发新的问题:
- 如何处理数据呢?
- 数据丢了,损坏了等出现问题了怎么办?
- 数据包从源到目的地可能经过无数条路径(路由器、网络),如何找到正确的路?
- 怎么解决数据当下要去哪里的问题?
四个问题,恰好对应了TCP/IP模型从下至上的四层核心功能:
问题 | 对应的核心挑战 | 负责解决的协议层 | 关键机制 |
---|---|---|---|
如何处理数据? | 数据格式化、分段、寻址 | 所有层共同完成 | 封装/解封装 |
数据丢了/坏了怎么办? | 通信可靠性 | 传输层 (TCP) | 校验和、序列号、确认与重传 |
如何定位目标主机? | 全局寻址与路由 | 网络层 (IP) | IP地址、路由器、路由协议 |
数据当下要去哪里? | 本地寻址 | 数据链路层 | MAC地址、ARP协议、交换机 |
可以把TCP/IP协议
想象成一套为“远距离协作”而生的“国际物流体系”:
物理层:就是公路、铁路、海洋这些物理道路。它只负责运输“包裹”(比特流
),不关心里面是什么。
数据链路层:就像每个城市内部的快递站点和邮递员。他们负责在本地(同一个局域网内)根据“门牌号”(MAC地址
)收发包裹。
网络层(IP):就像物流公司的分拣中心。它关心的是全球的“收货地址”(IP地址
)。它决定一个包裹是发往北京还是纽约,并规划出最佳的跨国运输路线(路由)。
传输层(TCP):就像物流公司的客服和保价系统。它确保包裹不丢失(重传)、不损坏(校验)、按顺序(排序) 地送达。如果包裹丢了,客服(TCP
)会协调重新发送一份。
应用层:就是包裹里的具体物品和说明书。比如是一本用英文写的书(HTTP协议
),还是一份用中文写的合同(SMTP协议
)。收件人(应用程序)需要能看懂这份说明书才能处理里面的物品(数据)。
如果没有这套“国际物流体系”(TCP/IP
),你想从中国寄一个包裹到美国,几乎是不可能的:你不知道地址怎么写、路该怎么走、包裹丢了怎么办、对方怎么打开它。
所以,为什么要有TCP/IP协议?本质就是通信主机距离变远了
1.2 什么是TCP/IP协议?
1. TCP/IP协议的本质是一种解决方案
这个“解决方案”的思维体现在:
-
面对现实,不假设完美环境:网络底层(物理层、数据链路层)是不可靠的。电线会受干扰,无线电波会衰减,路由器会拥堵导致丢包。
TCP/IP
没有幻想一个完美的底层,而是在不可靠的基础上,通过上层协议(如TCP)来构建可靠性(重传、校验)。 -
提供通用能力,而非特定功能:
TCP/IP协议栈
本身并不关心你传输的数据是电子邮件、网页还是视频流。它只是提供了传输(TCP/UDP
) 和寻址(IP
) 这两种最基础、最通用的能力。具体用什么数据格式(应用层协议),交给上层的开发者去决定。这就像邮政系统只负责运送包裹,而不关心包裹里是礼物还是文件。 -
解决了“互联”与“互通”:
-
互联(Inter-network):
IP协议
通过统一的地址(IP地址
)和路由规则,将一个个原本孤立的网络(如一个公司的局域网、一个ISP的网络)连接成了“网络的网络”,这就是Internet(因特网)一词的来源。 -
互通(Inter-operation):
TCP/UDP协议
确保了不同操作系统(Windows, Linux, macOS
)上的不同应用程序,能够基于相同的规则理解彼此发送的数据流。
-
2. TCP/IP协议能分层,前提是因为问题们本身能分层
分层不是凭空想出来的,而是因为通信中面临的问题本身就是有层次、有界限的。
我们可以将复杂的通信问题自顶向下地分解:
1. 应用问题:我的微信要怎么才能收到朋友发来的消息?
- 解决方案:需要定义应用层协议(如自定义的聊天消息格式),规定数据的内容和意义。
2. 可靠性问题:确保消息完整、按顺序送达,不会丢了一半或乱序。
- 解决方案:需要传输层协议(如TCP)来解决,提供重传、排序、流量控制。
3. 寻路问题:我的消息在中国,朋友在美国,网络道路千万条,究竟该走哪一条才能送到?
- 解决方案:需要网络层协议(IP)来解决,提供全局寻址和路由。
4. 本地问题:消息已经到了朋友家的路由器,最后一步怎么准确找到他正在玩手机的Wi-Fi网卡?
- 解决方案:需要数据链路层协议(如以太网)来解决,用MAC地址在本地网络进行标识和投递。
5. 物理问题:如何在网线/光纤/空气中,用物理信号(光、电、电磁波) 把表示0和1的比特流传出去?
- 解决方案:物理层协议,定义电压、光强、频率、引脚定义等。
每一层都专门解决一个特定范畴的问题,并且只与它的相邻层打交道。
1.3 TCP/IP协议与操作系统的关系(宏观上,怎么实现的)
两个不同的主机(操作系统不同,可能你是Linux,对方是Windows)远距离通信时,你们俩都不是一个结构的,实现方式都不同,怎么能通信呢?
所以就需要相同的通信标准,这个相同的标准就是网络协议栈,而两个主机通信的本质就是两个网络协议栈在通信,网络协议栈的核心又是TCP/IP协议
,所以我们将这个协议整体称为TCP/IP协议
1.4 所以究竟什么是协议?
目前我们尚未接触具体协议,但是如何朴素的理解协议,我们已经可以试试了。
我们知道,OS源代码一般都是用C/C++语言写的。
下面,仔细看看下图:
📌 问题:主机B能识别data,并且准确提取a=10,b=20,c=30吗?
回答:答案是肯定的!因为双⽅都有同样的结构体类型struct protocol。也就是说,用同样的代码实现协议,用同样的自定义数据类型,天然就具有”共识“,能够识别对方发来的数据,这不就是约定吗?
关于协议的朴素理解:所谓协议,就是通信双方都认识的结构化的数据类型
因为协议栈是分层的,所以,每层双方都有协议,同层之间,互相可以认识对方的协议。
2. 网络传输基本流程
2.1 局域网络传输流程图
局域网通信标准有:以太网,令牌环网,无线LAN
局域网(以太网为例)通信原理
1. 两台主机在同一个局域网,是否能够直接通信?
答案是:是的,完全可以直接通信。
这是局域网最根本的特性。它们之间的通信不需要经过路由器(除非有特殊策略),就像在同一个教室里的两个人可以直接对话,不需要通过邮局寄信。
2. 通信原理(以太网为例)——“原理类似上课”
我们可以把一个局域网(比如一个Wi-Fi网络)想象成一个教室。
-
物理媒介:教室里的空气(对应网线、无线电波)。
-
通信规则:想要说话的人需要遵守课堂纪律,比如不能所有人同时大喊大叫(对应以太网的CSMA/CD或Wi-Fi的CSMA/CA载波侦听多路访问/冲突避免机制)。
通信过程就像一次课堂提问:
想通信:主机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地址
MAC地址(Media Access Control Address)是数据链路层唯一标识网络上的每个设备。它用于在同一本地网络段(即同一个广播域,如连接在同一个交换机下的所有设备)中,实现设备间的直接通信。
长度:48位(6字节),通常表示为16进制数,用冒号或连字符分隔(例如:08:00:27:03:fb:19 或 08-00-27-03-fb-19)。
结构:
-
前24位(前3个字节):组织唯一标识符 (OUI - Organizationally Unique Identifier)。由IEEE统一分配给特定的制造商(如华为、英特尔、思科)。通过OUI可以查询到网卡的制造商。
-
后24位(后3个字节):网络接口控制器特定标识符。由各个制造商自行分配,确保其生产的每个网卡的MAC地址都是唯一的。
特性和管理
-
全球唯一(理论上):通过OUI+制造商自行分配的机制,保证了MAC地址的全球唯一性。
-
烧录地址:通常在生产时就被固化在网卡的硬件中,因此也称为烧录地址 (BIA - Burned-In Address)。这是默认的MAC地址。
-
可更改性(实践中):特殊情况:
-
虚拟机:虚拟网卡的MAC地址由虚拟化软件生成,并非物理烧录,因此有可能冲突(但好的软件会管理以避免冲突)。
-
用户配置:大多数操作系统允许用户软件覆盖这个烧录地址,称为“MAC地址克隆”或“ spoofing(欺骗)”。这在某些网络需要MAC白名单或绕过一些认证时很有用。但设备本身的物理MAC地址并没有改变,改变的是系统当前使用的逻辑MAC地址。
-
查看方法
-
Windows:在命令提示符中使用
ipconfig /all
命令。在物理地址 (Physical Address) 一栏查看。 -
Linux/macOS:在终端中使用
ifconfig 或 ip addr show
命令。
关于MAC帧协议的具体内容将在后续讲解数据链路层时深入讨论
注意:
- 以太网中,任何时刻,只允许一台机器向网络中发送数据
- 如果有多台机器同时向网络中发送数据,会发生数据干扰,我们称为数据碰撞
- 所有发送数据的主机要进行碰撞检测和碰撞避免
- 没有交换机的情况下,一个以太网就是一个碰撞域
- 局域⽹通信的过程中,主机对收到的报文确认是否是发给自己的,是通过目标mac地址判定
这里可以试着从系统角度来理解局域网通信原理:
说白了以太网就是一个共享的资源,也就是临界资源,那每个主机就需要互斥访问
初步明白了局域网通信原理,再来看同一个网段内的两台主机进行发送消息的过程
而其中每层都有协议,同时在上文中我们已经知道了,每一层都专门解决一个特定范畴的问题,并且只与它的相邻层打交道,而不需要了解其他层的具体实现细节,所以当我进行上述传输流程的时候,要进行封装和解包
下面我们明确一下概念
- 报头部分,就是对应协议层的结构体字段,我们一般叫做报头
- 除了报头,剩下的叫做有效载荷
- 因此,报文 = 报头 + 有效载荷
然后,我们在明确一下不同层的完整报文的叫法
- 不同的协议层对数据包有不同的称谓,在传输层叫做
段(segment)
,在网络层叫做数据报(datagram)
,在链路层叫做帧(frame)
- 数据封装流程:
- 应用层数据在通过协议栈传输时,每层协议都会添加一个
数据首部(header)
,这个过程称为封装(Encapsulation)
- 首部包含诸如首部长度、载荷长度以及上层协议类型等关键信息
- 封装后的帧通过传输介质到达目标主机后,各层协议会依次剥离对应首部,并根据首部中的"上层协议字段"将数据传递给相应的上层协议进行处理
最后,再整体复盘一下:
在网络通信过程中,数据并非直接传输到目标主机。首先,数据会按照协议层级自上而下逐层封装,通过底层协议完成实际传输。接收方的主机则按照相反顺序,从底层开始自下而上逐步解封,最终将数据交付给目标应用。
其实我们仔细观察可以看出,整个网络协议栈的封装和解包的过程,其实就是与我们数据结构栈的入栈和出栈的过程是一样的
数据包封装和分用
下图为数据封装的过程
下图为数据分用的过程
📌 从今天开始,我们学习任何协议,都要先宏观上建立这样的认识:
- 要学习的协议,是如何做到解包的?只有明确了解包,封包也就能理解
- 要学习的协议,是如何做到将自己的有效载荷,交付给上层协议的?
关于上面的问题我们在后文会详细展开讨论
所以,为什么要自顶向下封装呢?因为我们要贯穿整个操作系统,贯穿整个协议栈,数据是通过网卡发出去的,而操作系统就是硬件(网卡)的管理者
2.2 跨网络传输流程图
网络中的地址管理 - 认识IP地址
IP 协议有两个版本,,IPv4 和 IPv6 。我们整个的专栏,凡是提到IP协议,没有特殊说明的,默认都是指 IPv4,这是目前互联网上最广泛使用的协议,不过IPv6的普及也正在加速推进,尤其在中国发展迅速
-
IP 地址是 IP 协议中用于唯一标识网络中不同主机的逻辑地址
-
对于 IPv4 地址来说:
- 长度为 32 位(4字节)的二进制数
- 理论上可以提供约 42.9 亿(2^32)个地址空间
- 采用"点分十进制"表示法,将每8位二进制数转换为0-255的十进制数
-
转换示例:
- 二进制:11000000 10101000 00000000 00000001
- 点分十进制:192.168.0.1
- 计算:11000000 = 192, 10101000 = 168, 00000000 = 0, 00000001 = 1。
跨网络传输时,数据从一台计算机到另一台计算机传输过程中要经过一个或多个路由器
下面是一张示意图:
注意:
- 上图中的以太网和令牌环网是两个不同的局域网通信标准,令牌环网采用令牌传递机制,就相当于一个只有一支麦克风的会议,谁拿到麦克风(令牌)谁才能发言(发送数据),然后将麦克风(令牌)传递给下一位,这其实就是一种同步机制
- 路由器不仅仅在网络层工作,它也离不开数据链路层和物理层,甚至当代路由器功能已经扩展至传输层和应用层
首先理解一下IP地址的意义
IP地址不仅仅是主机的标识符,它更核心的意义是定位主机所在的网络。
- 为什么要去目标主机,先要走路由器?
- 目的IP的意义
如下图:
1. 网络结构与设备
-
左侧是用户A所在的局域网(IP段为 192.168.2.x),包含用户A(IP:192.168.2.2)和其他主机(如 192.168.2.3、192.168.2.4 等);
-
中间是路由器,其左右两侧网卡分别属于不同网段:左侧网卡IP为 192.168.2.1(与用户A同网段),右侧网卡IP为 172.168.2.1(与用户B同网段);
-
右侧是用户B所在的局域网(IP段为 172.168.2.x),用户B的IP为 172.168.2.2。
2. 数据传输的分层流程(以用户A发送“你好”为例)
-
应用层:用户A的应用层产生“你好”这一数据,交付给传输层;
-
传输层:传输层对数据进行封装(如添加源/目的端口信息),交付给网络层;
-
网络层:网络层判断目标IP 172.168.2.2 不在自身局域网(192.168.2.x)内,因此将数据包的 源IP设为自身IP(192.168.2.2) 、 目的IP设为用户B的IP(172.168.2.2) ,并交付给数据链路层;
-
数据链路层:数据链路层封装 源MAC地址(用户A网卡MAC:macA) 和 目的MAC地址(路由器左侧网卡MAC) ,形成帧后通过网卡发送到局域网;
-
路由器转发:路由器左侧网卡收到帧后,解封装到网络层,发现目的IP 172.168.2.2 属于右侧网段,因此重新封装数据链路层帧(源MAC改为路由器右侧网卡MAC,目的MAC改为用户B网卡MAC),通过右侧网卡发送到用户B所在局域网;
-
用户B接收:用户B的网卡收到帧后,逐层解封装(数据链路层→网络层→传输层→应用层),最终将“你好”交付给用户B的应用层。
所以
1, 路由器的作用就是“根据IP地址中的网络部分,决定数据包该往哪个方向走下一跳”
2. 目的IP地址的存在,就是为了解决“如何找到目标主机所在的网络”这个问题。
然后结合封装与解包,体现路由器解包和重新封装的特点
所以,网络层的数据报都是相同的,而MAC地址是硬件层使用的,是一直在变的
MAC地址和IP地址的区别
我们用一个比喻来解释:快递过程
想象一下你要从北京寄一个包裹给上海的一个人。
1. IP地址 (最终地址):
-
包裹上写的 【上海市浦东新区XX路XX号,张三收】 就是IP地址。
-
这个最终目标地址在整个运输过程中是永远不会变的。它指明了包裹的最终目的地。
2. MAC地址 (下一站地址):
-
北京的快递小哥从你家取走包裹,快递单上写着 “下一站:北京集散中心”。这个“北京集散中心”就是MAC地址。
-
包裹到了北京集散中心,分拣员看了看最终地址是上海,于是把它装上去往上海的车,并贴上新标签 “下一站:上海集散中心”。MAC地址改变了。
-
包裹到了上海集散中心,分拣员发现地址在浦东,于是又贴上 “下一站:浦东站点”。MAC地址又改变了。
-
最后,浦东的快递员根据最终地址(IP地址)找到具体门牌号,把包裹送给了张三。
在这个比喻中:
-
路由器就是各个快递集散中心。
-
IP地址
(上海)是最终目标,全程不变。 -
MAC地址
(北京中心->上海中心->浦东站点)是下一站的中转地址,每经过一个路由器(集散中心)都会改变。
结论
IP地址
负责宏观的、全局的、逻辑上的寻址,在传输过程中不变,决定了数据的最终目的地。MAC地址
负责微观的、本地的、物理上的寻址,每经过一个网络设备都会改变,决定了数据的下一站。
目的IP是一种长远目标,Mac是下一阶段目标,目的IP是路径选择的重要依据,mac地址是局域网转发的重要依据
最后,提炼IP网络的意义和网络通信的宏观流程
IP网络层
存在的意义:提供网络虚拟层,让世界的所有网络都是 IP 网络
,屏蔽最底层网络的差异