Switch-Router

Recent Posts

  • 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连接,此时若新建一条新的连接,它的参数该如何设置呢?显然,和原连接保持一致是个快速达到稳定的办法。这就好比一个...

  • 2020-07-25

    内核 strparser 是如何工作的

    strparser 是怎么工作的strparser是 Linux 内核在 4.9 版本引入的 feature (https://lwn.net/Articles/703116/)。它允许用户在内核层面拦截送往 TCP 套接字的报文并做自定义的处理。处理的地方可以是内核模块,也可以是 eBPF 程序。 内核模块处理截获报文的例子:KTLS(https://github.com/ktls/af_ktls)KTLS 这个 feature 已经进入内核代码主线了,它的设计思想是让 TLS 需要的...

  • 2020-05-21

    backlog参数对TCP连接建立的影响

    曾经有人问我套接字编程中listen的第二个参数backlog是什么意思?多大的值合适?我不假思索地回答它表示服务器可以接受的并发请求的最大值。然而事实真的是这样的吗?TCP通过三次握手建立连接的过程应该都不陌生了。从服务器的角度看,它分为以下几步 将TCP状态设置为LISTEN状态,开启监听客户端的连接请求 收到客户端发送的SYN报文后,TCP状态切换为SYN RECEIVED,并发送SYN ACK报文 收到客户端发送的ACK报文后,TCP三次握手完成,状态切换为ESTABLI...

  • 2020-03-28

    eventfd + SCM_RIGHTS 在进程间通信中的运用

    eventfd 与进程间通信Linux 环境下,不同进程间进行数据通信是一个十分常见的需求,通常我们可以使用 Unix Socket 很轻松的完成它。不过,如果传输的数据量比较大,那么使用共享内存或许是一个更好的解决方案。一般地共享内存方案大概归结为以下几步: 进程 A 将要共享的数据放到共享内存区域 进程 A 通知进程 B 可以去共享内存区域读取数据 进程 B 去共享内存区域读取数据虽然我们还是绕不开进程间通信,但这么一分解,通知的数据量明显少了很多(只有第 2 步中的”踢一脚”)...