簡単な確認方法
# 存在しないIP宛にtelnetするとタイムアウトまでの時間がわかる。
$ time telnet 192.168.9.12
Trying 192.168.9.12...
telnet: connect to address 192.168.9.12: Connection timed out
real 2m7.001s
user 0m0.000s
sys 0m0.001s
# リトライ回数の設定は以下で確認ができます。
$ cat /proc/sys/net/ipv4/tcp_syn_retries
5
CentOS 5 の tcp_syn_retries値
値 | タイムアウト | 備考 |
---|---|---|
5 | 3m9.132s | 初期値 |
6 | 5m9.178s |
CentOS 6.10 の tcp_syn_retries値
値 | タイムアウト | 備考 |
---|---|---|
5 | 1m3.043s | 初期値 |
6 | 2m7.001s | |
7 | 4m7.001s | |
8 | 6m7.001s |
(TCP_RTO_MAX値が120なため2分づつ増える)
※キャッシュが有効になっているのか、すぐにタイムアウトすることもあれば、期待値より半分の時間の場合もあった。
tcpdumpを使った確認方法
# eth0のtelnetポートを監視
sudo /usr/sbin/tcpdump -i eth0 port 23
# 到達できないIPを指定してtelnet
telnet 192.168.9.9
Trying 192.168.9.9...
telnet: Unable to connect to remote host: Connection timed out
となるまで tcpdump の出力を確認。
理論上
# CentOS 6.10
$ cat /proc/sys/net/ipv4/tcp_syn_retries
5
# 結果
0秒(最初のSYN)
+ 1秒(1回)
+ 2秒(2回)
+ 4秒(3回)
+ 8秒(4回)
+ 16秒(5回)
+ 32秒(タイムアウト)
= 63秒
# CentOS 5
$ cat /proc/sys/net/ipv4/tcp_syn_retries
5
# 結果
0秒(最初のSYN)
+ 3秒(1回)
+ 6秒(2回)
+ 12秒(3回)
+ 24秒(4回)
+ 48秒(5回)
+ 96秒(タイムアウト)
= 189秒
# Ubuntu 19.10
$ cat /proc/sys/net/ipv4/tcp_syn_retries
6
# 結果
0秒(最初のSYN)
+ 1秒(1回)
+ 2秒(2回)
+ 4秒(3回)
+ 8秒(4回)
+ 16秒(5回)
+ 32秒(6回)
+ 64秒(タイムアウト)
= 127秒
TCP_TIMEOUT_INIT値をソースで確認
# CentOSの場合
yum install -y kernel-devel
# ubuntuの場合
apt install -y linux-source
ソース確認
# CentOS6.9の場合
vim -R /usr/src/kernels/2.6.32-754.23.1.el6.x86_64/include/net/tcp.h
# Ubuntu19.10の場合
vim -R /usr/src/linux-headers-5.3.0-19/include/net/tcp.h
- CentOS6.9 も Ubuntu19.10 も同じ1秒だった。
- CentOS 5 では以下のように 3秒
TCP SYN のリトライ回数を変更する方法
$ cat /proc/sys/net/ipv4/tcp_syn_retries
5
$ sudo sh -c "echo 6 > /proc/sys/net/ipv4/tcp_syn_retries"
$ cat /proc/sys/net/ipv4/tcp_syn_retries
6
- 恒久的に変える場合
CentOS6以降から /etc/sysctl.d/ があります。
CentOS5では /etc/sysctl.conf に書き込みましょう。
/etc/sysctl.d/custom.confに追記
net.ipv4.tcp_syn_retries = 6
再起動せずに適用したい場合
sysctl -p
docker
# CentOS8コンテナ で 標準のタイムアウト値が 1m15.530s から 6m12.036s に増えたことを確認した。
docker run \
--sysctl net.ipv4.tcp_syn_retries=8
(略)
参考
tcp_syn_retries (integer; default: 5; Linux 2.2 以降)
アクティブな TCP 接続に初期 SYN の再送を試みる最大回数。 この数値は 255 よりも大きくすべきではない。 デフォルトの値は 5 で、およそ 180 秒に対応する。