【温故知新】Linux系统启动流程(BIOS+GRUB模式)

一、硬件初始化阶段
1、电源自检(POST)
按下电源键,主板 BIOS 固件启动,依次检测 CPU、内存、硬盘控制器、显卡、外设等核心硬件,故障则通过蜂鸣 / 屏幕提示终止启动,无异常则进入下一步。
2、BIOS 固件初始化,定位启动设备并加载GRUB第一扇区
BIOS 加载自身固化驱动,初始化已检测通过的硬件,建立基础硬件运行环境,识别本地存储设备(硬盘/SSD)。BIOS 按 CMOS 中预设的启动顺序(硬盘/U盘/光驱),找到目标启动硬盘,读取硬盘主引导记录(MBR,磁盘首个 512 字节),加载其中的 GRUB 第一阶段(Stage1)引导程序,将控制权移交 GRUB。

二、引导加载阶段
3、GRUB Stage1 执行
MBR 中的 Stage1 程序无完整驱动,仅负责定位并加载硬盘中 **/boot 分区 ** 的 GRUB Stage1.5 程序(位于 MBR 之后、第一个分区之前的空闲扇区)。
4、GRUB Stage1.5 加载
加载 Stage1.5 并初始化,其集成了文件系统驱动(ext4/xfs 等),可直接识别 /boot 分区的文件系统,无需依赖其他程序。
5、GRUB Stage2 加载
通过 Stage1.5 读取 /boot/grub 目录下的完整 GRUB 程序(Stage2),加载 GRUB 核心模块,完成引导程序自身初始化。
6、内核加载准备
读取 /boot/grub/grub.cfg 配置文件,多系统场景显示启动菜单(超时选默认项),将 Linux 内核镜像(vmlinuz)、初始内存盘(initramfs/initrd)加载至物理内存,向内核传递根分区位置、启动参数等信息。

三、内核启动阶段
7、内核解压与初始化
内核在内存中自解压并运行,初始化 CPU、内存管理、进程调度、中断处理等内核核心子系统。
8、加载临时驱动与文件系统
挂载 initramfs 为临时根文件系统,加载硬盘、文件系统等内核原生未集成的必要驱动,为挂载真实根分区做准备。
9、挂载根文件系统
通过临时驱动识别并以只读模式挂载真实根文件系统(ext4/btrfs/xfs 等)。
10、切换根文件系统
从 initramfs 临时根切换至真实根分区,释放 initramfs 占用的内存资源。
11、启动第一个用户进程
内核启动首个用户空间进程(主流为 systemd,传统为 init),PID 固定为 1,内核将系统控制权完全移交用户空间,内核启动阶段完成。

四、用户空间初始化
12、初始化系统启动
systemd 读取核心配置文件(/etc/systemd/system/default.target),确定系统默认启动目标。
13、启动基础服务
按服务依赖关系并行启动基础核心服务:udev(硬件动态管理)、日志服务(journald/rsyslog)、/etc/fstab 配置的非根分区挂载(并将根分区从只读改为读写)等。
14、启动目标单元服务
根据默认启动目标(multi-user.target 命令行 /graphical.target 图形界面),启动对应服务组(如网络、SSH、定时任务等)。
15、登录界面 / Shell 就绪
启动字符终端 getty 进程或图形登录管理器(GDM/LightDM),显示登录提示 / 可视化登录界面,Linux 系统启动完成,进入可操作状态。

关键差异
1、BIOS 无 EFI 系统分区(ESP),依赖 MBR 加载引导程序,而 UEFI 直接从 ESP 加载 grubx64.efi。
2、BIOS 下 GRUB 为多阶段加载(Stage1→Stage1.5→Stage2),解决 MBR 空间不足(仅 512 字节)无法存储完整引导程序的问题;UEFI 下 GRUB 为单阶段直接加载。

引导方式 BIOS+GRUB UEFI+GRUB
固件类型 传统 BIOS 固件(固化在主板,功能简单) 新式 UEFI 固件(模块化,功能丰富)
引导分区 无专用分区,依赖硬盘 MBR(512 字节) 专用 EFI 系统分区(ESP,FAT32 格式)
GRUB加载方式 多阶段(Stage1→1.5→2)加载 单阶段直接加载 grubx64.efi 文件
启动项存储 存储在主板 CMOS 中(掉电易丢失) 存储在 ESP 分区的 EFI 启动项中(更稳定)
硬件支持 最大支持 2TB 硬盘(MBR 分区表限制) 支持大于 2TB 硬盘(GPT 分区表)

【温故知新】Linux系统启动流程(UEFI+GRUB模式)

一、硬件初始化阶段
1、电源自检(Power-On Self-Test, POST)
按下电源键后,主板 UEFI 固件执行核心硬件检测(内存、CPU、硬盘控制器、显卡等),硬件故障则终止启动并抛出提示,无异常则进入下一阶段。
2、固件初始化
UEFI 固件加载自身驱动,识别本地存储设备(硬盘 / SSD 等),初始化硬件运行环境,完成启动前基础准备。
3、启动管理器加载
UEFI 按预设启动项顺序,从EFI 系统分区(ESP) 读取并加载 GRUB 引导程序核心文件(grubx64.efi)。

二、引导加载阶段
4、GRUB 第一阶段加载
UEFI 将系统控制权移交 GRUB,加载 GRUB 核心运行模块,完成引导程序自身初始化。
5、GRUB 配置文件解析
读取 /boot/grub/grub.cfg 配置文件,解析内核路径、启动参数,多系统场景显示启动菜单(超时后选默认项)。
6、内核加载准备
根据配置将 Linux 内核镜像(vmlinuz)、初始内存盘(initramfs/initrd)加载至物理内存,向内核传递根分区位置等关键启动参数。

三、内核启动阶段
7、内核解压与初始化
内核在内存中自解压并运行,初始化 CPU、内存管理、进程调度、中断处理等内核核心子系统。
8、加载临时驱动与文件系统
挂载 initramfs 为临时根文件系统,加载硬盘、文件系统等内核原生未集成的必要驱动,为挂载真实根分区做准备。
9、挂载根文件系统
通过临时驱动识别并以只读模式挂载真实根文件系统(ext4/btrfs/xfs 等)。
10、切换根文件系统
从 initramfs 临时根切换至真实根分区,释放 initramfs 占用的内存资源。
11、启动第一个用户进程
内核启动首个用户空间进程(主流为 systemd,传统为 init),PID 固定为 1,内核将系统控制权完全移交用户空间,内核启动阶段完成。

四、用户空间初始化
12、初始化系统启动
systemd 读取核心配置文件(/etc/systemd/system/default.target),确定系统默认启动目标。
13、启动基础服务
按服务依赖关系并行启动基础核心服务:udev(硬件动态管理)、日志服务(journald/rsyslog)、/etc/fstab 配置的非根分区挂载(并将根分区从只读改为读写)等。
14、启动目标单元服务
根据默认启动目标(multi-user.target 命令行 /graphical.target 图形界面),启动对应服务组(如网络、SSH、定时任务等)。
15、登录界面 / Shell 就绪
启动字符终端 getty 进程或图形登录管理器(GDM/LightDM),显示登录提示 / 可视化登录界面,Linux 系统启动完成,进入可操作状态。

流量入口30年变迁:从PC到AI,用户注意力到底流向了哪里?

Featured

各时期流量入口的变迁:
流量入口随时代的变迁


流量入口30年变迁:从PC到AI,用户注意力到底流向了哪里?

互联网的发展史,本质上就是流量入口的迭代史。从只能坐在电脑前上网的年代,到如今 AI 助手随时响应的智能时代,用户获取信息、连接服务的方式不断被颠覆,而每一次入口变迁,都藏着商业世界的底层逻辑。今天就顺着时间线,聊聊流量入口的迭代规律,看看未来的机会在哪里。

1. 2010 年前(PC 互联网 / Web1.0):浏览器 + 搜索引擎,垄断流量话语权
在移动设备还没普及的 PC 时代,流量入口高度集中。当时的用户上网,第一步必然是打开 Windows 或 MacOS 系统,接着启动 Chrome、Safari、IE 等浏览器,最后通过谷歌、百度等搜索引擎查找信息 ——浏览器是必经之路,搜索引擎是核心枢纽。
除了搜索,门户网站(如新浪、搜狐)、垂直类网站(如各类行业论坛)也是重要流量池,用户通过输入网址或收藏夹访问,获取新闻、资讯、社区互动等服务。这个阶段的流量特点是 “主动搜索 + 固定入口”,谁掌握了浏览器、搜索引擎或大型门户网站,谁就掌握了流量分发权。比如谷歌凭借浏览器 + 搜索引擎的组合,成为全球 PC 互联网时代的流量霸主。

2. 2010-2018 年(移动互联网 / Web2.0):超级 APP + 移动 OS,流量去中心化
智能手机的普及彻底改变了流量格局,移动互联网时代正式到来。此时的流量入口从 PC 端转移到移动端,核心载体变成了移动 OS(iOS、Android)和超级 APP。
首先,iOS 和 Android 两大移动操作系统掌控了手机端的底层入口,所有 APP 都依赖其运行;其次,以微信、支付宝为代表的超级 APP 崛起,形成了 “一站式生态”—— 用户聊天、支付、购物、打车、看资讯等需求,都能在一个 APP 内完成,无需频繁切换。此外,短视频 APP、电商 APP、本地生活 APP 等垂直类应用也分流了大量流量,社交生态圈、本地生活圈、垂直类生态圈逐渐成型。
这个阶段的流量特点是 “场景化 + 碎片化”,用户的注意力被分散到各个 APP 中,超级 APP 成为流量聚合的核心,而移动 OS 则掌握着底层分发权限。谷歌也凭借 Android 操作系统,在移动时代延续了其流量优势。

3. 2018-2025 年(智能互联网过渡阶段):AI 助手 + 工具 AI 化,流量入口隐形化
随着 AI 技术的成熟,流量入口开始从 “有形 APP” 向 “无形智能服务” 转变。核心趋势是AI 助手崛起和各类工具 AI 化:用户不再需要主动打开 APP,而是通过 AI 助手(如手机自带的智能语音助手、ChatGPT 类产品)直接获取服务,比如语音查询天气、智能规划路线、AI 生成文案等。
同时,电商、内容、生活服务等各类工具都在加速 AI 化 —— 购物 APP 的智能推荐、内容平台的 AI 创作助手、办公软件的 AI 高效功能,都在让用户的使用体验更便捷。这个阶段的流量入口逐渐 “隐形”,用户不再关注 “打开哪个 APP”,而是关注 “能否快速解决需求”,AI 成为连接用户与服务的核心桥梁。

4. 2025 年后(Web3.0+AI 时代):AI 入口 + 全场景融合,流量无界化
展望未来,流量入口将进入 “AI 入口主导 + 全场景融合” 的新阶段。核心入口会是 **“AI + 搜索”“AI 助手”** 这类综合性智能服务,比如谷歌的 Gemini、Transformer 等 AI 产品,将整合搜索、创作、服务对接等功能,成为用户接入互联网的核心枢纽。
此时,AI 将彻底改变人们的工作、学习、生活方式:工作中,AI 辅助高效完成复杂任务;学习中,AI 定制个性化学习方案;生活中,全场景智能设备(手机、电脑、智能家电、穿戴设备)通过 AI 助手实现互联互通,用户的需求能在任何场景下被即时响应。流量不再局限于某个设备或 APP,而是实现 “无界流动”,核心竞争力变成了 “AI 算法的精准度” 和 “服务的场景化覆盖”。

总结:流量入口变迁的核心逻辑
从 PC 到移动,再到 AI 时代,流量入口的变迁始终围绕一个核心:更贴近用户需求、更便捷的连接方式。PC 时代解决了 “能不能上网” 的问题,移动时代解决了 “随时随地上网” 的问题,AI 时代则解决了 “高效精准获取服务” 的问题。
对于企业和创业者来说,读懂流量入口的变迁规律至关重要:过去是 “抢占入口”,现在是 “拥抱 AI”,未来是 “深耕场景”。谁能精准把握用户需求的变化,用 AI 技术优化服务体验,谁就能在新一轮流量变革中占据先机。

你感受到流量入口的变迁了吗?你现在获取信息、享受服务最常用的方式是什么?欢迎在评论区留言交流~

PS:
整理资料的时候发现,谷歌的每一步,都踏在了正确的位置,都吃到了时代的红利,佩服!

NEOHOPE大模型发展趋势预测2601

NEOHOPE大模型发展趋势预测2601
1、基础模型比赛已结束,能胜出的就头部这几家,开源模型市场更大
2、技术迭代,会导致基础模型价格进一步降低,其他模型厂商向杀入战局越来越难
3、大模型向垂直领域迁移动作明显:大厂商开始大力推进垂直领域模型
4、各垂直领域头部企业会握紧数据,加大开源大模型的开发应用,各大应用会进一步融入AI能力
5、端云模型应用场景进一步增多,小模型会更加被重视
6、头部大模型应用,逐步进入收费时代,可以盈利逐步成为各大模型团队KPI
7、大模型相关应用进一步爆发,在短视频、非现实文学创作、医疗健康等方面,大模型会进一步发力

一线厂商【主观】:
1、国外闭源:ChatGPT、Claude、Gemini
2、国外开源:Mistral
3、国内闭源:豆包、千问商业版、智谱商业版、月之暗面
4、国内开源:千问、DeepSeek、智谱

其他有机会或有能力入局的厂商:
国外:X、Meta、微软、苹果、亚马逊
国内:腾讯、华为

从点击鼠标到登录成功512步精简版(终)

十、响应的原路返回层:从后端到浏览器(第431-470步)
1. 网关接收用户服务返回的明文响应;
2. 触发后置过滤器链执行;
3. 日志过滤器记录响应状态和耗时;
4. 响应数据格式校验;
5. 后置过滤器执行完成;
6. 网关将明文响应转发至SLB;
7. 明文响应经过K8S网络传输;
8. Calico网络插件转发明文响应;
9. 经过边界防火墙;
10. 防火墙放行响应数据;
11. 明文响应进入阿里云SLB;
12. SLB接收明文响应;
13. SLB用会话密钥加密明文响应;
14. 加密响应封装为TLS记录;
15. 记录响应转发日志;
16. 加密响应数据转发至阿里云公网网关;
17. 经过安全组和网络ACL;
18. 放行响应数据;
19. 加密响应进入阿里云公网边缘节点;
20. 边缘节点转发至公网;
21. 加密响应数据在运营商骨干网传输;
22. 经过本地运营商网络;
23. 抵达宽带猫;
24. 宽带猫解析PPPoE封装;
25. 转发至本地路由器;
26. 路由器解析目标IP为本地主机;
27. 转发至用户主机;
28. 主机网络接口接收加密响应;
29. 触发中断,CPU处理接收软中断;
30. 内核TCP协议栈处理报文,确认序列号并放入socket接收缓冲区;
31. 转发至浏览器进程;
32. 浏览器网络线程从接收缓冲区读取数据;
33. 浏览器用会话密钥解密响应数据;
34. 得到明文JSON响应体;
35. 解析JSON响应体,提取JWT令牌和用户信息;
36. 将JWT令牌存入localStorage(或HttpOnly Cookie);
37. 确认存储成功;
38. 触发页面跳转事件:window.location.href=’/dashboard’;
39. 浏览器监听到地址变化,发起首页HTML请求;
40. 重复DNS解析、TCP握手、TLS握手过程(可复用连接);
41. 请求到达后端,经过Gateway到dashboard-service;
42. dashboard-service从请求头读取Authorization令牌;
43. 调用jwtTokenProvider.validateToken验证令牌;
44. 解析JWT提取userId,查询Redis验证令牌有效性;
45. 验证通过后获取用户权限信息;
46. 构建用户菜单数据并返回HTML页面或JSON数据;
47. 浏览器接收首页HTML数据;
48. 关闭正向TCP连接;
49. 释放公网传输临时资源;
50. 阿里云SLB释放转发资源;
51. 网关释放响应处理资源;
52. 移交控制权至浏览器渲染层;

十一、浏览器渲染层:登录成功页面构建与展示(第471-512步)
1. 浏览器开始解析HTML字节流;
2. HTML解析器构建DOM树(Document Object Model);
3. 解析过程中遇到link标签(CSS),触发CSSOM树构建;
4. 浏览器预加载器(Preloader)识别CSS资源并发起请求;
5. 接收CSS文件,CSS解析器解析样式规则;
6. 合并DOM树与CSSOM树,生成渲染树(Render Tree);
7. 渲染树仅包含可见DOM节点及对应样式;
8. 启动布局(Layout)阶段,计算每个节点的几何位置(宽、高、坐标);
9. 计算根节点(html)尺寸为浏览器窗口大小;
10. 递归计算子节点布局,遵循盒模型(box model)规则;
11. 确定登录成功提示框的居中坐标(如left: 50%, top: 30%);
12. 计算导航栏、侧边栏等组件的布局位置;
13. 布局计算完成,生成布局树(Layout Tree);
14. 进入绘制(Paint)阶段,将渲染树节点转换为像素数据;
15. 按层(Layer)绘制,如背景层、内容层、边框层;
16. 绘制登录成功图标(如对勾图标);
17. 绘制文字内容(如“登录成功,欢迎回来!”),调用字体渲染引擎;
18. 处理文字抗锯齿、行高对齐等细节;
19. 绘制按钮(如“进入控制台”按钮)的背景色、边框、文字;
20. 生成每层的绘制指令列表;
21. 合成(Composite)阶段,将各层像素数据合并;
22. 处理层间重叠、透明度等合成规则;
23. GPU参与合成运算,提升渲染效率;
24. 合成完成后生成最终的帧缓冲区数据;
25. 浏览器通过显卡驱动将帧数据发送至显示器;
26. 显示器按刷新率(如60Hz)读取帧数据;
27. 显示器背光点亮,像素点按帧数据显示对应颜色;
28. 用户肉眼看到登录成功页面;
29. 浏览器触发load事件(window.onload);
30. 执行页面加载完成后的初始化脚本(如获取用户未读消息数);
31. 脚本调用fetch API请求消息接口;
32. 重复网络请求-响应流程获取消息数据;
33. 消息数据渲染到导航栏消息图标旁;
34. 浏览器更新渲染树,触发重绘(Repaint);
35. 重绘完成后更新显示器显示;
36. 释放HTML解析临时内存;
37. 释放CSSOM构建临时资源;
38. 渲染引擎重置状态,等待后续用户交互;
39. 浏览器网络线程关闭闲置连接;
40. 释放localStorage操作临时句柄;
41. V8引擎垃圾回收(GC)清理未使用的变量和函数;
42. 回收登录表单数据占用的内存;
43. 浏览器进程将CPU资源交还系统;
44. 监控页面渲染性能指标(如First Contentful Paint、Largest Contentful Paint);
45. 记录页面加载完成时间戳;
46. 确认所有静态资源(JS、CSS、图片)加载完成;
47. 验证页面交互元素(按钮、链接)可正常响应;
48. 登录成功页面稳定展示,无布局偏移;
49. 浏览器主线程进入空闲状态,等待新的用户事件;
50. 若开启性能监控,向监控服务上报页面渲染性能数据;
51. 监控数据包含DOM解析耗时、布局耗时、绘制耗时;
52. 从点击登录按钮到页面成功展示的全流程结束;

(结束)

从点击鼠标到登录成功512步精简版(三)

七、SpringCloud网关层:请求路由与过滤管控(第261-320步)
1. 网关应用的Netty Acceptor线程检测到新连接;
2. 将连接分配给Netty Worker线程处理;
3. Netty Worker线程接收明文请求;
4. Netty解析HTTP请求报文;
5. 提取请求方法(POST)和路径(/login);
6. 启动路由谓词匹配;
7. 匹配预设的用户服务路由规则;
8. 确认路由规则有效;
9. 触发前置过滤器链执行;
10. 跨域过滤器校验Origin头,允许合法Origin的跨域请求;
11. 日志过滤器初始化,记录请求时间、IP、路径;
12. 限流过滤器获取请求IP;
13. 从Redis连接池获取连接,查询Redis中的限流计数器;
14. 确认未触发限流阈值;
15. 参数校验过滤器提取请求体;
16. 校验用户名格式合法性;
17. 校验密码格式合法性;
18. 所有前置过滤器执行完成;
19. 网关启动服务发现;
20. 向Nacos注册中心发送查询请求;
21. 查询用户服务实例列表;
22. Nacos返回可用的用户服务实例;
23. 网关初始化负载均衡算法(如随机算法);
24. 用随机算法选择目标用户服务实例(如10.244.2.8:8081);
25. 记录服务选择结果;
26. 构建转发至用户服务的明文请求;
27. 补充服务间调用的请求头;
28. 设定服务调用超时时间;
29. 检查与用户服务的网络连通性;
30. 向选中的用户服务实例转发明文请求;
31. 监控服务调用状态;
32. 等待用户服务响应;
33. 若调用失败,触发重试机制;
34. 重试选择其他用户服务实例;
35. 确认重试次数未超限;
36. 网关记录服务调用日志;
37. 校验转发请求格式正确;
38. 确认用户服务实例资源可用;
39. 网关层完成路由与过滤;
40. 等待用户服务业务处理;
41. 监控请求转发后的连接状态;
42. 维护网关与用户服务的连接;
43. 确认过滤规则无遗漏;
44. 记录限流统计数据;
45. 网关线程保持阻塞等待响应;
46. 检查请求转发无数据丢失;
47. 确认路由匹配无错误;
48. 服务发现缓存更新;
49. 负载均衡结果缓存;
50. 网关层资源占用监控;
51. 确认无异常过滤器执行;
52. 维持网关应用稳定运行;
53. 等待用户服务返回业务结果;
54. 校验服务间调用的安全性;
55. 网关层完成管控职责;
56. 准备接收用户服务明文响应;
57. 清理前置过滤器临时资源;
58. 释放路由匹配临时数据;
59. 网关层保持响应接收状态;
60. 等待明文响应数据传输;

八、SpringCloud用户服务层:登录核心业务逻辑执行(第321-400步)
1. 用户服务的Tomcat接收请求;
2. Tomcat Worker线程被唤醒;
3. 线程接收请求数据;
4. 解析HTTP请求报文;
5. 提取请求路径(/login);
6. 匹配Spring MVC的@RequestMapping;
7. 确定目标登录处理方法(AuthController.login);
8. 检查是否有拦截器(Interceptor)需要前置处理;
9. 执行LoginInterceptor.preHandle()进行基础校验;
10. 校验通过,启动参数绑定;
11. 从请求体提取用户名、密码、验证码参数;
12. 参数绑定至LoginDTO方法入参;
13. 校验参数非空;
14. 控制器调用Service层:authService.login(dto);
15. Spring AOP代理拦截调用(若开启@Transactional);
16. 进入AuthServiceImpl.login()方法;
17. 首先验证验证码:captchaService.validate(dto.getCaptcha());
18. 从Spring容器获取RedisTemplate Bean;
19. RedisTemplate从连接池获取Jedis或Lettuce连接;
20. 向Redis发送GET请求(Key:captcha:sessionId);
21. Redis查询验证码缓存并返回;
22. 校验请求验证码与缓存一致;
23. 验证码校验通过,关闭Redis临时连接;
24. 调用用户查询服务:userRepository.findByUsername(dto.getUsername());
25. Spring Data JPA创建动态代理;
26. 若开启二级缓存(如Caffeine),先查缓存;
27. 缓存未命中,构建JPA Criteria查询;
28. 生成JPQL并转换为SQL(按用户名查询);
29. 初始化MyBatis SqlSession;
30. 执行SQL查询;
31. 向MySQL发送查询请求;
32. 等待MySQL返回结果;
33. 接收用户数据结果集;
34. 校验用户是否存在;
35. 若不存在,构建“用户不存在”响应;
36. 若存在,获取数据库中的加密密码和盐值;
37. 用BCrypt算法(相同盐值)处理请求密码;
38. 对比加密后的密码;
39. 若密码不匹配,构建“密码错误”响应;
40. 若密码匹配,确认用户状态为ACTIVE且登录失败次数小于5次;
41. 初始化JWT工具类;
42. 从阿里云KMS获取签名密钥;
43. 构建JWT payload(含用户名、角色);
44. 用密钥生成JWT令牌并设定过期时间;
45. JWT令牌生成完成;
46. 启动Redis连接存储令牌;
47. 向Redis发送SET请求(令牌-用户信息)并设置过期时间;
48. 确认令牌存储成功;
49. 关闭Redis连接;
50. 更新用户最后登录时间;
51. 调用userRepository.save(user)更新数据库;
52. 触发事务提交;
53. 构建登录成功响应对象;
54. 封装用户基本信息和JWT令牌;
55. 设定响应状态码200;
56. Spring MVC将响应对象序列化;
57. 序列化完成JSON格式响应体;
58. 设定响应头”Content-Type: application/json”;
59. 响应数据传递至Tomcat;
60. Tomcat封装HTTP响应报文;
61. 确认响应格式正确;
62. 用户服务记录登录成功日志;
63. 校验响应数据无敏感信息;
64. Tomcat Worker线程准备发送响应;
65. 响应数据通过网络发送至网关;
66. 监控响应发送状态;
67. 确认响应发送完成;
68. 释放SqlSession资源;
69. 释放方法入参占用内存;
70. Worker线程重置状态并回归线程池;
71. 用户服务业务层流程结束;
72. 记录用户登录时间;
73. 维护用户服务实例稳定;
74. 清理业务处理临时资源;
75. 确认登录业务逻辑完整;
76. 校验令牌生成唯一性;
77. 确认Redis存储的令牌有效;
78. 响应数据无遗漏字段;
79. 关闭业务处理相关连接;
80. 释放用户查询临时缓存;
81. 记录服务业务处理耗时;
82. 监控用户服务资源占用;
83. 确认无业务异常未处理;
84. 用户服务层流程结束;

九、MySQL数据库层:用户数据查询与返回(第401-430步)
1. 用户服务通过HikariCP获取数据库连接;
2. 连接池分配空闲连接;
3. 初始化数据库连接参数;
4. 与MySQL服务器建立TCP连接;
5. MySQL服务器接收连接请求;
6. 启动MySQL握手认证;
7. 发送MySQL服务版本信息和支持的认证插件;
8. 客户端选择认证插件,发送加密后的用户名和密码;
9. MySQL校验用户名密码;
10. 认证通过,建立会话;
11. 客户端发送用户查询SQL;
12. MySQL接收SQL语句;
13. 解析SQL语句语法并检查合法性;
14. 启动SQL优化器,分析查询计划;
15. 匹配用户名字段的索引(idx_username);
16. 选择最优索引执行查询;
17. InnoDB检查Buffer Pool是否有该索引页缓存;
18. 若缓存无数据,向操作系统发起pread()系统调用读取SSD磁盘;
19. 磁盘IO读取用户数据页;
20. 数据通过DMA传输到内核缓冲区,再复制到InnoDB Buffer Pool;
21. InnoDB在索引页中搜索用户名对应的记录,获取主键ID;
22. 根据主键ID进行聚簇索引查找,加载用户数据页;
23. 解析数据页获取用户记录;
24. 封装查询结果集;
25. 向客户端返回结果集;
26. 客户端接收结果集;
27. 若执行更新操作(如更新最后登录时间),InnoDB记录Redolog和Undolog;
28. 事务提交时,Redolog刷盘(fsync);
29. 若开启binlog,写入binlog文件(用于主从复制);
30. 事务状态标记为COMMITTED,释放行锁;
31. 关闭SQL执行会话;
32. 数据库连接释放回连接池;
33. MySQL数据库层流程结束;

(未完待续)

从点击鼠标到登录成功512步精简版(二)

三、浏览器网络层:登录请求封装与传输准备(第76-130步)
1. 浏览器主线程提取表单中的用户名;
2. 提取表单中的密码;
3. 对密码进行初步前端加密(MD5);
4. 构建登录请求参数对象;
5. 确定请求目标域名(如login.example.com);
6. 浏览器DNS客户端初始化;
7. 检查浏览器DNS缓存(如Chrome://net-internals/#dns);
8. 检查操作系统DNS缓存(Linux执行getaddrinfo(),读取/etc/resolv.conf);
9. 若缓存无目标域名或已过期,发起DNS查询请求;
10. 浏览器网络线程创建UDP套接字(SOCK_DGRAM);
11. DNS查询报文构建(含域名、查询类型A);
12. 同时发起AAAA记录查询(IPv6),执行Happy Eyeballs算法;
13. DNS请求发送至配置的DNS服务器(53端口,如114.114.114.114);
14. 本地路由器接收到UDP报文,进行NAT转换(源IP转为私有IP+随机端口);
15. DNS请求经过本地交换机、光猫(光电信号转换);
16. 通过PPPoE获取的公网IP发送到ISP;
17. ISP核心路由器根据BGP路由表路由到阿里云POP点;
18. 本地DNS服务器接收请求;
19. 本地DNS查询自身缓存;
20. 缓存无结果则向根服务器查询;
21. 根服务器返回顶级域服务器地址;
22. 本地DNS向顶级域服务器查询;
23. 顶级域服务器返回权威服务器地址;
24. 本地DNS向权威服务器查询;
25. 权威服务器返回目标域名公网IP(如203.0.113.45,阿里云SLB);
26. DNS响应报文沿原路返回;
27. 浏览器网络线程收到DNS响应,解析出IPv4地址;
28. 缓存到浏览器DNS缓存(TTL=300秒);
29. 缓存到操作系统DNS缓存;
30. 浏览器准备建立TCP连接,创建ClientSocket对象;
31. 调用socket(AF_INET, SOCK_STREAM, 0)创建TCP套接字;
32. 设置Socket选项(TCP_NODELAY禁用Nagle算法、SO_KEEPALIVE);
33. 设定TCP端口为443(HTTPS);
34. 调用connect()发起TCP三次握手;
35. 内核构建SYN报文(seq=rand(),win=64240);
36. 报文经过TCP→IP→Ethernet封装;
37. 网卡驱动将报文封装为以太网帧(src_mac=电脑MAC,dst_mac=路由器MAC);
38. 浏览器向阿里云SLB发送SYN包;
39. SLB返回SYN+ACK包;
40. 浏览器接收SYN+ACK包;
41. 浏览器发送ACK包;
42. TCP三次握手完成,连接建立(状态ESTABLISHED);
43. 浏览器发起TLS握手,发送Client Hello消息;
44. 消息包含TLS 1.3版本、加密套件列表、SNI扩展(www.example.com);
45. SLB返回Server Hello消息,选择加密套件(如TLS_AES_256_GCM_SHA384);
46. SLB向浏览器发送SSL证书链(服务器证书+中间CA证书);
47. 浏览器接收证书并提取公钥;
48. 校验证书颁发机构、有效期、域名匹配性;
49. 校验证书签名(使用内置根CA公钥);
50. 证书校验通过,浏览器生成预主密钥;
51. 用服务器公钥加密预主密钥;
52. 向SLB发送Client Key Exchange消息;
53. SLB用私钥解密获取预主密钥;
54. 双方基于预主密钥生成会话密钥;
55. 浏览器发送Change Cipher Spec消息;
56. SLB发送Change Cipher Spec消息;
57. TLS握手完成,后续数据使用会话密钥对称加密;
58. 浏览器构建HTTP请求行(POST /login);
59. 设置请求头(Host、Content-Type: application/json等);
60. 序列化请求参数为JSON格式;
61. 计算请求体长度并补充Content-Length头;
62. 整合请求行、请求头、请求体为完整HTTP报文;
63. 浏览器用会话密钥加密HTTP报文;
64. 加密数据封装为TLS记录;
65. TCP对TLS记录分段并添加序号与校验和;
66. 第一个TCP数据段发送至SLB;
67. 接收SLB ACK确认;
68. 后续TCP段依次发送,公网加密传输准备完成;

四、公网传输层:请求跨运营商传输至阿里云入口(第131-160步)
1. 本地路由器接收主机发送的加密TCP段;
2. 路由器解析TCP段中的目标IP;
3. 查询路由表确定转发路径;
4. 标记数据出口端口;
5. 路由器转发数据至宽带猫;
6. 宽带猫识别数据为上网请求;
7. 启动PPPoE协议封装;
8. 向运营商DSLAM设备发送拨号请求;
9. DSLAM接收拨号请求;
10. 转发至运营商BRAS设备;
11. BRAS验证宽带账号密码;
12. 验证通过建立PPPoE会话;
13. 分配临时公网IP(如120.230.45.78);
14. 加密数据通过PPPoE会话传输;
15. 接入本地运营商骨干网;
16. 骨干网路由器解析目标IP;
17. 确定目标IP归属阿里云公网;
18. 选择跨运营商传输链路(若需);
19. 加密数据在骨干网中转发;
20. 经过运营商核心交换机;
21. 抵达阿里云公网边缘节点;
22. 边缘节点接收加密数据;
23. 校验数据完整性;
24. 解析PPPoE封装头部;
25. 剥离PPPoE头部获取加密TCP段;
26. 边缘节点确认目标IP为阿里云SLB;
27. 转发加密数据至阿里云内部骨干网入口;
28. 公网传输链路状态确认;
29. 加密数据成功进入阿里云网络范围;

五、阿里云网络层:请求云内接入与初步调度(第161-190步)
1. 阿里云公网网关接收加密数据;
2. 解析TCP段中的目标端口(443);
3. 触发网络ACL规则校验;
4. 匹配ACL规则(放行443端口入方向);
5. 数据转发至安全组;
6. 安全组校验客户端IP合法性;
7. 确认客户端IP在允许访问列表;
8. 安全组放行数据;
9. 加密数据抵达SLB负载均衡设备;
10. SLB接收加密TCP段;
11. 重组TCP段为完整TLS记录;
12. SLB用私钥解密TLS记录,获取明文HTTP请求;
13. SLB初始化负载均衡算法(如加权轮询);
14. 读取后端服务器健康检查状态;
15. 过滤不健康的网关节点;
16. 用轮询算法选择目标网关节点;
17. 构建SLB转发表项;
18. 标记请求来源信息;
19. 转发明文请求至选中的网关节点;
20. 网关节点接收明文请求;
21. 确认请求格式符合要求;
22. SLB返回转发成功确认;
23. 阿里云网络层记录请求轨迹;
24. 设定请求超时监控;
25. 确认云内网络链路通畅;
26. 网关节点准备接收后续数据;
27. 阿里云公网网关更新转发状态;
28. 安全组记录访问日志;
29. 网络ACL更新流量统计;
30. 阿里云网络层调度完成(内网明文传输启动);
31. 明文请求进入阿里云VPC;
32. 数据转发至DMZ区边界;
33. 边界防火墙启动规则校验;
34. 校验请求目标为网关服务;
35. 确认DMZ区仅允许访问网关;
36. 防火墙放行请求;
37. 明文请求进入K8S集群网络;
38. 经过K8S节点网络接口;
39. 节点内核网络模块接收数据;
40. 被iptables规则拦截(匹配KUBE-NODEPORTS链);
41. 进行DNAT转换,目标地址改为Pod IP(如10.244.1.15:8080);
42. Calico网络插件检测到数据;
43. Calico解析请求中的目标Service IP;
44. 查询Service与Pod的映射关系;
45. 构建Calico网络转发规则;
46. 标记请求所属命名空间;
47. 确认命名空间隔离策略;
48. 明文数据通过Calico网络转发至目标网关Pod;

六、云服务器网络结构层:云内隔离与K8S调度(第221-260步)
1. 网关Pod的eth0接口(veth pair一端)接收数据;
2. 数据进入Pod的网络命名空间(Network Namespace);
3. Pod内Linux内核网络栈处理数据;
4. 检查Pod网络状态正常;
5. K8S Service记录转发日志;
6. Calico更新网络流量统计;
7. 边界防火墙记录DMZ区访问日志;
8. 确认云内网络隔离有效;
9. 网关Pod准备处理明文请求;
10. K8S节点监控转发状态;
11. 确认请求未跨命名空间违规访问;
12. 云内网络转发链路锁定;
13. 网关Pod的容器网络接收明文数据;
14. 容器内网络栈初始化处理;
15. 明文数据从容器网络进入应用层;
16. K8S调度层完成转发;
17. 记录Pod访问轨迹;
18. 校验Pod资源可用状态;
19. 确认请求到达正确的网关实例;
20. 云服务器网络结构层流程结束;
21. 移交控制权至网关应用;
22. 释放云内网络转发临时资源;
23. 网关应用准备解析明文请求;

(未完待续)

从点击鼠标到登录成功512步精简版(一)

考核题目:
你是一名优秀的资深开发人员,用K8S+SpringCloud+MySQL写了一个网站,部署在阿里云上。你使用笔记本电脑的浏览器,打开了网站登录页面,已经输入好了用户名、密码和验证码,鼠标光标也已经移动到了登录按钮上。
请问,从你按下了鼠标左键,到你看到登录成功后的页面,会发生哪些事情。要求从按下鼠标产生一个电信号开始,请简要回答,步骤在100步以上。

考核目标:
该题目,可以考核面试者对硬件、操作系统、浏览器、网络、服务器、K8S、Spring、Java容器、JVM、数据库、日志、安全措施等相关知识领域。

解题思路:
本流程严格遵循“硬件→系统→浏览器(含公网TLS加密)→公网→阿里云(含TLS解密)→云内调度→网关→服务→数据库→响应→渲染”的实际事件顺序,遵循“公网TLS加密传输、内网不加密传输”原则,结合硬件MCU处理、内核中断机制、TLS 1.3握手、容器网络转发等关键技术细节,每一步仅保留核心动作。
一、硬件层:鼠标点击产生电信号(第1-30步)
1. 手指触碰鼠标登录按钮;
2. 按压触发微动开关闭合;
3. 开关闭合产生原始电信号;
4. 鼠标主控芯片(MCU)接收电信号;
5. MCU检测GPIO引脚电平变化(高→低);
6. MCU以1ms轮询率扫描按键状态,完成防抖处理;
7. MCU读取DPI传感器数据,获取指针精确坐标(如x=1250, y=863);
8. MCU将按键事件封装为USB HID协议数据包(格式示例:[0x01, 0x01, 0x00, 0xE2, 0x03, 0x5F, 0x02]);
9. 若为USB鼠标,启动USB协议封装并添加CRC校验和;
10. 鼠标通过USB 2.0差分信号线(D+/D-)向主机传输数据;
11. 主机USB控制器检测到数据;
12. USB控制器解析数据帧并验证校验和;
13. 若为蓝牙鼠标,启动蓝牙协议编码;
14. 蓝牙模块发送无线信号;
15. 主机蓝牙接收器接收信号;
16. 蓝牙接收器解码信号;
17. 主机硬件中断控制器识别信号类型;
18. 触发鼠标事件硬件中断(如IRQ 16);
19. 中断控制器向CPU发送中断请求;
20. CPU暂停当前任务响应中断;
21. CPU保存当前进程上下文(寄存器值、程序计数器)到内核栈;
22. 跳转到IDT(中断描述符表)对应的中断服务例程;
23. 内核USB HID驱动程序执行,读取USB控制器FIFO缓冲区数据;
24. 内核将HID事件转换为标准输入事件(struct input_event,类型EV_KEY,键码BTN_LEFT);
25. 事件被写入/dev/input/event2设备文件(鼠标对应字符设备);
26. X11/Wayland桌面环境从设备文件读取事件;
27. 桌面环境将内核输入事件转换为GUI事件(MouseDownEvent);
28. 事件通过IPC发送到浏览器主进程(如pid=12345);
29. 浏览器主进程UI线程将事件放入消息队列(MessageQueue);
30. 硬件层完成信号转换与系统层事件投递;

二、操作系统层:鼠标事件处理与浏览器通知(第31-75步)
1. 浏览器UI线程从消息循环(MessageLoop::Run())取出事件;
2. 浏览器进行命中检测(Hit Testing),遍历渲染树(Render Tree);
3. 确认点击坐标对应的DOM元素为登录按钮(button id=”login-btn”);
4. 操作系统输入子系统扫描内存缓冲区;
5. 读取鼠标事件原始数据;
6. 解析事件类型为“左键点击”;
7. 提取点击坐标(X/Y轴);
8. 窗口管理器确认所属窗口为浏览器进程;
9. 校验消息发送者合法性;
10. 解析消息中的点击事件详情;
11. 确认登录按钮处于可点击状态;
12. 触发按钮点击事件回调;
13. 前端JS引擎(V8)接收回调通知;
14. V8查找关联的事件监听器函数(如handleLogin());
15. 若未编译,V8触发JIT编译将JS函数转为机器码;
16. V8创建函数调用栈帧,压入this(指向button)和event参数;
17. 执行登录按钮绑定的校验函数;
18. 调用event.preventDefault()阻止默认行为;
19. 校验用户名输入框非空;
20. 校验密码输入框非空;
21. 若校验通过,标记表单可提交;
22. 读取用户名输入框值(如”zhangsan”);
23. 读取密码输入框值(如”Pass@1234″);
24. 读取验证码输入框值(如”8A7F”);
25. 组装登录表单基础数据;
26. 调用JSON.stringify()序列化数据为JSON格式;
27. 通知浏览器主线程准备发起请求;
28. 主线程确认表单数据完整;
29. 操作系统释放事件占用内存;
30. 输入子系统重置缓冲区;
31. 窗口管理器解除事件锁定;
32. 浏览器进程标记事件处理完成;
33. 检查浏览器网络模块就绪状态;
34. 确认系统网络栈可用;
35. 操作系统向浏览器返回资源可用信号;
36. 浏览器初始化网络请求参数;
37. 表单数据临时存储至浏览器内存;
38. 确认无系统级网络限制;
39. 操作系统层与浏览器层衔接完成;
40. 清除事件临时标记;
41. 刷新窗口焦点状态;
42. 校验浏览器进程权限;
43. 确认表单数据未被篡改;
44. 标记数据传输准备完成;
45. 系统网络接口初始化;

(未完待续)

大模型时代学习方法小结

Featured

最近和几个朋友聊天的时候,大家稍微总结了一下大模型时代要如何快速学习,汇总了几个典型的方式:

方法1:在你有一定了解的领域,把AI当做有无限耐心的老师,无限提问法
1、当你想深入了解一个事情的时候,可以用清晰的命令描述好自己的问题,去多个AI同时发送该问题。
2、对每个AI反馈的内容进行初筛,最终保留2~3个候选AI
3、用靠谱的那个AI,去进一步咨询自己想理解的问题
4、不断的拓展问题的广度和深度,在这个过程中,最好记录一个思维导图,对于想进一步理解的点,做好标记
5、用适合自己的学习方式,把这些知识点逐一搞清楚
6、当AI不断说车轱辘话的时候,先更换说书,后尝试备选AI
7、一个不理解、但很重要的知识点,多发给几个AI,让他们交叉验证
8、请AI把整个过程的资料,梳理为笔记或思维导图
其实大家可以看到,知识面比较广的、求知欲强的、能提出好问题的、有一定较真精神的人,在AI时代会有更多的优势

方法2、在你很不了解的领域,把AI当做向导
1、当你想了解一个陌生事情的时候,可以要求AI先对该领域知识做一个思维导图的摘要,去多个AI同时发送该问题
2、对每个AI反馈的内容进行初筛,最终保留2~3个候选AI,此时你对这个领域有了初步的理解
3、对你感兴趣的要点,要求AI对思维导图进行扩展,并多举示例
4、对其中某个细节问题,不清楚的,调整到“方法1”
5、关键点要做好交叉验证
6、请AI把整个过程的资料,梳理为笔记或思维导图
其实大家可以看到,在AI的加持下,很多技术的专业护城河,已经消失了。在一个行业不够纵深的人,会变得难以生存。以后,行业新人很可能会变得更难找好的工作,因为门槛没了,谁都能做。

方法3、一个任务多用几个AI,让他们相互印证补充
先把一个问题描述清楚,约定好输出格式和输出要求,同时发给A、B、C、D四个模型。
先判断哪个模型输出效果最好,比如模型A。
将其他模型B、C、D的输出,给到模型A,要求进行检查及补充。
然后要A,进行检查补充。
然后把A最后的信息,给到第二好的B,再进行检查及补充。
一般来说,此时输出质量就很高了,如果不行就再来一轮。

方法4、日常工作生活中,把AI当做助理或外脑
相信这方面大家都会有很多尝试,从写总结报告到完成PPT,从画Excel表格到写简单代码,从P图到做视频。
在大模型当前技术水平下,大家记住一点就行:AI方便时用AI,人方便时用人,效能优先,不要纠结。

方法5、读代码时,让AI补充注释,然后对重点代码进行详细解释
相信不少同学都在用AI写代码。
但用AI去读代码也是很爽的,包括平时很少用的语言,也是很容易读懂,推荐大家试试。

划重点:快速调整自己,适配AI时代
在AI时代,几乎每个人都要抛弃过去思考、学习和工作的习惯,需要重新训练自己的思维方式,重新调整学习和工作的方法。
只有快速适应这个时代,才能快速越过“AI斩杀线”,去碾压别人,而不是被别人碾压。

目前能看到的趋势有:
1、有业务经验、能驾驭好AI工具的人,最受欢迎
2、没业务经验、能驾驭好AI工具的人,次之
3、有业务经验、不能驾驭好AI工具的人,受到冲击最大
4、没业务有经验、不能驾驭好AI工具的人,在部分行业很难生存
5、有想法、能驾驭好AI工具的人,会爆发
6、没想法的人,会吃亏