
私は 2 台のサーバーを持っており、これらのサーバーへの接続には LwIP を備えた独自の組み込みシステムを使用しました。
LwIP を搭載した私の組み込みシステムはクライアントで、server1 と server2 があります。server1 に接続し、server2 に接続する前に接続を終了します。
フローのさらなる内訳:
- クライアントはserver1で新しいソケットを作成する
- クライアントはサーバ1のIPアドレスを取得するためにDNSパケットを送信し、APからACKを受信しました。
- クライアントは TCP SYN パケットを送信します。
- サーバー1はTCP SYN-ACKを送信し、データ転送を実行します。
- クライアントはTCP RSTパケットを送信してサーバー1との接続を終了し、ソケットを閉じます。
- クライアントはサーバー2で新しいソケットを作成する
- クライアントはサーバ2のIPアドレスを取得するためにDNSパケットを送信し、APからACKを受信しました。
- クライアントはTCP SYNパケットをサーバー2に送信する
- サーバー2はTCP SYN-ACKを送信し、データ転送を実行します。
- クライアントはTCP RSTパケットを送信してサーバー2との接続を終了し、ソケットを閉じます。
ただし、手順 9 で、server2 がクライアントの SYN パケットに応答しないことがあります。これは時々発生します。次のようないくつかのフォーラムを確認しました。
[1]サーバーがSYNパケットに応答してSYN/ACKパケットを送信しないのはなぜでしょうか
[2]サーバーがSYNパケットに応答してSYN/ACKパケットを送信しない
私のコードではウィンドウのスケーリングが有効になっていません。プライベート サーバーなのでサーバーをチェックできないため、ドロップされたかどうかはよくわかりません。私の環境は、ルーターや通信デバイスが多く、非常にノイズが多く、混雑しています。この問題はノイズの多い環境でのみ発生し、クリーンな環境では発生しません。
この問題を解決するためにクライアントとして何ができるでしょうか?
答え1
サーバーが SYN-ACK で応答しない理由について、いくつかの考えがあります。
- SYN パケットが送信されると、サーバー上のアプリケーションが停止します。これによりクラッシュが発生し、その後、プログラムの自動再起動メカニズムによって再び動作できるようになります。サーバー アプリが停止またはクラッシュすると、TCP リスニング ソケットが閉じられるため、OS は応答しません。
- サーバーがクライアントを見つけるのに問題があります。ルーティングの問題または非対称ルーティング (ファイアウォールが壊れる) が原因である可能性があります。
- クライアントとサーバーが同じネットワーク上にある場合、スパニング ツリー プロトコルや ARP などのレイヤー 2 の問題である可能性があります。
- ネットワークでのパケット損失: SYN または SYN ACK パケットがドロップされます。
- サーバーが過負荷状態になり、SYN パケットに応答できない場合があります。
サーバーが SYN パケットに応答しない原因は多数考えられます。
私がやること:
- サーバーで tcpdump を実行してネットワークを確認します。サーバーは SYN パケットを受信していますか、それとも事前にネットワークに問題がありますか? サーバーは SYN ACK パケットを生成して送信していますか? そこから作業を進めます。
- サーバーにアクセスできない場合は、最も近いルーター/ファイアウォールで同じことを実行します。
- サーバーにアクセスできる人に連絡してください。