Switch-Router

Recent Posts

  • 2021-03-02

    内核TCP拥塞控制框架的两次演进

    今天的主题是内核 TCP 拥塞控制实现的两次关键变化.第一次 拥塞控制算法插件化 2005.1.24Add pluggable congestion control algorithm infrastructure.在这次 commit 之前, 内核已经支持了 reno、vegas、westwood、bic 拥塞控制算法. 但它们是直接嵌入在 tcp 的主路径中.#define tcp_is_vegas(__tp) ((__tp)->adv_cong == TCP_VEGAS)#de...

  • 2021-01-30

    socket的加锁与解锁

    在内核网络系统代码中,我们可以见到很多地方都有 lock_sock() 这类对 socket 结构的加锁操作,而也有少数地方是使用 bh_lock_sock()那么什么时候该用 lock_sock(),什么时候又该用 bh_lock_sock() ?本文结合实际内核代码稍加解释。(本文使用内核代码版本是 4.19.75,不过这个部分变化不大,其他版本内核也ok)0x0. process context 与 interrupt context我们通常将内核代码执行的上下文分为 proces...

  • 2020-11-12

    理解 TCP 初始序号选择(ISN Selection)

    本文将回顾一些 rfc 标准, 再结合 linux 内核实现解释 TCP ISN 选择. TCP 序号空间是 4G (32 bit), 通信双方在 3-way 握手阶段, 会各自选择一个初始序号填入 SYN / SYN-ACK 报文, 作为数据通信的起始序号.时间驱动 (clock-driven)为什么要特意进行 ISN 的选择? 每次都从 0 开始不行吗? 每次都随机可以吗?TCP原始标准rfc793中这样描述初始序号选择的来历: “how does the TCP identify...

  • 2020-10-25

    TCP Metrics--remove per-destination timestamp cache

    2017年3月,内核主线将TCP Metrics表项中的时间戳缓存,补丁详见patch—tcp: remove per-destination timestamp cache struct tcp_metrics_block { struct inetpeer_addr tcpm_saddr; struct inetpeer_addr tcpm_daddr; unsigned long tcpm_stamp;- u32 tcpm_ts;- u32 tcpm_ts_...

  • 2020-10-23

    内核一个 IPv6 socket 的插入顺序修改引入的 bug

    最近同事发现,当 IPv6 服务端收到大量 SYN 报文时,如果内核参数 tcp_synkooie = 1,可能出现内核重复创建 ESTABLISHED socket,然后导致应用程序多次 accept 的问题。翻了一下内核的 git 修改记录,最终确认这是这是一个在 2016 年中引入patch1patch2,又在 2017 年末修复的问题patch-fix。本文仅作记录。前置知识—TCP 连接建立的细节TCP 用四元组来区分不同的连接,对内核(4.9.29 版本)来说,它还会将 soc...