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_buffRingBuffer 内存 );传输层收到 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.pswp.cn/diannao/93275.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/93275.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/93275.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈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之后…