1

私はユーザー空間の tcp スタックに取り組んでおり (主に楽しみのため)、UNIX の tcp スタックに対してテストするのに問題があります。現在、テストの唯一の形式は単体テストを介して行われます。ただし、実際のカーネル tcp スタックに対して tcp スタックをテストしたいと考えています。次のセットアップを試しましたが、あまり成功しませんでした。

  • raw ソケットの使用: カーネル tcp ソケットを使用して接続を受け入れる単純な echo tcp サーバーを作成しました。TCP サーバーは、localhost のポート 8080 をリッスンします。私の TCP クライアントは、ユーザー空間の TCP スタックを使用します。ただし、クライアントがサーバーに syn を送信するたびに、カーネルは tcp rst を送信します。すべてのtcp rstパケットをドロップするようにiptableを変更した後、それは一種の機能です。ただし、3 方向の syn、syn+ack、ack ハンドシェイクが確立されていても、サーバーはクライアントが送信するパケットを受信できません。私は最終的に生のソケットをあきらめました。

  • tun/tap を使用: 同様に、エコー サーバーはカーネル tcp ソケットを使用し、localhost ポート 8080 をリッスンします。クライアントは、tap デバイスを開きます。タップ デバイスの IP は 10.0.0.1 で、クライアントは 10.0.0.2 の IP を想定しています。コンピューターから 10.0.0.2 に ping できます。ただし、クライアントがタップ デバイスを介して tcp サーバーに syn を送信すると、サーバーは応答しません。

注:ubuntu 12.04を使用しています。

4

1 に答える 1

1

conntrack ツールを使用して、未加工のソケットを使用して機能しない理由に関する詳細情報を取得してみることができます。なんらかの理由でカーネルが tcp 接続の状態について混乱した場合、それをリセットすることを決定している可能性があります。raw テーブルに notrack ルールを設定することで、接続を追跡しないようにカーネルに指示して、これを除外することができます。何かのようなもの

iptables -t raw -A PREROUTING -p tcp --port 8080 -j NOTRACK

tun/tap デバイスとカウントで使用tcpdumpして、パケットがドロップされる場所を確認してください。レイヤー 3 だけを気にする必要があるので、代わりに tun デバイスも試してみます。iptables

于 2014-12-11T04:11:02.697 に答える