网络协议栈的位置
用户在应用层的各种请求最终会下达给操作系统,操作系统内除了进程管理、文件管理、内存管理、驱动管理之外,还有一个内嵌的软件协议栈,协议栈将用户的数据进行各种封包后,通过网卡将数据传递到网络当中,数据在网络内部经过各种路由转发,最终将数据传送到了目标服务器。
网络协议栈各部分所处位置:
应用层是位于用户层的。 这部分代码是由网络协议的开发人员来编写的,比如HTTP协议、HTTPS协议以及SSH协议等。
传输层和网络层是位于操作系统层的。 其中传输层最经典的协议叫做TCP协议,网络层最经典的协议叫做IP协议,这就是我们平常所说的TCP/IP协议。
数据链路层是位于驱动层的。 其负责真正的数据传输。
网络协议栈中各层的功能
-
物理层
传输原始比特流(0/1),定义电压、光信号等物理特性。 -
数据链路层
节点间帧传输(如 MAC 地址),错误检测(CRC 校验),控制物理层访问。(负责数据真正的发送过程) -
网络层
IP 地址寻址与路由选择(如路由器跨网络转发数据包)。(发去哪) -
传输层
端到端可靠传输(TCP)或快速传输(UDP),通过端口号区分应用。 -
应用层
为应用程序提供协议(HTTP/FTP/DNS 等),直接处理用户数据 -
层状结构的本质是软件工程上面的解耦,此时层与层之间只有接口的相互调用关系,此时我们就可以让研究不同领域的开发人员编写不同层的代码,最后再将各层的代码联调起来,由于每一层的代码都是对应领域的专业人员编写的,因此代码联调后整体的性能也是很高的。
并且这样的层状结构可以增加代码的可维护性和可扩展性。比如有一天你觉得数据链路层的代码已经无法承担起通信的能力了,那么此时我们就可以用一个新的协议对它进行替换,而其他各层对应的协议都不用换,这就叫做可扩展性。而如果协议栈的某一层出现了问题,我们只要确定了是哪一层出了问题,就可以直接去对应层去找问题,这就叫做代码的可维护性。
MAC 地址
- 定义:唯一标识网络设备的物理地址,固化在网卡中,格式为
00:1A:2B:3C:4D:5E
(6 字节)。- 作用:在局域网(如以太网)中直接定位设备,数据链路层通过 MAC 地址实现设备间帧的精确投递。
- 特点:
- 前 3 字节为厂商标识(由 IEEE 分配),后 3 字节由厂商自定义。
- 用于交换机 / 路由器转发数据时构建 MAC 地址表。
- CRC 校验(循环冗余校验)
- 定义:一种数据链路层的错误检测技术,通过数学算法生成校验码,附加到数据帧尾部。
- 原理:发送方用生成多项式(如 CRC-32)计算数据的余数作为校验值;接收方重新计算并比对,不一致则判定数据损坏。
- 特点:
- 检测能力极强(如 CRC-32 可检测所有≤32 位的突发错误)。
- 仅用于检错,不纠错(发现错误后直接丢弃帧,触发重传)。
#include <iostream>
#include <vector>// 计算 CRC-16 校验值
uint16_t crc16(const std::vector<uint8_t>& data) {const uint16_t polynomial = 0x8005;uint16_t crc = 0xFFFF;for (uint8_t byte : data) {crc ^= static_cast<uint16_t>(byte) << 8;for (int i = 0; i < 8; ++i) {if (crc & 0x8000) {crc = (crc << 1) ^ polynomial;} else {crc <<= 1;}}}return crc;
}int main() {std::vector<uint8_t> data = {0x01, 0x02, 0x03, 0x04};uint16_t result = crc16(data);std::cout << "CRC-16 校验值: 0x" << std::hex << result << std::endl;return 0;
}
不同协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧