Switch-Router

Recent Posts

  • 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 步中的”踢一脚”)...

  • 2020-03-11

    Linux内核协议栈中一些关于 TCP MSS 的细节

    为什么会有 MSS (Maximum Segment Size) 这种东西呢?我们知道网络报文在线缆中以是有长度限制的,比如标准的以太网接口能允许通过的以太帧长度上限是 1518 字节。超过了这个长度的数据必然会被分成多个报文发送,这个工作 IP 层可以做,也就是熟知的 IP 分片(Fragment)过程。但如果是承载 TCP 数据的 IP 报文分片后,某个分片在传输路径上丢失了,则会引起整个 TCP 报文的重传。因此,TCP 会在自己这一层就将用户数据按一定长度’切割’好之后再递交给 I...

  • 2020-02-11

    win-minmax(窗口中的最值)算法

    一个问题如果让你设计这样一个信号峰值采集系统,你会如何设计呢? 系统每 1s 都可能接收到外界发送的一定强度的一个信号,且信号的强度在 [1,100] 范围内 你需要提供一个查询服务,向调用者返回在过去 30s 内信号强度的最大值最朴素暴力的办法是使用一个能容量为 30 的环形数组,将每秒收到的信号的强度值记录在里面(如果没收到就视为 0),当有人查询时,遍历整个数组,找到最大的值然后返回,如 Figure-1 所示.WRITE表示新收到的值写入的位置。Figure.1这样的系统能用肯...