TCP 变量的 Linux 命令行
在本文中,我们将讨论 TCP 变量的 Linux 命令行。
查找 Linux 中使用的默认 TCP
- 检查 Linux 内核中的默认 TCP
$ sysctl net.ipv4.tcp_congestion_control
输出:
$ net.ipv4.tcp_congestion_control = cubic
- 将 Linux 内核中的默认 TCP 更改为 Reno
$ sudo sysctl -w net.ipv4.tcp_congestion_control=reno
输出:
$ net.ipv4.tcp_congestion_control = reno tcp_congestion_control
切换回 CUBIC 作为 Linux 内核中的默认 TCP
$ sudo sysctl -w net.ipv4.tcp_congestion_control=cubic
输出:
$ net.ipv4.tcp_congestion_control = cubic
启用 TCP 快速打开
- 检查 Linux 内核中 TFO 的默认设置
$ sysctl net.ipv4.tcp_fastopen
输出
$ net.ipv4.tcp_fastopen = 1
- 如果您的机器是服务器,则启用 TFO
$ sudo sysctl -w net.ipv4.tcp_fastopen=2
输出:
$ net.ipv4.tcp_fastopen = 2
- 如果您的机器既是客户端又是服务器,则启用 TFO
$ sudo sysctl -w net.ipv4.tcp_fastopen=3
输出
$ net.ipv4.tcp_fastopen = 3
- 禁用 TFO
$ sudo sysctl -w net.ipv4.tcp_fastopen=0
输出
$ net.ipv4.tcp_fastopen = 0
启用慢启动重启拥塞控制算法
- 检查 Linux 内核中 SSR 的默认设置
$ sysctl net.ipv4.tcp_slow_start_after_idle
输出
$ net.ipv4.tcp_slow_start_after_idle = 1
- 禁用慢启动重启(对服务器很重要,对客户端不重要)
$ sudo sysctl -w net.ipv4.tcp_slow_start_after_idle=0
输出:
$ net.ipv4.tcp_slow_start_after_idle = 0
我们可以在Linux中给这个参数设置2、3等值吗?如果是这样,那是什么意思?
是的,我们可以设置等于 2 和 3 的值。值 2 表示机器的行为类似于服务器,值 3 表示机器的行为类似于客户端和服务器。值 1 仅表示机器充当客户端。
启用窗口缩放
- 检查 Linux 内核中 TCP Window Scaling 的默认设置
$ sysctl net.ipv4.tcp_window_scaling
输出
$ net.ipv4.tcp_window_scaling = 1
- 禁用 TCP 窗口缩放(不推荐,但尝试学习并重新启用)
$ sudo sysctl -w net.ipv4.tcp_window_scaling=0
输出:
$ net.ipv4.tcp_window_scaling = 0
如何在 Linux 内核中找到默认窗口缩放
检查 Linux 内核中 Window Scaling Factor 的默认值
$ sysctl net.ipv4.tcp_adv_win_scale
输出
net.ipv4.tcp_adv_win_scale = 1
这是 shift.cnt=1,比例因子=2 shift.cnt = 2
启用 SACK 选项
- 检查 Linux 内核中 SACK 的默认设置
$ sysctl net.ipv4.tcp_sack
输出:
net.ipv4.tcp_sack=1
- 在 Linux 内核中禁用 SACK 的默认设置
$ sudo sysctl -w net.ipv4.
输出:
net.ipv4.tcp_sack=0 tcp_sack
检查时间戳设置
- 检查Linux内核中TIMESTAMPS的默认设置
$ sysctl net.ipv4.tcp_timestamps
输出
net.ipv4.tcp_timestamps=1
- 在 Linux 内核中禁用 TIMESTAMPS
$ sudo sysctl -w net.ipv4.tcp_timestamps=0
输出
net.ipv4.tcp_timestamps=0
检查低延迟设置:
- 检查Linux内核中Low Latency的默认设置
$ sysctl net.ipv4.tcp_low_latency
输出
net.ipv4.tcp_low_latency=1
- 在 Linux 内核中禁用低延迟
$ sudo sysctl -w net.ipv4.tcp_low_latency=0
输出
net.ipv4.tcp_low_latency=0
检查默认缓冲区大小
- 检查Linux内核中Buffer Size的默认设置
$ sysctl net.ipv4.tcp_rmem
输出
net.ipv4.tcp_rmem=4096 131072 6291456
值按顺序排列:最小值默认最大值。 131072 字节 = 128 KB,是默认缓冲区大小。
检查 Linux 内核中可用和允许的 TCP:
- 要查看可用的 TCP:
sysctl net.ipv4.tcp_available_congestion_control
输出
net.ipv4.tcp_allowed_congestion_control= reno cubic
- 查看允许的 TCP:
sysctl net.ipv4.tcp_allowed_congestion_control
输出
net.ipv4.tcp_allowed_congestion_control= reno cubic
检查 Linux 内核中的默认基本 MSS
- 要查看默认的基本 MSS 值:
sysctl net.ipv4.tcp_base_mss
输出
net.ipv4.tcp_base_mss = 1024
检查 DUP-ACK 的默认值以快速重传丢失的数据包
- 查看 DUP-ACK 的默认值:
sysctl net.ipv4.tcp_early_retrans
输出
net.ipv4.tcp_early_retrans = 3
查看黑洞 TFO 的默认超时
- TFO 的黑洞超时:
sysctl net.ipv4.tcp_fastopen_blackhole_timeout_sec
输出
net.ipv4.tcp_fastopen_blackhole_timeout_sec = 3600
重传次数
- 不涉及网络层的数据包重传次数:
sysctl net.ipv4.tcp_retries1
输出
net.ipv4.tcp_retries1 = 3
- 放弃前丢包的最大重传次数:
sysctl net.ipv4.tcp_retries2
输出
sysctl net.ipv4.tcp_retries2 = 15
Linux 内核中的默认 KeepAlive 参数
- 默认保活超时值:
sysctl net.ipv4.tcp_keepalive_time
输出
net.ipv4.tcp_keepalive_time=7200
当客户端没有主动向服务器发送请求时,服务器会等待 7200 秒。如果没有来自客户端的响应,则它将确认数据包发送给客户端。对于 7200 秒,服务器只是等待并且不会断开连接。
- keepalive 探测的默认频率:
sysctl net.ipv4.tcp_keepalive_probes
输出
net.ipv4.tcp_keepalive_probes=9
当 7200 秒结束时,服务器发送第一条探测消息以查看客户端是否仍然连接。如果在发送第二个探测之前没有响应,则服务器再次发送探测消息。当所有 9 个探测都已发送且未收到来自客户端的确认时。然后服务器断开客户端的连接,套接字可供其他客户端使用。
- 每个keepalive探测的默认时间间隔:
sysctl net.ipv4.tcp_keepalive_intvl
输出
net.ipv4.tcp_keepalive_intvl=75
服务器将在 75 秒间隔后发送下一个探测。因此,服务器断开连接的不活动总时间为:- 7200+9*75 = 7875 秒。