当前位置: 首页 > 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),在链路层叫做帧

      相关文章:

    • 农资出入库登记本,农药化肥库存出入库软件,佳易王农资管理庄稼医院开单管理系统操作教程
    • Java字节码
    • C++类与对象——拷贝构造与运算符重载
    • 【论文阅读】AlexNet——深度学习奠基作之一
    • 笔记本 Win10 部署阿里通义千问 1.5-0.5B 大模型 mini 版
    • nvm安装node失败的处理方法
    • hevc视频编码-搜索窗口和快速搜索
    • Project回调函数qsort②进阶应用
    • C++学习之路,从0到精通的征途:类和对象(中)
    • gdal-linux-whl文件安装下载地址
    • 常用的Python库
    • 【时延】空口资源计算
    • 5G核心网实训室搭建方案:轻量化部署与虚拟化实践
    • 京瓷初期的按职能划分的组织
    • k8s系统学习路径
    • Next.js项目MindAI教程 - 第四章:用户认证系统
    • Modbus RTU转DeviceNet构建AB 1756-DNB PLC与电能表的冗余通信链路
    • 【八股文】ArrayList和LinkedList的区别
    • 如何用AI制作PPT,轻松实现高效演示
    • Windows 11 安装Docker Desktop环境
    • 探索演艺产业新路径,2万观众走进音乐科技融创节
    • 柳州警方通报临牌车撞倒行人:扣留涉事车辆,行人无生命危险
    • 秦洪看盘|浮现新预期,存量资金积极调仓
    • 格力电器去年净利增长一成:消费电器营收下滑4%,一季度净利增长26%
    • 文旅部:推动离境退税购物便利化有利于更多国内优质商品走出去
    • 我国核电总体规模首次跃居世界第一,发电量持续增长