Skip to content

Latest commit

 

History

History
593 lines (367 loc) · 39.6 KB

File metadata and controls

593 lines (367 loc) · 39.6 KB

此仓库是公众号【CppGuide】文章汇总,作者是张小方,clone或转发仓库文章时时请保留作者信息。

CppGuide仓库配有专门的微信维护和交流群,加微信easy_coder备注“cppguide仓库”拉你进群。

在线阅读站点:https://cppguide.cn

在线阅读站点2:https://balloonwj.github.io/cpp-guide-web/

在线阅读站点3: http://balloonwj.gitee.io/cpp-guide-web/

如需下载该站点源码用于自己搭建站点,可以在【CppGuide】微信公众号后台回复关键字“站点下载”即可得到搭建本仓库的站点的全套源码。

Part I

Part II

Part III

libevent源码深度剖析

leveldb源码分析

Memcached源码分析

游戏开发专题

Linux内核专题——心中的内核

大型专栏:Linux网络编程从应用层到内核实现源码详解

大型专栏:Linux网络编程从应用层到内核实现源码详解

第 02 篇 · 工具箱:读源码的工具,和看内核的工具

第 03 篇 · 三层派发总纲:socket 函数如何找到它的内核实现

第 04 篇 · 读内核网络代码的最小 C 知识

第 05 篇 · 谁在和你抢同一个 socket:lock_sock() 到底锁了什么

第 06 篇 · sk_buff(上):一块内存如何同时是帧、是包、是段

第 07 篇 · sk_buff(下):非线性区、克隆与引用计数

第 08 篇 · skb 的分配与回收:一个包的内存从哪来,又还到哪去

第 09 篇 · struct socket  与 struct sock:为什么一个连接要两个结构体

第 10 篇 · sk 的队列与内存记账:SO_SNDBUF 到底限制了什么

第 11 篇 · net_device 与多队列模型:网卡在内核里长什么样

第 12 篇 · network namespace:struct net 为什么无处不在

第 13 篇 ·  socket() :一个 fd 的诞生

第 14 篇 · bind():端口哈希表的秘密

第 15 篇 · listen():两个队列的真相

第 16 篇 · connect():三次握手的发起端

第 17 篇 · accept():从全连接队列取一个 sk

第 18 篇 · 一次连接的完整生命周期:从第一个 SYN 到最后一个 FIN

第 19 篇 ·  send 家族:msghdr 与 iov_iter

第 20 篇 · recv 家族:从接收队列拷贝出来

第 21 篇 · 阻塞与非阻塞:同一段代码,只差一个 timeo

第 22 篇 · setsockopt 的一生:level 派发与 sockptr_t

第 23 篇 · 选项 vs sysctl vs cgroup:谁说了算

第 24 篇 · cmsg:被忽略的另一半接口

第 25 篇 · select/poll/epoll:唤醒链是怎么接起来的

第 26 篇 · epoll 内部:一棵红黑树、一条就绪链、一次 ep_poll()

第 27 篇 · close() 与 shutdown():语义差异的内核根源

第 28 篇 · sendfile/splice/mmap:绕开用户态缓冲区

第 29 篇 · 同步与异步:SIGIO 那一代,和 io_uring 那一代

第 30 篇 · tcp_sendmsg_locked:用户数据如何变成 skb

第 31 篇 · tcp_push 与 Nagle:数据什么时候真的发出去

第 32 篇 · tcp_transmit_skb:TCP 头是怎么拼出来的

第 33 篇 · 八个标志位,各自由谁置上

第 34 篇 · 滑动窗口:四个序号,两个窗口

第 35 篇 · TSO / GSO:一个 skb 怎么变成多个报文

第 36 篇 · ip_queue_xmit:路由查找与 IP 头组装

第 37 篇 · 拥塞控制框架:tcp_congestion_ops 的回调表

第 38 篇 · 重传定时器与 RTO:超时时间怎么算出来,超时之后做什么

第 39 篇 · 快速重传与尾部丢包探测:不等 RTO 就判出丢包的两条路

第 40 篇 · RACK:按发送时间判定丢包

第 41 篇 · undo:判错之后怎么撤销这次拥塞窗口下调

第 42 篇 · 邻居子系统、ARP 与 __dev_queue_xmit

第 43 篇 · 从硬中断到软中断:napi_schedule

第 44 篇 · net_rx_action:软中断主循环与 budget

第 45 篇 · threaded NAPI、napi_config 与 busy_poll

第 46 篇 · 驱动 poll 内部:从 DMA 描述符环到 skb

第 47 篇 · GRO:把小报文粘成大报文

第 48 篇 · __netif_receive_skb_core:packet_type 分发与 RPS/RFS

第 49 篇 · ip_rcv到 ip_local_deliver:IP 层收包的三道关

第 50 篇 ·tcp_v4_do_rcv:socket 查找、backlog 与 prequeue 的消亡

第 51 篇 · tcp_rcv_established:快速路径为什么快

第 52 篇 · tcp_ack 与 SACK 处理:收到一个 ACK,发送方更新哪些状态

第 53 篇 · 乱序队列:一棵红黑树,进树、出树与内存不够时先丢谁

第 54 篇 · 延迟 ACK、QUICKACK 与 ACK 压缩

第 55 篇 · 状态机:握手、挥手、TIME_WAIT 与保活

第 56 篇 · CUBIC 与 BBR 源码对读

第 57 篇 · 接收窗口与内存自动调优

第 58 篇 · 路由子系统与 dst_entry 的生命周期

第 59 篇 · FIB trie、策略路由与 nexthop 对象

第 60 篇 · netfilter:hook 点如何嵌进收发路径

第 61 篇 · TC 与 qdisc:pfifo_fast、fq、fq_codel

第 62 篇 · 桥接与 VLAN:帧进桥之后怎么查表转发,VLAN 标签在哪一步加减

第 63 篇 · 隧道与封装:一个帧被 VXLAN 套上 50 字节,再原样拆开的全程

第 64 篇 · XDP:在 skb 诞生之前拦截

第 65 篇 · eBPF 网络钩子全景

第 66 篇 · 硬件卸载:NETIF_F_*如何改变代码路径

第 67 篇 · BIG TCP:64KB 这道上限卡在哪,内核用什么办法绕过去

第 68 篇 · devmem TCP:数据直落 GPU 内存

第 69 篇 · io_uring 零拷贝收发

第 70 篇 · MPTCP 与 PSP:新协议如何嵌进旧框架

第 71 篇 · dropreason 与观测工具箱:内核怎么给出丢包原因码,你又怎么读到它

第 72 篇 · 性能排查实战:四个现场案例,以及怎么把这套方法用到你自己的内核上

远程控制软件源码

入云龙远程控制系统 · 从零开发

第 1 课 课程导览:你将亲手做出什么

第 2 课 四个角色的分工:用对讲机和快递站打比方

第 3 课 开发环境搭建:把工具一个个装好

第 4 课 工程基本功:CMake 工程怎么搭、编译、调试、出包

第 5 课 立规矩:编码规范与工程纪律

第 6 课 Probe First 准则:先跑测试再改正式代码

第 7 课 master 界面整体设计:先画线框,定四大分区

第 8 课 主控面板首页设计:让人一眼知道能干嘛

第 9 课 设备栏 + 多 tab 工作区:开页、关页、掉线自动关

第 10 课 总体技术方案鸟瞰:每个选型为什么这么选

第 11 课 自己设计一套暗号:二进制协议入门

第 12 课 用 libuv 写最简单的网络程序:异步回调思维

第 13 课 master 骨架:一个窗口,背后挂一个网络线程

第 14 课 agent 骨架:balloonui 自绘窗口

第 15 课 先定 UI 规范:主题 token、Toast 三色、组件库

第 16 课 日志地基:落盘约定 / 滚动 / 级别 / 立即落盘

第 17 课 第一次握手:设备列表里冒出一台真机

第 18 课 控制通道 ControlChannel:把收发收口成一个盒子

第 19 课 心跳与掉线:脉冲状态点与掉线善后

第 20 课 帧的统一收口 FrameCodec

第 21 课 为什么要加密:握手密钥交换(讲人话)

第 22 课 端到端加密落地

第 23 课 信令链路加密:端到服务器那一段

第 24 课 压缩:让数据更小、省流量

第 25 课 PayloadTransform:加密 + 压缩串成一条流水线

第 26 课 三种连法总览:直连 → 打洞 → 中转

第 27 课 信令服务器 rylss(一):注册与查找

第 28 课 信令服务器 rylss(二):撮合与打洞中继

第 29 课 中转服务器 rylsr:按 UUID 配对、字节透传

第 30 课 NAT 与打洞原理

第 31 课 UDP 打洞实战

第 32 课 KCP:让不可靠的 UDP 变可靠

第 33 课 连接状态机:超时、回退与指标上报界面

第 34 课 一键生成 agent:配置塞进 exe 尾部

第 35 课 副连接 AuxiliaryConnection:主通道之外的旁路

第 36 课 连接管理 / 网络监视器(master 这侧)

第 37 课 agent 升级(一):下发新版本

第 38 课 agent 升级(二):自我替换 + 失败回滚

第 39 课 远程拉取三件套:拉日志 / 拉 dump / 拉屏幕截图

第 40 课 权限与授权弹窗 + 审计日志

第 41 课 为什么要插件化

第 42 课 插件 SDK 与宿主:tab 的一生、掉线自动关

第 43 课 写第一个插件 hello-world:两端最小闭环

第 44 课 插件下发机制:自动推、去重、独立副连接

第 45 课 两端的插件 UI 宿主

第 46 课 统一的传输管理设计

第 47 课 远程终端(一):接管命令行

第 48 课 远程终端(二):中断、历史与单会话收口

第 49 课 远程屏幕(一):屏幕采集

第 50 课 远程屏幕(二):编码与推流

第 51 课 远程屏幕(三):master 端解码显示

第 52 课 远程屏幕(四):鼠标键盘输入回传

第 53 课 远程屏幕·业务①:远程桌面

第 54 课 远程屏幕·录屏

第 55 课 远程屏幕·屏幕墙

第 56 课 远程屏幕·屏幕广播

第 57 课 远程屏幕·屏幕中转

第 58 课 文件管理(一):双栏浏览

第 59 课 文件管理(二):传输引擎与队列

第 60 课 远程聊天:文字 / 图片 / 表情 / 历史

第 61 课 语音视频通话(一):音频

第 62 课 语音视频通话(二):视频 + 通话交互

第 63 课 系统管理(一):进程 / 服务 / 启动项 / 网络连接

第 64 课 系统管理(二):注册表 / 事件日志 / 磁盘 / 计划任务

第 65 课 设备管理进阶:分组 / 收藏置顶 / 批量 / 持久化

第 66 课 公告 / 电源启动 / 杂项

第 67 课 打包与部署

Part IV

贡献者

你也可以给该仓库提交修改内容,如果你的 PULL Requeset 被采纳,你的名字将会出现在贡献者列表中。

如果您在阅读上述文章的过程中有任何问题或者建议,可以加本仓库微信交流群交流,可以先微信 cppxiaofang,备注“CppGuide”,备注不对不加哦。

仓库中部分文章来源于网络,侵权请联系删除。

本仓库备份QQ交流群:169315117

捐赠与支持

如果你觉得本仓库对你有帮助,想可以请小方喝杯咖啡,扫描下面的任一二维码捐赠即可。

Good Luck and Enjoy it!