質問

私はC#アプリケーションを数年間正常に実行しています。 TCP / IPソケットを介して、株式取引執行を送信するマシンに接続します。

最近、ハードウェアファイアウォールの背後にある新しいデータセンターの一部のマシンに展開しようとしましたが、奇妙な切断が見られるようになりました。

切断が発生すると、アプリ(クライアント側)で、ソケットを介したデータの受信を停止することを除いて、異常なものは何も表示されません。 Wiresharkは、データがソケットに到達していないことを確認し、デバッガーでデータを停止すると、アプリケーションの受信スレッドがReceive()呼び出しでブロックします。ソケットは、netstatでESTABLISHEDと表示されます。

しかし、サーバー側からは、クライアントが切断しているように見えます。彼らのログを見ると、彼らの端のソケットは通常(nRecvd = -1、errno = 104)または(nRecvd = 0、errno = 11)のいずれかで終わるように見えます。 (104はピアによる接続のリセットです。)

切断は、一定の非アクティブ期間後にのみ発生するようです。クライアントとサーバー間に20秒ごとに短いメッセージを送信して返信を受け取るハートビートを実装することで、今のところこれを解決しました。これにより、過去数日間で切断が0になりました。

最初は、ハードウェアファイアウォールが問題であると考えました。これは、非アクティブ後にソケットがタイムアウトする原因になりました。しかし、ファイアウォールの担当者は、このポート(8887)での接続のタイムアウトは2160分であると主張しています。

Windows Server 2003および.NET 3.5を実行しています。取引サーバーはLinuxマシンです(sles9確信はありませんが信じています)。

何が起こっているかについてのアイデアはありますか?ファイアウォールのログにアクセスできず、取引サーバーのコードを変更する機能がない場合、これをさらにデバッグするにはどうすればよいですか?

ありがとう、 マイク

役に立ちましたか?

解決

あなたが説明するのは一般的であり、ハートビートを実装して、あなたがしたようなファイアウォール/ゲートウェイを通してTCPソケットを生かしておくのが一般的です。

このハードウェアには2160分のハードタイムアウトがあります(私の経験では20〜30分が一般的ですが)が、何らかの負荷がある場合、接続は通常より積極的に切断されます。このようなファイアウォールはリソースが限られているため、より多くの接続追跡が必要な場合、ハードタイムアウトの設定に関係なく、アクティビティなしで追跡された最も古い接続をドロップする傾向があります。

これをさらにデバッグしたい場合は、ファイアウォールのサーバー側でスニッフィングを行い、サーバーが切断されたときに何が起こるかを確認してください

他のヒント

TCP(および下位レベル)で何が起こるかを確認するために、ファイアウォールの両側にワイヤシャープをセットアップします。 そして、管理者が「接続のタイムアウト」と言うと、何かです。それは、アイドル状態で確立された接続のタイムアウトですか?それ以外は何も意味がありません。

また、TCPにKeepAliveオプションを使用していますか?そして、それはファイアウォールによって転送されるのですか?

私が言ったように、おそらくファイアウォールの両側でwiresharkを実行したい...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top