1

サーバーとクライアント (Linux) の間に SCTP 接続を設定しようとしています。サーバーには複数の IP アドレスがあり、発信 IP パケットは送信元アドレスに応じてルーティングされます。sctp 接続がデフォルトで特定のアドレスを使用するようにしたい (デフォルトで特定のルートを使用するため)

私が見つけた唯一のオプションは次のとおりです。

   SCTP_SET_PEER_PRIMARY_ADDR
          Requests that the peer mark the enclosed address as the association primary. The enclosed address must be one of the association's locally bound addresses. The struc‐
          ture sctp_setpeerprim defined in /usr/include/netinet/sctp.h is used to make a set peer primary request.

   SCTP_PRIMARY_ADDR
          Requests that the local SCTP stack use the enclosed peer address as the association primary. The enclosed address must be one of the association peer's addresses. The
          structure sctp_prim defined in /usr/include/netinet/sctp.h is used to make a get/set primary request.

私が理解している限りでは、このオプションを使用すると、ピアのプライマリ アドレスを選択し (送信時)、ローカル アドレスの 1 つを使用するようピアに要求できます (受信時)。

問題は、送信メッセージの送信元となるローカル アドレスを選択する方法はありますか?

4

3 に答える 3

0

免責事項: lksctp のマルチパスや ASCONF は使用していませんが、カーネル モジュールのソースは読みました。

ピア アドレスごとに個別の sctp_transport が構築されるため、ローカル アドレスが 1 つのリモート アドレスにマルチパス化されているか、2 つのリモート アドレスにマルチパス化されているかによって状況が異なります。

アソシエーションは、受信したパケットの宛先アドレスを保存し、特定の sctp_transport を介して送信するときに優先ソースとして再利用します。SCTP_SET_PEER_PRIMARY_ADDR を設定すると、特定のトランスポートのプライマリとして適切なローカル アドレスを維持するのにピアが役立ちます。トランスポートが 1 つしかない場合は、おそらく完了です。複数のトランスポートがある場合、ピアが特定のトランスポートを選択することがあります。SCTP_PRIMARY_ADDR の設定は逆のケースであり、複数のトランスポートがある場合は、どのトランスポートがプライマリであるかが確実に更新されます。

複数のトランスポートの場合、上位レイヤーが指示しない限り、「プライマリ」トランスポートから離れたスイッチがあるはずはありません。ただし、どのトランスポートが「アクティブ」であるかはエラーなどに依存し、再送信の場合、仕様では代替トランスポート アドレスの使用が明示的に推奨されています。一般に、どのトランスポートが (プライマリに対して) アクティブであるかを常に制御しようとするのは、かなり絶望的だと思います。ピアが開始する前に INIT を送信するなどの単純なことは、ピアを前後に切り替えます。

bind/bindx を特定のアドレス (vs 0.0.0.0) にバインドすると、絶対に使用したくないアドレスがある場合にのみ、それらのアドレスのみが使用されるという事実を見逃さないでください。

私はあなたの幸運を祈ります。

于 2012-05-25T19:35:07.223 に答える
0

sctp_sendmessage にはオプションがあります。 http://linux.die.net/man/3/sctp_sendmsg [SCTP_SendMessage][1]

于 2012-10-02T14:01:57.487 に答える
0

インターフェースの選択は役に立ちますか?

そのために setsockopt を使用できます。

struct ifreq ifr;
strncpy_IFNAMSIZ(ifr.ifr_name, "ethX");
setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, &ifr, sizeof(ifr));
于 2012-02-08T16:02:10.997 に答える