对 Google TCP BBR 的浅薄认识

关于 Google 发布的新的 TCP 拥塞控制算法 BBR (Bottleneck Bandwidth and RTT) 的一些记录,仍然在学习中,难免有误解。之后会持续修正和完善。 网络链路上的包比较少时,道路很通畅,这个阶段,对于一个 TCP 连接来说,它的速度由这个连接两端之间的距离决定,也可以说是由 RTT 决定。当发包速率变大,把道路基本上填满了之后,这个阶段,带宽的大小决定了这个连接的速度,这时两端之间可能就会有包要排队,延迟时间除了 RTT 还有排队时间。 BBR 目的是要尽量跑满带宽,并且尽量不要有排队的情况。 cwnd 是普通的拥塞控制算法里最终要求得的一个值,用来控制发包速率。BBR 也要求到这个值,但是它不是最主要的控制发包速率的变量,主要的变量是 pacing_rate。 这两个变量都由探测到的带宽值和 RTT 值得到,整个过程都围绕着这两个值。在 BBR…

用 epoll 的 echo 程序

完整代码放在最前面,只是一个简单的 echo 程序,没有业务逻辑,收到数据之后立即发送回去。然而,还是有些细节值得记录一下,关于 TCP Server 通常需要设置的 TCP 套接字属性,屏蔽 SIGPIPE 信号,以及最重要的:如何使用 epoll,ET 模式和 LT 模式是怎样的。 #include <stdio.h> #include <unistd.h> #include <stdint.h> #include <stdlib.h> #include <fcntl.h> #include…

检测递归 DNS 的后端 IP

我想知道当我请求 114.114.114.114 或者 8.8.8.8,它们的后端都有什么。我在授权 DNS 设置了分线路的记录,请求当地递归却收到了其他线路的结果,我想知道这个当地递归后端是什么。实际上,当我向递归发起请求之后,最终授权 DNS 收到的来自递归 DNS 的请求,是来自什么地址。 我们要找个办法,把递归向授权的请求“引导”到一个容易看到的地方来。 首先给我一个子域名设置一条 NS 记录,这个 NS 指向我自己的 VPS 地址 back.fixatom.com NS ns.fixatom.com ns.fixatom.com A 1.2.3.…

HTTP 和 TCP 的 KEEP ALIVE

先把结论放这:TCP 的 keepalive 和 HTTP 请求和响应的包头里的 keepalive 不是一回事。 TCP 的 keepalive 是用来检查 TCP 连接的对方是否还“活着”,Linux 有三个参数跟 keepalive 有关。 tcp_keepalive_time 一个连接闲了一定时间,就发 keepalive 的消息,这个时间长度是由 tcp_keepalive_time 来指定。 tcp_keepalive_probes 指定发送多少个 keepalive 探测包。如果对方回了 keepalive 探测包,说明对方还在,就继续保持这个连接。 tcp_keepalive_intvl 指定发送 keepalive 探测报的间隔时间。跟…

对 Linux TCP 的若干疑点和误会

整理了一下 Linux 的 TCP 相关的几个疑点和对以往错误认识的纠正。主要是系统出现大量 TIME_WAIT 和 SYN 请求的一些问题,以及一些 TCP 内核参数的意义。 提到的参数(选项)大都在 /proc/sys/net/ipv4/,如果需要永久生效,希望做到重启也不变,可以修改 /etc/sysctl.conf 里 net.ipv4.tcp_*。 1. 关于 TIME_WAIT 按照网络上很多文章的说法,当 Linux 服务器上出现大量 TIME_WAIT 状态时,可以通过对 TCP 相关的几个内核参数的修改,来减少 TIME_WAIT 状态。最常看到的是这两个…