質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Wireshark

Wireshark(ワイヤシャーク)は、ネットワーク・アナライザソフトウェアです。 IP、DHCPなど800以上のプロトコルを解析できる機能があり、 Windows、Linux、BSD、Mac OS Xなどで利用が可能です。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

Q&A

1回答

5700閲覧

Windows Server 2019でのTcpKeepAliveの設定方法

crybaby27

総合スコア0

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Wireshark

Wireshark(ワイヤシャーク)は、ネットワーク・アナライザソフトウェアです。 IP、DHCPなど800以上のプロトコルを解析できる機能があり、 Windows、Linux、BSD、Mac OS Xなどで利用が可能です。

Windows Server

Windows Serverとは、Microsoft社のサーバ用オペレーティングシステムの総称です。 企業内ネットワークなどで利用されるサーバ機へ導入することを想定して開発されているため高い安定性があり、 管理機能を提供するソフトウェアが多く含まれています。

Azure

Azureは、マイクロソフトのクラウド プラットフォームで、旧称は Windows Azureです。PaaSとIaaSを組み合わせることで、 コンピューティング・ストレージ・データ・ネットワーキング・アプリケーションなど多くの機能を持ちます。

0グッド

0クリップ

投稿2022/10/03 14:09

前提

Windows Server 2019 (Amazon EC2) 上のスクリプトから
Azure 上のWebサーバに置いてある Web API に対して HTTPリクエストを投げているのですが、
今年の8月上旬ころから Connection Reset が返されるようになってしまいました。

当該APIは処理に40~50分程度時間がかかるのですが、APIがレスポンスを返す前に
Azure Load BalancerのTCPアイドルタイムアウト(最小4分~最大30分) にひっかかり
Connection Reset を返しているようです。

https://learn.microsoft.com/ja-jp/azure/load-balancer/load-balancer-tcp-reset

そもそもAPIの処理に時間かかりすぎなので API側の処理時間の見直しは必要ですが、
並行して Connection Reset を回避するため
上記URLにガイドのある通り、TCP keep-alive を使って対応したいと考えています。

以下ドキュメントによると、Windowsでは以下レジストリ
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\TCPIP\Parameters

KeepAliveTime という項目を設定すれば
すべてのTCP通信に KeepAlive が適用されるということだったので

KeepAliveTime REG_DWORD 0x0002bf20 (180000)

という値を仕込みました。最後のデータの送受信が行われてから、
KeepAlive パケットを送信するまでの時間として180秒を設定するという意図です。

https://social.technet.microsoft.com/Forums/ja-JP/30897df3-dc52-4c92-808b-ac01cc6936ee/tcp?forum=Wcsupportja

が、Wiresharkで確認する限り 180秒経ってもパケットを送信してないように見えます。
設定する場所が違うのでしょうか?あるいは、設定内容が間違っている?

実現したいこと

APIの呼び元である Windows Server 2019 側に TCP KeepAlive を仕込みたい。
KeepAliveTime を180秒とすることで、通信して180秒 音沙汰がなければ
KeepAlive パケットを投げるように仕込みたい。

発生している問題・エラーメッセージ

Windows Server 2019 にWiresharkをインストール、
Wireshark で当該ロードバランサとの通信ログを確認した。
15分かかる処理を呼び出したが、初回のTCP通信後180秒を経過しても
KeepAlive パケットを投げているログが確認できなかった。

該当のソースコード

設定したレジストリのキーと値

Registry

1HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Service\TCPIP\Parameters 2KeepAliveTime REG_DWORD 0x0002bf20 (180000)

Windows Server 2019 からWeb APIを呼び出しているコード (リクエスト先URLは省略)

PowerShell

1$FILE_SUFFIX = (Get-Date).ToString("yyyyMM") 2$LOG_FILE = "script_$FILE_SUFFIX.log" 3Invoke-WebRequest -Method Post -Body "datetime_from=2022-10-01 00:00:00" http://~~~~ 2>&1 >> $LOG_FILE

試したこと

KeepAliveTime の値を240000に変えてテストしてみたが変化なし。

補足情報(FW/ツールのバージョンなど)

ありません

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

下記の様な方法で直接指定してみてはどうでしょうか。パワーシェルではなくてすみません。
https://qiita.com/kurasho/items/275612d408d32923eabd

もしかしたらinvoke-webrequestが直接指定してるせいで効かないのかもと思いました。完全な憶測です。

投稿2022/10/29 12:25

naitou

総合スコア141

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問