Switch-Router

Recent Posts

  • 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...

  • 2020-09-30

    Linux内核中reuseport的演进

    SO_REUSEPORT选项在Linux 3.9被引入内核,在这之前也有一个很像的选项SO_REUSEADDR。如果你不太清楚这两者的区别和联系,可以先阅读How do SO_REUSEADDR and SO_REUSEPORT differ?。如果不想读,那么下面这一节算是为懒人准备的。SO_REUSEADDR 与 SO_REUSEPORT 是什么?TCP/UDP用五元组唯一标识一个连接。任何时候,两条连接的五元组都不能完全相同,否则当收到一个报文时,协议栈没办法判断它是属于哪个连接的。...

  • 2020-09-23

    内核TCP Metrics框架

    TCP是一个复杂的协议,这种复杂来源于对报文传输的可靠性承诺。对每条TCP连接来说,除了有独立的状态机、定时器之外,还有拥塞控制相关的一些运行变量,比如RTT、CWND、SSTHRESH等,这些运行参数同样也是每连接(Per-Connection)的Per-Connection意味着每条连接的这些参数互不影响,这是理所应当的!但是,想想这个情景:A与B之间已经建立了一条稳定的TCP连接,此时若新建一条新的连接,它的参数该如何设置呢?显然,和原连接保持一致是个快速达到稳定的办法。这就好比一个...