Recent Posts
-
2020-03-28
eventfd + SCM_RIGHTS 在进程间通信中的运用
eventfd 与进程间通信Linux 环境下,不同进程间进行数据通信是一个十分常见的需求,通常我们可以使用 Unix Socket 很轻松的完成它。不过,如果传输的数据量比较大,那么使用共享内存或许是一个更好的解决方案。一般地共享内存方案大概归结为以下几步: 进程 A 将要共享的数据放到共享内存区域 进程 A 通知进程 B 可以去共享内存区域读取数据 进程 B 去共享内存区域读取数据虽然我们还是绕不开进程间通信,但这么一分解,通知的数据量明显少了很多(只有第 2 步中的”踢一脚”)...
-
2020-02-11
win-minmax(窗口中的最值)算法
一个问题如果让你设计这样一个信号峰值采集系统,你会如何设计呢? 系统每 1s 都可能接收到外界发送的一定强度的一个信号,且信号的强度在 [1,100] 范围内 你需要提供一个查询服务,向调用者返回在过去 30s 内信号强度的最大值最朴素暴力的办法是使用一个能容量为 30 的环形数组,将每秒收到的信号的强度值记录在里面(如果没收到就视为 0),当有人查询时,遍历整个数组,找到最大的值然后返回,如 Figure-1 所示.WRITE表示新收到的值写入的位置。Figure.1这样的系统能用肯...
-
2020-01-13
TCP拥塞控制之ABC(Appropriate Byte Counting)
ABC 的来源我们知道,TCP 发送端的数据发送速度受到本端拥塞窗口(cwnd)和对端通告的接收窗口(rwnd)的限制,只有同时在这两个窗口内的待发送数据才允许被发送到网络中。其中对端接收窗口是由对端接收缓冲区确定的,由于本文主要关注拥塞窗口,因此不考虑接收窗口的影响(视为接收窗口很大很大)。而拥塞窗口的大小则是由不停的拥塞控制算法计算而来。经典的拥塞控制算法都至少包含慢启动(Slow Start)和拥塞避免(Congestion Avoid)两个阶段。通常我们这样描述这两个阶段的窗口增加...
-
2020-01-01
一个 TCP 接收缓冲区问题的解析
本文是作为一个 TCP 发送缓冲区问题的解析的姊妹篇存在的,在 TCP 中,接收缓冲区比发送缓冲区更为重要和复杂,原因就是,接收缓冲区和 TCP 通告的窗口也息息相关。问题模型Clinet 与 Server 之间建立一条 TCP 连接,Server 通过 SO_RCVBUF 选项设置连接的接收缓冲区为 2048 字节。Clinet 每隔 100 ms 通过 send() 一个载荷长度很小(2 字节)的 TCP 报文,但 Server 端不调用 recv(),这意味着 Server 收到的 ...
-
2019-12-20
一个 TCP 发送缓冲区问题的解析
最近遇到一个问题,简化模型如下:Client 创建一个 TCP 的 socket,并通过 SO_SNDBUF 选项设置它的发送缓冲区大小为 4096 字节,连接到 Server 后,每 1 秒发送一个 TCP 数据段长度为 1024 的报文。Server 端不调用 recv()。预期的结果分为以下几个阶段:Phase 1. Server 端的 socket 接收缓冲区未满,所以尽管 Server 不会 recv(),但依然能对 Client 发出的报文回复 ACK;Phase 2. Ser...