キープアライブが有効になっている TCP ソケットが明確な理由もなくリセットされるという問題に直面しています。
定義されているキープアライブ設定は次のとおりです。
- tcp_keepalive_time = 20 sec
- tcp_keepalive_probes = 3
- tcp_keepalive_intvl = 3 sec
- tcp_user_timeout = 20 sec
RST パケットは、以下に示すように、最後のキープアライブ ACK プローブ (tcp_keepalive_intvl に等しい時間) の 3 秒後に送信されます。
193986 2021-11-08 09:25:42.082749 10.5.40.37 10.5.40.38 TCP 154 64 57238 → 55493 [PSH, ACK] Seq=16767 Ack=8113 Win=3650 Len=88 TSval=3370932349 TSecr=1741924624
193987 2021-11-08 09:25:42.083133 10.5.40.38 10.5.40.37 TCP 66 58 55493 → 57238 [ACK] Seq=8113 Ack=16855 Win=5068 Len=0 TSval=1741925586 TSecr=3370932349
193988 2021-11-08 09:25:42.083191 10.5.40.38 10.5.40.37 TCP 170 58 55493 → 57238 [PSH, ACK] Seq=8113 Ack=16855 Win=5068 Len=104 TSval=1741925586 TSecr=3370932349
193991 2021-11-08 09:25:42.125225 10.5.40.37 10.5.40.38 TCP 66 64 57238 → 55493 [ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3370932391 TSecr=1741925586
196998 2021-11-08 09:26:03.649256 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive] 57238 → 55493 [ACK] Seq=16854 Ack=8217 Win=3650 Len=0 TSval=3370953915 TSecr=1741925586
196999 2021-11-08 09:26:03.649841 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive ACK] 55493 → 57238 [ACK] Seq=8217 Ack=16855 Win=5068 Len=0 TSval=1741947152 TSecr=3370932391
197024 2021-11-08 09:26:03.929412 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive] 55493 → 57238 [ACK] Seq=8216 Ack=16855 Win=5068 Len=0 TSval=1741947432 TSecr=3370932391
197025 2021-11-08 09:26:03.929454 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive ACK] 57238 → 55493 [ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3370954195 TSecr=1741947152
198851 2021-11-08 09:26:24.133227 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive] 57238 → 55493 [ACK] Seq=16854 Ack=8217 Win=3650 Len=0 TSval=3370974398 TSecr=1741947152
198853 2021-11-08 09:26:24.133615 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive ACK] 55493 → 57238 [ACK] Seq=8217 Ack=16855 Win=5068 Len=0 TSval=1741967636 TSecr=3370954195
198872 2021-11-08 09:26:24.405168 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive] 55493 → 57238 [ACK] Seq=8216 Ack=16855 Win=5068 Len=0 TSval=1741967907 TSecr=3370954195
198873 2021-11-08 09:26:24.405229 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive ACK] 57238 → 55493 [ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3370974670 TSecr=1741967636
201433 2021-11-08 09:26:44.609231 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive] 57238 → 55493 [ACK] Seq=16854 Ack=8217 Win=3650 Len=0 TSval=3370994874 TSecr=1741967636
201434 2021-11-08 09:26:44.609595 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive ACK] 55493 → 57238 [ACK] Seq=8217 Ack=16855 Win=5068 Len=0 TSval=1741988111 TSecr=3370974670
201468 2021-11-08 09:26:44.888908 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive] 55493 → 57238 [ACK] Seq=8216 Ack=16855 Win=5068 Len=0 TSval=1741988391 TSecr=3370974670
201469 2021-11-08 09:26:44.888957 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive ACK] 57238 → 55493 [ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3370995153 TSecr=1741988111
204434 2021-11-08 09:27:05.089228 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive] 57238 → 55493 [ACK] Seq=16854 Ack=8217 Win=3650 Len=0 TSval=3371015353 TSecr=1741988111
204435 2021-11-08 09:27:05.089619 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive ACK] 55493 → 57238 [ACK] Seq=8217 Ack=16855 Win=5068 Len=0 TSval=1742008591 TSecr=3370995153
204460 2021-11-08 09:27:05.364662 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive] 55493 → 57238 [ACK] Seq=8216 Ack=16855 Win=5068 Len=0 TSval=1742008866 TSecr=3370995153
204461 2021-11-08 09:27:05.364703 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive ACK] 57238 → 55493 [ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3371015629 TSecr=1742008591
206324 2021-11-08 09:27:25.573262 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive] 57238 → 55493 [ACK] Seq=16854 Ack=8217 Win=3650 Len=0 TSval=3371035837 TSecr=1742008591
206325 2021-11-08 09:27:25.574628 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive ACK] 55493 → 57238 [ACK] Seq=8217 Ack=16855 Win=5068 Len=0 TSval=1742029075 TSecr=3371015629
206358 2021-11-08 09:27:25.844446 10.5.40.38 10.5.40.37 TCP 66 58 [TCP Keep-Alive] 55493 → 57238 [ACK] Seq=8216 Ack=16855 Win=5068 Len=0 TSval=1742029346 TSecr=3371015629
206359 2021-11-08 09:27:25.844481 10.5.40.37 10.5.40.38 TCP 66 64 [TCP Keep-Alive ACK] 57238 → 55493 [ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3371036108 TSecr=1742008591
206568 2021-11-08 09:27:28.642162 10.5.40.37 10.5.40.38 TCP 66 64 57238 → 55493 [RST, ACK] Seq=16855 Ack=8217 Win=3650 Len=0 TSval=3371038906 TSecr=1742008591
関連するコード ( tcp_keepalive_timer()関数) をチェックすると、そのようなシナリオにつながるパスを見つけることができませんでした。
パケットが tcp_keepalive_intvl に等しい時間の後に送信されると予想される唯一のケースは、ACK が受信されなかった以前のキープアライブ プローブの再送信であり、このケースには当てはまりません。
一方、前述のコードによれば、次の条件が満たされる場合、RST パケットが予期されます。
if (elapsed >= keepalive_time_when(tp)) { // check if time since last data >= 20 sec
/* If the TCP_USER_TIMEOUT option is enabled, use that
* to determine when to timeout instead.
*/
if ((icsk->icsk_user_timeout != 0 &&
elapsed >= icsk->icsk_user_timeout &&
icsk->icsk_probes_out > 0) ||
(icsk->icsk_user_timeout == 0 &&
icsk->icsk_probes_out >= keepalive_probes(tp))) {
tcp_send_active_reset(sk, GFP_ATOMIC);
tcp_write_err(sk);
goto out;
}
この場合も、これは当てはまらないようです。
説明を完全にするために、2 つのノードは地理的に離れた異なる ESXi ホストで実行されています。
前述の動作の原因についてのアイデアは非常に高く評価されます。