当前位置: 首页 > news >正文

网络协议栈

网络协议栈的位置

用户在应用层的各种请求最终会下达给操作系统,操作系统内除了进程管理、文件管理、内存管理、驱动管理之外,还有一个内嵌的软件协议栈,协议栈将用户的数据进行各种封包后,通过网卡将数据传递到网络当中,数据在网络内部经过各种路由转发,最终将数据传送到了目标服务器。

网络协议栈各部分所处位置:

应用层是位于用户层的。 这部分代码是由网络协议的开发人员来编写的,比如HTTP协议、HTTPS协议以及SSH协议等。
传输层和网络层是位于操作系统层的。 其中传输层最经典的协议叫做TCP协议,网络层最经典的协议叫做IP协议,这就是我们平常所说的TCP/IP协议。
数据链路层是位于驱动层的。 其负责真正的数据传输。

网络协议栈中各层的功能

  1. 物理层
    传输原始比特流(0/1),定义电压、光信号等物理特性。

  2. 数据链路层
    节点间帧传输(如 MAC 地址),错误检测(CRC 校验),控制物理层访问。(负责数据真正的发送过程)

  3. 网络层
    IP 地址寻址与路由选择(如路由器跨网络转发数据包)。(发去哪)

  4. 传输层
    端到端可靠传输(TCP)或快速传输(UDP),通过端口号区分应用。

  5. 应用层
    为应用程序提供协议(HTTP/FTP/DNS 等),直接处理用户数据

    • 层状结构的本质是软件工程上面的解耦,此时层与层之间只有接口的相互调用关系,此时我们就可以让研究不同领域的开发人员编写不同层的代码,最后再将各层的代码联调起来,由于每一层的代码都是对应领域的专业人员编写的,因此代码联调后整体的性能也是很高的。

      并且这样的层状结构可以增加代码的可维护性和可扩展性。比如有一天你觉得数据链路层的代码已经无法承担起通信的能力了,那么此时我们就可以用一个新的协议对它进行替换,而其他各层对应的协议都不用换,这就叫做可扩展性。而如果协议栈的某一层出现了问题,我们只要确定了是哪一层出了问题,就可以直接去对应层去找问题,这就叫做代码的可维护性。

      1. 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),在链路层叫做帧


      http://www.mrgr.cn/news/94568.html

      相关文章:

    • 【动态规划】- 线性dp
    • SSO单点登录
    • 011【fate/extra link】【概率论与数理统计】大数定律与中心极限定理 ,数理统计的基本概念,常用的统计三大分布,正态总体的抽样分布定理
    • 理解C++值类别(lvalue, rvalue, prvalue, xvalue)
    • 【C++】—— 一篇文章解决面试 继承菱形继承
    • 深入理解Linux网络随笔(七):容器网络虚拟化--Veth设备对
    • 共享内存通信效率碾压管道?System V IPC原理与性能实测
    • Lora本地微调实战 --deepseek-r1蒸馏模型
    • 代码随想录刷题有感
    • SpringMVC (二)请求处理
    • Go语言对于MySQL的基本操作
    • 【后端开发面试题】每日 3 题(十三)
    • 图解AUTOSAR_CP_BSW_General
    • Python软件和搭建运行环境
    • [多线程]基于单例懒汉模式的线程池的实现
    • Centos7使用docker搭建redis集群
    • Java 大视界 -- Java 大数据中的异常检测算法在工业物联网中的应用与优化(133)
    • Linux 命令学习记录
    • C++基础 [三] - 面向对象三
    • Java 大视界 -- Java 大数据在智能金融资产定价与风险管理中的应用(134)