计算机网络(基础篇)

TCP/IP 网络模型

应用层(Application Layer)

应用层只需要专注于为用户提供应用功能,比如 HTTP、FTP、Telnet、DNS、SMTP等。

应用层是工作在操作系统中的用户态,传输层及以下则工作在内核态。

传输层(Transport Layer)

应用层的数据包会传给传输层,传输层是为应用层提供网络支持的。

传输层只需要服务好应用即可,它作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层。

在这里插入图片描述

TCP

  • TCP 的全称叫传输控制协议(Transmission Control Protocol)。大部分应用使用的正是 TCP 传输层协议,比如 HTTP 应用层协议。
  • TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。

UDP

  • UDP全称叫用户数据报协议(User Datagram Protocol)。
  • UDP 只负责发送数据包,不保证数据包是否能抵达对方,但它实时性相对更好,传输效率也高。

TCP 段(TCP Segment)

当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,这样即使中途有一个分块丢失或损坏了,只需要重新发送这一个分块,而不用重新发送整个数据包,在 TCP 协议中,我们把每个分块称为一个 TCP 段。

在这里插入图片描述

端口

当设备作为接收方时,传输层则要负责把数据包传给应用,但是一台设备上可能会有很多应用在接收或者传输数据,因此需要用一个编号将应用区分开来,这个编号就是端口。

由于传输层的报文中会携带端口号,因此接收方可以识别出该报文是发送给哪个应用。

网络层(Internet Layer)

  • 传输层只需要服务好应用即可,它作为应用间数据传输的媒介,帮助实现应用到应用的通信,而实际的传输功能就交给下一层,也就是网络层。

在这里插入图片描述

IP 协议(Internet Protocol)

IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。

在这里插入图片描述

IP 地址

网络层负责将数据从一个设备传输到另一个设备,设备有很多,因此网络层需要有区分设备的编号,一般用 IP 地址给设备进行编号。

IP 地址分成两种意义:

  • 一个是网络号,负责标识该 IP 地址是属于哪个「子网」 的。
  • 一个是主机号,负责标识同一「子网」下的不同主机;

在寻址的过程中,先匹配到相同的网络号(表示要找到同一个子网),才会去找对应的主机。

子网掩码

需要配合子网掩码才能算出 IP 地址的网络号和主机号。

  • 比如 10.100.122.0/24,后面的 /24 表示就是 255.255.255.0 子网掩码.
  • 255.255.255.0 二进制是「11111111-11111111-11111111-00000000」, 24 个1,为了简化子网掩码的表示,用 /24 代替 255.255.255.0。

计算网络地址和主机地址

  • 将IP地址和子网掩码进行按位与运算,就可以得到网络号。
    在这里插入图片描述
  • 将子网掩码取反后与IP地址进行进行按位与运算,就可以得到主机号。

路由

  • 当数据包到达一个网络节点,需要通过路由算法决定下一步走哪条路径。
  • 路由器寻址工作中,就是要找到目标地址的子网,找到后进而把数据包转发给对应的网络内。

在这里插入图片描述

IP寻址 vs 路由

  • IP 协议的寻址作用是告诉去往下一个目的地该朝哪个方向走
  • 路由则是根据「下一个目的地」选择路径
  • 寻址更像在导航,路由更像在操作方向盘

网络接口层(Link Layer)

生成了 IP 头部之后, 网络接口层在 IP 头部的前面加上 MAC 头部,并封装成
数据帧(Data frame)
发送到网络上。

网络接口层主要为网络层提供 「链路级别」传输 的服务,负责在以太网、WiFi 这样的底层网络上发送原始数据包,工作在网卡这个层次,使用 MAC 地址来标识网络上的设备。

在这里插入图片描述

以太网

以太网就是一种在「局域网」内,把附近的设备连接起来,使它们之间可以进行通讯的技术。

  • 以太网在判断网络包目的地时和 IP 的方式不同,必须采用相匹配的方式才能在以太网中将包发往目的地,以太网进行通讯要用到 MAC 地址。

  • MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。可以通过 ARP 协议获取对方的 MAC 地址。

总结

TCP/IP 网络通常是由上到下分成 4 层,分别是应用层,传输层,网络层和网络接口层。

在这里插入图片描述

每一层的封装格式

在这里插入图片描述

  • 网络接口层 的传输单位是 帧(frame)
  • IP 层 的传输单位是 包(packet)
  • TCP 层 的传输单位是 段(segment)
  • HTTP 的传输单位则是 消息或报文(message)

这些名词并没有什么本质的区分,可以统称为数据包。

HTTP

1. 解析URL

  • 浏览器做的第一步工作是解析 URL, 从而生成发送给 Web 服务器的请求信息。
  • URL 实际上是请求服务器里的文件资源。

在这里插入图片描述

2. 生产 HTTP 请求信息

对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 HTTP 请求消息了。

在这里插入图片描述

DNS(真实地址查询)

查询服务器域名对应的 IP 地址

  • 通过浏览器解析 URL 并生成 HTTP 消息后,需要委托操作系统将消息发送给 Web 服务器。

委托操作系统发送消息时,必须提供通信对象的 IP 地址。

DNS 服务器,专门保存 Web 服务器域名与 IP 的对应关系。

域名的层级关系

  • DNS 中的域名都是用句点来分隔的,比如 www.server.com,这里的句点代表了不同层次之间的界限, 最后的一个点代表根域名。
  • 在域名中,越靠右的位置表示其层级越高。

域名的层级关系类似一个树状结构:

  • 根 DNS 服务器(.)
  • 顶级域 DNS 服务器(.com)
  • 权威 DNS 服务器(server.com)
    在这里插入图片描述

域名解析的工作流程

  • 浏览器会先看自身有没有对这个域名的缓存,

    • 如果有,就直接返回
    • 如果没有,就去问操作系统
  • 操作系统也会去看自己的缓存,

    • 如果有,就直接返回
    • 如果没有,再去 hosts 文件看
  • hosts 文件也没有,才会去问 「本地DNS 服务器」 。
    在这里插入图片描述

DNS 域名解析的过程,只指路不带路。

协议栈

通过 DNS 获取到 IP 后,就可以把 HTTP 的传输工作交给操作系统中的协议栈。

在这里插入图片描述

IP 中还包括 ICMP 协议和 ARP 协议:

  • ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
  • ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。

TCP(可靠传输)

HTTP 是基于 TCP 协议传输的。

TCP 包头格式

在这里插入图片描述

状态位:SYN 是发起一个连接,ACK 是回复,RST 是重新连接,FIN 是结束连接

TCP 三次握手

在 HTTP 传输数据之前,首先需要 TCP 建立连接,TCP 连接的建立,通常称为三次握手。

在这里插入图片描述

三次握手目的是保证双方都有发送和接收的能力。

TCP 连接状态

在这里插入图片描述

TCP 分割数据

在这里插入图片描述

在这里插入图片描述

TCP 报文生成

TCP 协议里面会有两个端口,

  • 一个是浏览器监听的端口(通常是随机生成的)
  • 一个是 Web 服务器监听的端口(HTTP 默认端口号是 80, HTTPS 默认端口号是 443)

在双方建立了连接后,TCP 报文中的数据部分就是存放 HTTP 头部 + 数据,组装好 TCP 报文之后,就需交给下面的网络层处理。

网络包的报文:

在这里插入图片描述

IP (远程定位)

TCP 模块在执行连接、收发、断开等各阶段操作时,都需要委托 IP 模块将数据封装成网络包发送给通信对象。

IP包头格式

在这里插入图片描述

IP 头部的源地址选择

在这里插入图片描述
假设 Web 服务器的目标地址是 192.168.10.200:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

IP 报文生成

在这里插入图片描述

MAC(两点传输)

生成了 IP 头部之后,接下来网络包还需要在 IP 头部的前面加上 MAC 头部。

MAC 包头格式

MAC 头部是以太网使用的头部,它包含了接收方和发送方的 MAC 地址等信息。

在这里插入图片描述

一般在 TCP/IP 通信里,MAC 包头的协议类型只使用:

  • 0800 : IP 协议
  • 0806: ARP 协议

获取对方的 MAC 地址

需要 ARP 协议帮我们找到路由器的 MAC 地址。
在这里插入图片描述

后续操作系统会把本次查询结果放到一块叫做 ARP 缓存的内存空间留着以后用,不过缓存的时间就几分钟。

在这里插入图片描述

MAC 报文生成

在这里插入图片描述

网卡(出口)

  • 网络包只是存放在内存中的一串二进制数字信息,没有办法直接发送给对方。
  • 网卡:负责将数字信息转换为电信号,使其能在网线上传输(真正的数据发送过程)。
  • 控制网卡还需要靠网卡驱动程序。
  • 网卡驱动获取网络包之后,会将其复制到网卡内的缓存区中,接着会在其开头加上报头和起始帧分界符,在末尾加上用于检测错误的帧校验序列。
    • 起始帧分界符:是一个用来表示包起始位置的标记
    • 末尾的 FCS(帧校验序列):用来检查包传输过程是否有损坏

在这里插入图片描述

最后网卡会将包转为电信号,通过网线发送出去。

交换机

交换机的设计是将网络包原样转发到目的地。交换机工作在 MAC 层,也称为二层网络设备。

交换机的包接收操作

  1. 电信号到达网线接口,交换机里的模块进行接收,接下来交换机里的模块将电信号转换为数字信号。

  2. 通过包末尾的 FCS 校验错误,如果没问题则放到缓冲区。

    • 计算机的网卡本身具有 MAC 地址,并通过核对收到的包的接收方 MAC 地址判断是不是发给自己的,如果不是发给自己的则丢弃;
    • 交换机的端口不核对接收方 MAC 地址,而是直接接收所有的包并存放到缓冲区中。
    • 和网卡不同,交换机的端口不具有 MAC 地址。
  3. 查询这个包的接收方 MAC 地址是否已经在 MAC 地址表中有记录了。

在这里插入图片描述
交换机根据 MAC 地址表查找 MAC 地址,然后将信号发送到相应的端口。

路由器

网络包经过交换机之后,现在到达了路由器,并在此被转发到下一个路由器或目标设备。

  • 基本原理:当转发包时,首先路由器端口会接收发给自己的以太网包,然后路由表查询转发目标,再由相应的端口作为发送方将以太网包发送出去。

  • 包接收操作:路由器的端口都具有 MAC 地址,只接收与自身地址匹配的包,遇到不匹配的包则直接丢弃。

  • 完成包接收操作之后,路由器就会去掉包开头的 MAC 头部。

  • 转发操作:

    1. 查询路由表判断转发目标
      在这里插入图片描述

    2. 找不到匹配路由时,就会选择默认路由,路由表中子网掩码为 0.0.0.0 的记录表示「默认路由」。

  • 发送操作:

    1. 根据路由表的网关列判断对方的地址。
      • 如果网关是一个 IP 地址,则是要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
      • 如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,说明已抵达终点 。
    2. 通过 ARP 协议根据 IP 地址查询 MAC 地址,并将查询的结果作为接收方 MAC 地址。
    3. 在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求。
    4. 发送方 MAC 地址字段,这里填写输出端口的 MAC 地址。还有一个以太类型字段,填写 0800 (十六进制)表示 IP 协议。
    5. 网络包完成后,接下来会将其转换成电信号并通过端口发送出去。
    6. 发送出去的网络包会通过交换机到达下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

在网络包传输的过程中,源 IP 和目标 IP 始终是不会变的,一直变化的是 MAC 地址,因为需要 MAC 地址在以太网内进行两个设备之间的包传输。

路由器与交换机的区别

  • 路由器是基于 IP 设计的,俗称三层网络设备,路由器的各个端口都具有 MAC 地址和 IP 地址;
  • 交换机是基于以太网设计的,俗称二层网络设备,交换机的端口不具有 MAC 地址。

服务器与客户端

在这里插入图片描述

  1. 服务器接收处理请求包:数据包抵达服务器,依次解析:
    • MAC 头(匹配则接收)
    • IP 头(确认协议为 TCP )
    • TCP 头(校验序列号,匹配则缓存并回 ACK,结合端口号确定给 HTTP 进程 ),HTTP 进程封装网页为响应报文
  2. 响应报文回传客户端:响应报文添加 TCP、IP、MAC 头(源为服务器 IP,目的为客户端 IP ),经网卡、交换机、路由器跳转传输,到达客户端所在路由器后,经交换机转发给客户端。
  3. 客户端处理与断开连接:客户端解析数据包获取 HTTP 响应报文,交由浏览器渲染页面,之后通过 TCP 四次挥手断开连接 。

网络模型

OSI 网络模型(7 层)

开放式系统互联通信参考模型(Open System Interconnection Reference Model),也就是 OSI 网络模型,该模型主要有 7 层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层以及物理层。

每一层负责的职能都不同,如下:

  • 应用层,负责给应用程序提供统一的接口;
  • 表示层,负责把数据转换成兼容另一个系统能识别的格式;
  • 会话层,负责建立、管理和终止表示层实体之间的通信会话;
  • 传输层,负责端到端的数据传输;
  • 网络层,负责数据的路由、转发、分片;
  • 数据链路层,负责数据的封帧和差错检测,以及 MAC 寻址;
  • 物理层,负责在物理网络中传输数据帧;

TCP/IP 网络模型(4层)

Linux 系统正是按照这套网络模型来实现网络协议栈的。

TCP/IP 网络模型共有 4 层,分别是应用层、传输层、网络层和网络接口层,每一层负责的职能如下:

  • 应用层,负责向用户提供一组应用程序,比如 HTTP、DNS、FTP 等;
  • 传输层,负责端到端的通信比如 TCP、UDP 等;
  • 网络层,负责网络包的封装、分片、路由、转发,比如 IP、ICMP 等;
  • 网络接口层,负责网络包在物理网络中的传输,比如网络包的封帧、 MAC 寻址、差错检测,以及通过网卡传输网络帧等;

关系

在这里插入图片描述

七层和四层负载均衡,是用 OSI 网络模型来描述的,

  • 七层对应的是应用层,
  • 四层对应的是传输层。

Linux 网络协议栈

在这里插入图片描述

Linux 网络协议栈:

在这里插入图片描述

Linux 接收网络包的流程

  1. 网卡接收与数据写入:网卡通过 DMA 技术,将接收的网络包写入指定内存地址(Ring Buffer 环形缓冲区 )。

    网卡:是计算机里的一个硬件,专门负责接收和发送网络包。

  2. 网络包已到达的初始通知方式及问题:
    • 最初靠触发中断告知操作系统,即网卡收包触发中断,让系统知晓。
    • 但在高性能网络场景,包数量多会频繁触发中断,使 CPU 忙于处理中断,影响系统整体效率。
  3. 引入 NAPI 机制优化:Linux 内核 2.6 版本引入 NAPI 机制,以混合 「中断和轮询」方式收包。

    NAPI 机制核心概念:不采用中断的方式读取数据,而是首先采用中断唤醒数据接收的服务程序,然后 poll 的方法来轮询数据。

  4. 硬件中断处理流程:
    • 网卡发硬件中断给 CPU,CPU 依中断表调用中断处理函数。
    • 中断处理函数先 「暂时屏蔽中断」,让网卡下次再收到数据包直接写内存,避免 CPU 持续被中断;接着发起 「软中断」,再恢复屏蔽的中断,后续主要工作交给软中断处理函数 。
      在这里插入图片描述

网络协议栈

  1. 进入网络接口层:检查报文合法性,非法则丢弃;合法则识别上层协议类型(IPv4/IPv6 等 ),去掉帧头帧尾,交给网络层。
  2. 到网络层:取出 IP 包,判断网络包走向;若发往本机,识别上层协议(TCP/UDP ),去掉 IP 头,交给传输层。
  3. 传输层:取出 TCP/UDP 头,依据四元组(源 IP、源端口、目的 IP、目的端口 )找对应 Socket,将数据放入其接收缓冲区。
  4. 应用层:程序调用 Socket 接口,把内核 Socket 接收缓冲区数据拷贝到应用层缓冲区,唤醒用户进程 ,至此完成网络包接收。 还提及可结合图看接收(左)与发送(右,反向流程 )流程。
    在这里插入图片描述

Linux 发送网络包的流程

  1. 应用层与内核态切换及初始准备:应用程序调用 Socket 发送接口(系统调用),从用户态陷入内核态 Socket 层;内核申请 sk_buff 内存,将用户数据拷贝至 sk_buff 并加入发送缓冲区 。
  2. 协议栈逐层处理(以 TCP 为例)
    • 网络协议栈从发送缓冲区取出 sk_buff,按 TCP/IP 协议栈从上到下处理;若为 TCP 传输,因需支持丢包重传(ACK 确认前 sk_buff 不能删 ),会拷贝新 sk_buff 副本用于后续发送,收到 ACK 后释放原始 sk_buff 。
    • 填充各层首部:依次填充 TCP 头、IP 头(网络层选取路由、填充 IP 头、netfilter 过滤、可能分片 )、帧头和帧尾(网络接口层通过 ARP 获下一跳 MAC 地址填充 ),sk_buff 借助 data 指针调整适配各层数据表示(如应用层 data、TCP 层 segment 等 )。
  3. 网卡发送及后续处理
    • 网络接口层将 sk_buff 放入网卡发送队列,触发“软中断”告知驱动;驱动读取 sk_buff 挂到 RingBuffer,映射到网卡可访问内存 DMA 区域后实际发送 。
    • 发送完成后,网卡触发“硬中断”释放内存(sk_buff 及 RingBuffer 内存 );传输层收到 TCP 报文 ACK 应答,释放原始 sk_buff 。

发送网络数据的内存拷贝操作

  1. 第一次拷贝:调用发送数据系统调用时,内核申请内核态 sk_buff,将用户待发送数据拷贝到 sk_buff 并加入发送缓冲区 。
  2. 第二次拷贝:使用 TCP 传输协议时,从传输层进入网络层,为实现可靠传输(等待 ACK ),sk_buff 会被克隆新副本送网络层,发送完副本释放,原始保留到收到 ACK 。
  3. 第三次拷贝:IP 层发现 sk_buff 大于 MTU 时,申请额外 sk_buff,将原 sk_buff 拷贝为多个小 sk_buff 分片发送 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/diannao/93275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全面解析 CSS Flex 布局:从入门到精通的所有属性详解

1. Flex 容器属性 通过 display: flex 或 display: inline-flex 将元素设置为 Flex 容器。以下是所有容器属性。 1.1 display: flex | inline-flex 作用:定义一个 Flex 容器。可选值: flex:块级容器,占据整行。inline-flex&#x…

数据结构:对角矩阵(Diagonal Matrix)

目录 矩阵的传统表示:二维数组 🔍 真正有用的数据是哪些? 从二维数组转为一维数组 用 C 类实现对角矩阵 1. 对角矩阵真正需要存什么? 2. 对角矩阵允许哪些行为? 3. 为什么要动态分配数组? 接下来推…

Leetcode_349.两个数组的交集

这道题的意思很明确,就是让寻找两个数组中的共同元素,并去重,由此可以联想到哈希表的特性,注意到题目给的数据范围,在1000以内,所以本题可以使用 STL 的库函数,也可以使用数组进行模拟。 本题要…

STM32——寄存器映射

总 :STM32——HAL库总结-CSDN博客 芯片资料: STM32F1系列参考手册-V10(中) STM32F103ZET6(English) 一、寄存器基础 1.1 简介 单片机内部的控制机构。 像空气开关控制电路一样的原理,打开关闭某个开关&#xff0…

Java响应式编程

Java 响应式编程是一种基于异步数据流处理的编程范式,它强调数据流的声明式构建和传播变化的自动响应。Java 9 引入的Flow API为响应式编程提供了标准接口,而 Reactor 和 RxJava 等第三方库则提供了更丰富的操作符和工具。核心概念Publisher(…

【重学数据结构】二叉搜索树 Binary Search Tree

目录 二叉搜索树的数据结构 手写实现二叉搜索树 树节点定义 插入节点 源码 流程图 二叉树插入步骤图解 第一步: 插入 20 第二步: 插入 10 第三步: 插入 30 第四步: 插入 5 查找节点 源码 场景一: 查找成功 (search for 25) 第一步: 从根节点开始 第二步:…

四、计算机组成原理——第1章:计算机系统概述

目录 1.1计算机发展历程 1.1.1计算机硬件的发展 1.计算机的四代变化 2.计算机元件的更新换代 1.1.2计算机软件的发展 1.2计算机系统层次结构 1.2.1计算机系统的组成 1.2.2计算机硬件 1.冯诺依曼机基本思想 2.计算机的功能部件 (1)输入设备 (2)输出设备 (3)存储器 (4)运算器 (5)…

flutter TextField 失去焦点事件

在 Flutter 中,处理 TextField 的失去焦点事件(即失去焦点时触发的操作)通常有两种常用方式:使用 FocusNode 或 onEditingComplete 回调。以下是具体实现: import package:flutter/material.dart;class MyTextField e…

Moonlight for ChromeOS 常见问题解决方案

Moonlight for ChromeOS 常见问题解决方案 项目基础介绍 Moonlight for ChromeOS 是一个开源的 NVIDIA GameStream 客户端,允许用户将他们的游戏从高性能的桌面电脑流式传输到运行 ChromeOS 的设备上。该项目还支持 Android 和 iOS/tvOS 平台。Moonlight for Chrome…

SQL语句:读操作、写操作、视图

文章目录读操作分类基础查询语句示例高级查询--分组查询、子查询、表连接、联合查询分组查询:子查询(嵌套查询)表连接联合查询写操作视图SQL:结构化查询语言读操作 重点是where查询,即高级查询部分 分类 DML &#…

Python 机器学习实战:基于 Scikit-learn

本文围绕《Python 机器学习实战:基于 Scikit-learn 的项目开发》展开,先介绍 Scikit-learn 库的基础特性与优势,再阐述机器学习项目开发的完整流程,包括数据收集与预处理、模型选择与训练、评估与优化等。通过具体实战案例&#x…

java里List链式编程

java里对list的操作,我们一遍使用for遍历,输出或改变里面的内容。单经常在代码里面我们发现,也可以使用这样的代码结构daPaymentActionVo.setApnolist(paymentActionVo.getApnolist().stream().map(PaymentActionVo.Voucher::getApno).collec…

【esp32s3】7 - VSCode + PlatformIO + Arduino + 构建项目

一、PlatformIO 1.1. 概述 官方文档:What is PlatformIO? PlatformIO 是一个跨平台的物联网开发生态系统,专门为嵌入式系统开发设计,支持多种开发板和框架。 1.1.1. 主要特点 跨平台:支持 Windows、macOS 和 Linux多框架支持&…

LE AUDIO CIS/BIS音频传输时延的计算

LE AUDIO音频总时延计算方法 按照BAP的规范,LE AUDIO音频总延时包括三个部分:Audio Processing Time,Transport Latency,Presentation Delay。如下图所示是播放音乐的示例图: 这里还有一个麦克风录音的总时延示例图: Audio Processing Time:这个就是音频DSP获取音频数…

git 修改 更新

git 修改 更新先更新,后修改# 暂存当前修改 git add . git stash# 获取最新的 main 分支 git checkout main git pull# 新建开发分支 git checkout -b lbg_0727# ⚠️ 先把 main 的最新代码合并/变基到当前分支(用于消除冲突) # 方法1&#x…

飞鹤困局:增长神话的裂痕

增长天花板已然逼近,飞鹤需要探寻新方向。作者|安德鲁编辑|文昌龙“飞鹤,更适合中国宝宝体质”——这句曾让无数妈妈点头的广告语,帮飞鹤坐上了中国奶粉市场的头把交椅。可多年后,时代红利退潮,故事不好讲了。飞鹤的利…

Java设计模式之<建造者模式>

目录 1、建造者模式 2、建造者模式结构 3、实现 4、工厂模式对比 5、适用场景差异 前言 建造者模式是一种创建型设计模式。用于封装复杂对象的构建过程,通过步骤构建产品类。它包括产品类、抽象建造者、具体建造者和指挥者角色。 优点在于灵活性、解耦和易扩展…

fchown/fchownat系统调用及示例

55. fchmod - 通过文件描述符改变文件权限 函数介绍 fchmod是一个Linux系统调用&#xff0c;用于通过文件描述符来改变文件的访问权限。它是chmod函数的文件描述符版本&#xff0c;避免了路径名解析。 函数原型 #include <sys/stat.h> #include <unistd.h>int fchm…

20250726-5-Kubernetes 网络-Service 代理模式详解(iptables与ipvs)_笔记

一、服务三种常用类型  1. LoadBalancer类型 工作原理:与NodePort类似,在每个节点上启用端口暴露服务,同时Kubernetes会请求底层云平台(如阿里云、腾讯云、AWS等)的负载均衡器,将每个Node([NodeIP]:[NodePort])作为后端添加。 自动化实现:云厂商通过官方实现的控制…

horizon置备出错

报错内容如下&#xff1a; [2025/7/28 19:15] 置备 Customization failure: Customization of the guest operating system is not supported due to the given reason: 期间出错 解决方法&#xff1a;将模板转换为虚拟机&#xff0c;安装vmtools&#xff1b;再安装vmtools之后…