> ## Content Index
> Fetch the complete content index at: https://tbbbk.com/llms.txt
> Use this file to discover other available public pages before exploring further.

# TCP 调优：对代理速度有影响吗？
- URL: https://tbbbk.com/tcp-optimization-for-proxy/
- Published: 2025-12-09T02:29:00.000Z
- Updated: 2026-10-22T04:03:22.000Z
- Author: TuBaiBai
- Tags: VPS 与云服务, 踩坑记录, #Import 2026-07-20 07:13

之前买了一个 DMIT 的小鸡，线路是针对大陆优化的CN2 GiIA，但是使用起来还是感觉有一些断流与延迟，想着以前貌似刷到过相关调试系统的帖子，可以调节流量重传什么的，于是网上搜了搜，大致了解了下，管他有用没用，先试试再说。

## 下面都是我了解到的一些概念📚：

本指南将深入讲解 Linux TCP 缓冲区的核心概念，并手把手教你结合 **BDP（带宽时延积）** 理论与 iPerf3 实测数据，科学地调整 `net.ipv4.tcp_wmem` 和 `net.ipv4.tcp_rmem` 参数，找到适合你网络环境的“甜蜜点”，从而大幅提升吞吐量、减少数据重传，让服务器网络性能实现质的飞跃！

### 1\. TCP 发送/接收缓冲区 (wmem & rmem)

- `net.ipv4.tcp_wmem` (Write Memory)：这是 **TCP 发送缓冲区**。当应用程序发送数据时，数据会先暂存在这里，然后由内核发送出去，并等待对端的 ACK 确认。如果此缓冲区太小，在“高带宽 × 高延迟”的网络中，发送方会因为缓冲区被迅速填满而频繁暂停，无法持续地向网络管道中输送数据，导致带宽利用率低下。
- `net.ipv4.tcp_rmem` (Read Memory)：这是 **TCP 接收缓冲区**。它用于存放从网络中接收到、但尚未被应用程序读取的数据。

这两个内核参数都接受三个整数值，单位为字节 (Byte)，其格式为 `min default max`：

- **min**：为每个 TCP 连接分配的最小缓冲区大小。这是一个保障值，确保即使在内存压力下也能维持连接。
- **default**：默认的缓冲区大小。它会覆盖在 `net.core` 中定义的全局默认值。
- **max**：允许为 TCP 连接自动分配的最大缓冲区大小。**这是调优的绝对重点！**

### 2\. 单位辨析：别被 b 与 B、MB 与 MiB 迷惑

- **bit (b) vs Byte (B)**：网络带宽通常以 **bps** (bits per second) 为单位，而操作系统和文件系统则使用 **Byte**。请牢记换算关系：**1 Byte = 8 bits**。因此，100 Mbps 的带宽，其理论最大下载速度是 `100 / 8 = 12.5 MB/s`。
- **MB vs MiB**：这是一个长期存在的混淆点。

  - **MB (Megabyte)**：基于**十进制**，`1 MB = 1,000,000 Bytes`。这通常是硬盘厂商用来计算容量的单位。
  - **MiB (Mebibyte)**：基于**二进制**，`1 MiB = 1,024 KiB = 1,048,576 Bytes`。操作系统（如 Linux 和 Windows）内部通常使用这个单位，尽管有时界面上可能仍显示为 "MB"。

在本次调优中，将严格使用与内核参数一致的**二进制单位 (Bytes, KiB, MiB)** 进行计算。

## 准备工作：工欲善其事，必先利其器 🛠️

在开始调优前，首先确保拥有服务器的 `root` 权限。没有的话可以不用看了。

### 1\. 检查当前配置 🔍

首先，记录当前的系统配置，运行下面的命令建立个记事本记录下来，万一弄坏了可以恢复。

```bash
# 查看当前 TCP 发送缓冲区设置
sysctl net.ipv4.tcp_wmem
查看当前 TCP 接收缓冲区设置
sysctl net.ipv4.tcp_rmem
查看当前使用的拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
查看当前默认的队列调度算法

```

### 2\. 启用 BBR + FQ（强烈推荐）🔥

现在一般都会开启BBR，系统一般都是自带的，通过命令启用就可以了。

> **BBRFQ (Fair Queue)**

如果系统尚未启用，可以通过以下命令添加并持久化配置：

```bash
# 将 BBR 和 FQ 的配置写入 sysctl.conf 文件
echo "net.core.default_qdisc=fq" | sudo tee -a /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" | sudo tee -a /etc/sysctl.conf
立即应用配置，无需重启

```

### 3\. 安装 iPerf3 测试工具 📊

一般需要使用 `iPerf3` 来精确地测量本地客户端与服务器之间的网络性能，也是验证调优效果的神器。

**在服务器 (Linux) 上安装:**

```bash
# Debian / Ubuntu
sudo apt update && sudo apt install iperf3 -y
CentOS / RHEL
sudo yum install epel-release -y && sudo yum install iperf3 -y
Fedora

```

**在客户端 (例如 Windows) 上安装:**  
从 [iPerf3 官网](https://iperf.fr/) 下载 Windows 版本，解压后即可在命令行中使用。非常简单！

### 4\. 配置防火墙 🛡️

如果服务器启用了防火墙（如 UFW、firewalld），确保开放 iPerf3 的默认端口 `5201`。

```bash
# UFW (Ubuntu/Debian) 示例
sudo ufw allow 5201/tcp
firewalld (CentOS/RHEL) 示例

```

## 实战调优：从理论计算到迭代精调 ⚔️

### 阶段一：计算理论最优值 (BDP)

调优的起点是计算**带宽时延积 (Bandwidth-Delay Product, BDP)**。BDP 代表了在网络链路上“飞行”的最大数据量，它也是理论上最优的缓冲区大小。

太长不看，可以直接用别人写好的工具：

[TCP 迷之调参](https://omnitt.com/)

可以用计算出来的值，作为初始值，再慢慢找的适合自己网络的

**BDP 公式:**  
$$BDP \\ (Bytes) = \\frac{Bandwidth \\ (bps) \\times RTT \\ (s)}{8}$$

**如何测量:**

- **Bandwidth (带宽)**: 这是客户端到服务器链路上的**瓶颈带宽**。例如，如果本地是 500 Mbps 带宽，服务器是 1 Gbps 带宽，那么瓶颈带宽就是 500 Mbps。
- **RTT (往返时间)**: 从客户端 `ping` 服务器地址，记录一个稳定的平均值（单位：毫秒 ms）。

**计算示例:**  
假设瓶颈带宽为 **500 Mbps**，客户端到服务器的 RTT 为 **180 ms**。

1. **带宽 (bps)**: `500,000,000`
2. **RTT (s)**: `0.18`
3. **BDP (bits)**: `500,000,000 bps × 0.18 s = 90,000,000 bits`
4. **BDP (Bytes)**: `90,000,000 / 8 = 11,250,000 Bytes`

`11,250,000 Bytes` 就是我们计算出的理论最佳缓冲区大小，也是我们进行实测的初始值。

### 阶段二：iPerf3 精细迭代（建议在网络晚高峰进行）

理论值是在理想情况下的最优解，但实际网络会受到抖动、少量丢包等因素的影响。因此，需要在网络最繁忙的时段（如晚高峰），通过 iPerf3 进行实测迭代，找到速度与稳定性的最佳平衡点。

**核心思路:**  
从 BDP 计算值开始，通过观察 iPerf3 测试结果中的**重传 (Retr)** 数量来调整缓冲区大小。

- **重传数过高 (例如，几百甚至上千)**：说明缓冲区可能设置得过大。当发生丢包时，过大的窗口会导致大量数据需要重传，反而引起网络拥塞和速度抖动。此时应**减小**缓冲区。
- **重传数为零或个位数**：说明网络链路质量很好，当前缓冲区设置游刃有余。可以尝试**增大**缓冲区，以探索更高的速度上限。

**操作流程:**

1. **分析结果并迭代：**  
观察客户端输出的速度以及 **`Retr` (Retransmits)** 字段。
2. **找到最佳值：**  
通过数次迭代，你会找到一个能获得最高稳定速度，同时重传数保持在个位数的“甜蜜点”。为应对网络波动，可以将这个最佳值再稍微**减小 0.5-1 MiB** 作为最终的保守配置。完美！

**如果重传数很低或为零**：尝试**增加**缓冲区 `max` 值，探索性能极限。例如，增加 2-4 MiB。

```bash
# 示例：11,250,000 + 2,097,152 = 13,347,152
sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 13347152"
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 13347152"
```

**重复第 3 步和第 4 步，循环优化。**

**如果重传数较高**：适当**减小**缓冲区 `max` 值。例如，减去 1-2 MiB (`1 MiB = 1,048,576 Bytes`)。

```bash
# 示例：11,250,000 - 2,097,152 = 9,152,848
sudo sysctl -w net.ipv4.tcp_wmem="4096 16384 9152848"
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 9152848"
```

**在客户端进行首次测试:**

**在服务器上设置初始缓冲区大小 (临时生效):**  
将 BDP 计算值 `11250000` 作为 `max` 值，`min` 和 `default` 保持系统默认或一个较小值即可。

```bash
# 我们只调整 max 值，min 和 default 保持内核建议值
wmem 的 default 为 16384 (16KiB)
rmem 的 default 为 87380 (85KiB)

```

**在服务器上启动 iPerf3 服务端：**

```bash
iperf3 -s
```

打开 `cmd` 或 `PowerShell`，进入 iPerf3 所在的本地目录，执行以下命令。主要优化下载（服务器发送），所以使用 `-R` 参数。

```powershell
# -c 指定服务器IP
-R 进行反向测试（下载测试），这会测试服务器的发送性能，对应 wmem
-t 30 持续测试30秒，以便观察稳定速度和重传

```

## 持久化配置：让优化永存 💾

通过 `sysctl -w`进行的修改在系统重启后会失效。当我们找到满意的参数后，必须将其写入配置文件。

**应用配置使其永久生效：**

```bash
sudo sysctl -p
```

**在文件末尾添加最终参数：**  
假设最终确定的最佳值为 `12298576`。

```ini
# Custom TCP Buffer Settings for High BDP Network
net.ipv4.tcp_wmem = 4096 16384 12298576
net.ipv4.tcp_rmem = 4096 87380 12298576
```

保存文件并退出 (在 `nano` 中，按 `Ctrl+O`，回车，然后 `Ctrl+X`)。

**编辑 `/etc/sysctl.conf` 文件：**

```bash
sudo nano /etc/sysctl.conf
```

至此，TCP 调优已大功告成！可以代理试下，反正我调的重传只有0，也能跑满我本地的200M宽带，但是其他的确实感觉没啥差别，就这样吧，图个心理安慰！

## 结论 🎯

Linux TCP 性能调优从来不是一个可以“一键完成”的任务，它是一个需要理解原理、借助工具、细心测试的科学过程。直接复制他人的配置参数往往会适得其反，因为每一个网络环境都是独一无二的。**个性化调优才是通往极致性能的唯一途径。** ✨