サーバーがSYNパケットに応答してSYN / ACKパケットを送信しないのはなぜですか


46

最近、当社のWebサイトを閲覧するMacおよびLinuxユーザーに限定されているTCP接続の問題に気づきました。

ユーザーの観点からは、Webサイトへの非常に長い接続時間(> 11秒)として表示されます。

私たちはこの問題の技術的な特徴を追跡することができましたが、なぜそれが起こっているのか、どうやってそれを修正するのかがわかりません。

基本的に、クライアントのマシンはSYN接続を送信してTCP接続を確立し、Webサーバーはそれを受信しますが、SYN / ACKパケットで応答しません。クライアントが多くのSYNパケットを送信した後、サーバーは最終的にSYN / ACKパケットで応答し、接続の残りの部分はすべて問題ありません。

そして、もちろん、問題のキッカー:それは断続的であり、常に発生するわけではありません(ただし、10〜30%の時間で発生します)

OSとしてFedora 12 Linuxを使用し、WebサーバーとしてNginxを使用しています。

Wireshark分析のスクリーンショット

Wireshark分析のスクリーンショット

更新:

クライアントでウィンドウスケーリングをオフにすると、問題が発生しなくなりました。今、私はちょうどサーバー側の解像度が必要です(すべてのクライアントがこれを行うことはできません)

最終更新:

解決策は、公開されているサーバーでTCPウィンドウのスケーリング TCPタイムスタンプの両方をオフにすることでした。


1
発生しているtcpdumpを確認する必要があると思います。
コアダンプ

逆引きDNSに基づいたACLまたはルールはありますか?クライアントとサーバーとの間の接続だけでなく、もっと見る必要があるかもしれません。おそらくDNSルックアップがタイムアウトになっていますか?
ゾレダチェ

@coredump:ここに、問題i.imgur.com/Bnzrm.pngを示すwireshark分析のスクリーンショットがあります (ストリームだけをエクスポートする方法がわかりませんでした。)
codemonkey

@Zoredache:いいえ、リバースDNSに基づくACLやルールはありません。これは一般公開のWebサーバーであり、誰でもアクセスできるようにします
-codemonkey

ちょっとしたことですが、サーバーで何らかの着信接続のレート制限を行っていますか?たとえば、iptablesを使用しますか?
スティーブン

回答:


15

これとまったく同じ問題がありました。TCPタイムスタンプを無効にするだけで問題は解決しました。

sysctl -w net.ipv4.tcp_timestamps=0

この変更を永続的にするには、にエントリを作成し/etc/sysctl.confます。

TCPウィンドウスケールオプションを無効にする場合は十分注意してください。このオプションは、インターネット上で最大のパフォーマンスを提供するために重要です。ラウンドトリップ時間が(基本的にpingと同じ)55ミリ秒を超える場合、10メガビット/秒の接続を持つユーザーは次善の転送を行います。

同じNATの背後に複数のデバイスがあるときに、この問題に本当に気付きました。タイムスタンプフィールドにまったく異なる値を入力しているため、AndroidデバイスとOSXマシンのタイムスタンプを同時に表示するサーバーが混乱している可能性があります。


4
他の誰かが私がちょうど行ったのと同じウサギの穴からここにたどり着く場合:高トラフィックリンクでパフォーマンスに重大な影響を与える可能性のあるTCPタイムスタンプまたはウィンドウスケーリングをオフにする前に、tcp_tw_recycleが問題かどうかを確認してください:stackoverflow .com / questions / 8893888 /…
ネフェス14年

12

私の場合、次のコマンドにより、LinuxサーバーからのSYN / ACK応答が欠落する問題が修正されました。

sysctl -w net.ipv4.tcp_tw_recycle=0

TCPタイムスタンプは高性能(PAWS、ウィンドウスケーリングなど)に役立つため、TCPタイムスタンプを無効にするよりも正しいと思います。

上のドキュメントtcp_tw_recycleを明示的には、多くのNATルータは、タイムスタンプを保存し、同じIPからのタイムスタンプが一致していないようので、中にキックを足として、それを有効にすることを推奨されていないと述べています。

   tcp_tw_recycle (Boolean; default: disabled; since Linux 2.4)
          Enable fast recycling of TIME_WAIT sockets.  Enabling this
          option is not recommended for devices communicating with the
          general Internet or using NAT (Network Address Translation).
          Since some NAT gateways pass through IP timestamp values, one
          IP can appear to have non-increasing timestamps.  See RFC 1323
          (PAWS), RFC 6191.

1
ここでの良い説明:vincent.bernat.im/en/blog/2014-tcp-time-wait-state-linux サーバー側では、NATデバイスがないことを確信できない限り、net.ipv4.tcp_tw_recycleを有効にしないでください。に混ざった。
ノート

1
私の場合、net.ipv4.tcp_tw_recycle本当の理由です。ありがとう。
ブルーアロー

tcp_tw_recycleは最近のカーネルで削除されました。同様の別の解決策はありますか?@nephtesは、タイムスタンプを無効にするとパフォーマンスが低下することを意味します。
MappaM

tcp_tw_recycleは削除されたため、デフォルト値以外のtcp_tw_recycleでのみ発生したため、問題は再発しません。
ラヴ

5

ただ疑問に思うが、SYNパケット(フレーム#539;受け入れられたもの)の場合、WSおよびTSVフィールドが「情報」列にないのはなぜですか?

WSはTCPウィンドウスケーリングであり、TSVはタイムスタンプ値です。両方ともtcp.optionsフィールドの下にあり、Wiresharkが存在する場合はそれらを表示する必要があります。クライアントのTCP / IPスタックが8回目の試行で異なるSYNパケットを再送信した可能性があり、それが突然確認された理由でしたか?

フレーム539の内部値を教えてください。SYN / ACKは、WSが有効になっていないSYNパケットに対して常に送信されますか?


@Ansisは:ここでは(二つの部分でそれをしなければならなかった)フレーム539詳細については、いくつかのスクリーンショットです:i.imgur.com/D84GC.pngi.imgur.com/4riq3.png
codemonkey

@codemonkey:8番目のSYNパケットは、最初の7つのSYNパケットとは異なるようです。サーバーは、tcp.optionsフィールドのサイズが8バイトの場合にのみ、クライアントのSYNに対してSYN / ACKで応答します(最初の7つのSYNパケットにはおそらくサイズ20バイトのtcp.optionsがあります)。クライアント側でTCPウィンドウのスケーリングを無効にして、問題が解消するかどうかを確認できますか?...サーバ側のTCP / IPスタックに問題のように思えるまたはファイアウォールどこか設定ミス
ハンス・ソロ

@Ansis:ええ、あなたがそれを指摘して以来、私はそれを見てきました。他のすべてのSYNパケットは24バイトです。クライアントでウィンドウスケーリングを無効にして、午前中に結果を確認します。
codemonkey

@Ansis:クライアントでウィンドウスケーリングをオフにすると、問題が発生しなくなりました。ありがとう!ただし、今、サーバー側でこれを修正する方法を理解する必要があります(すべてのクライアントがウィンドウのスケーリングを無効にできないため):)問題のサーバーにはnet.ipv4.tcp_windows_scaling = 1
codemonkey

@Codemonkey:すべてのクライアントでWSを無効にすることは解決策ではないことに同意しますが、少なくともWS / Packet Sizeの問題の問題を追跡しました。原因をさらに特定するには、ファイアウォールの構成方法を調べる必要があります。WSと異なるTCPポートへのTCP接続を確立できますか?異なるソースIPからですか?
ハンス・ソロ

4

まったく同じ問題に遭遇しました(syn-ackを送信せずにサーバーに固定するのにかなり時間がかかりました)。

「解決策は、一般からアクセス可能なサーバーでtcpウィンドウのスケーリングとtcpタイムスタンプをオフにすることでした。」


2

Ansisが述べたことを続けるために、ファイアウォールがTCP Windows Scalingをサポートしていないときにこのような問題を見てきました。これら2つのホスト間にあるメーカー/モデルのファイアウォールは何ですか?


ファイアウォールは、iptablesを使用するFedora 13ボックスです。net.ipv4.tcp_windows_scalingもこのマシンで1に設定されています
-codemonkey

2

不足しているSYN / ACKは、ファイアウォールのSYNFLOOD保護の制限が低すぎることが原因である可能性があります。サーバーユーザーへの接続の数によって異なります。spdyを使用すると、接続の数が減り、net.ipv4.tcp_timestampsオフにしても効果がない場合に役立ちます。


1

これは、バックログがいっぱいのときのリスニングTCPソケットの動作です。

Ngnixでは、バックログ引数をリッスンして構成に設定できます:http ://wiki.nginx.org/HttpCoreModule#listen

80 backlog = numをリッスンします

numを1024などのデフォルトより大きい値に設定してみてください。

完全なリッスンキューが実際にあなたの問題であるという保証はありませんが、これは最初に確認するのが良いことです。


先端をありがとう。試してみます。OSレベルでバックログを設定しましたが、Nginx構成では明示的に設定していません。結果を更新します。
codemonkey

動作はまったく変更されませんでした。推測、それは問題ではない?または唯一の問題
...-codemonkey

1
完成TCP接続のキューのアプリケーションレベルのバックログパラメータコントロールのサイズは、3ウェイハンドシェイクは、すなわちSYN-ACKを受信し終えた-すなわち、それはOPの状況と一致していないので
ygrek

1

Linux TCPクライアントが3回の試行後にSYNパケットを変更し、Window Scalingオプションを削除することを発見しました。カーネル開発者は、これがインターネットの接続障害の一般的な原因であると考えたと思います

これらのクライアントが11秒後に接続を管理する理由を説明します(ウィンドウレスTCP SYNは、デフォルト設定での簡単なテストで9秒後に発生します)


0

私も同様の問題を抱えていましたが、私の場合、誤って計算されたのはTCPチェックサムでした。クライアントはvethの背後にあり、ethtool -K veth0 rx off tx offを実行するとうまくいきました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.