Skip to content

Latest commit

 

History

56 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

此仓库是公众号【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 篇 · 性能排查实战:四个现场案例,以及怎么把这套方法用到你自己的内核上

Part IV

贡献者

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

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

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

本仓库备份QQ交流群:169315117

捐赠与支持

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

Good Luck and Enjoy it!

About

C/C++学习,后端开发进阶指南。

Resources

Stars

6.3k stars

Watchers

71 watching

Forks

Releases

Packages

Contributors