• 締切済み

リンク・アグリゲーションでのリンクの割り当て

IEEE802.3ad Link Aggregation という規格を知り、Windows 7 (64Bit) で、下記の構成で、ネットワークの帯域を実験してみました。 1Gbps の NIC を2枚 なので、期待値は、2Gbps です。(PCは、共に、Windows7) Jumbo Packet 9016Bytes チーム化は、LACP にて行い、ネットワークのプロパティでは、2GBPS の表示は、出ています。 PC#1 INTEL Pro/1000 PT Desktop 1枚 INTEL Gigabit CT Desktop 1枚 PC#2 INTEL Gigabit CT Desktop 2枚 (1) PC#1→PC#2 へ、WinSock で、UDP 送信を Non-Blocking で送信 結果:ある瞬間をみるとネットケーブルの一本側にしか UDP Packet が流れません。 数秒後に、LACPのロードバランスの制御で、他方のケーブルへUDP パケットが流れます。      Windows のタスクマネージャで見ても、Networkの利用率は、50% 近辺で、実際とあっています。 (2) 上記(1) を実行中に、 PC#1←PC#2 へ、WinSock で、UDP 送信を Non-Blocking で送信    結果:(1) のパケットとは、別のケーブルの方に、パケットが流れます。      Windows のタスクマネージャで見ても、Networkの利用率は、70% 近辺で、実際とあっています。 質問: 期待する動作としては、 上記(1)において、Network 利用率 70% 辺りを期待したいのですが、無理でしょうか? IEEE802.3ad の規格によれば、物理リンク(ケーブル相当)の決定は、MAC Address と、Port Number のようです。 一方、私がやりたいのは、一つのUDP Port でもって、2本のケーブルに同時にパケットを送出したい訳です。 受信側のドライバの作りからいって、無理なような気がしているのですが、このあたり、教えていただけると、とっても、うれしいです。 INTEL NIC は、TX/RX 共に、Descriptor でもって、パケットを送受するので、無理っぽい気がしています。 TX/RX の Descriptor は、めいっぱい確保しています。 以上ですが、よろしく、お願いいたします。

みんなの回答

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.4

ちょっと期間が空いてしまいましたが。。。 802.3ad-2000をお探しであれば、このあたりに落ちていたりします。 http://voiplab.niu.edu.tw/IEEE/obsolete/802.3/802.3ad-2000.pdf >All packets associated with a given “conversation” are transmitted on the >same link to prevent mis-ordering >と記載があり、同一リンク(この場合、物理リンクと解釈)で、送信するようです。 strictな802.3adだと、送信側(Frame Distributor)には上記の通りの制約があります。 現実には、いろいろなベンダ拡張が入っており、上記制約に従わないものがあります。 (Linux bondingのbalanced-rrも、802.3ad規格の制約を外れたものです) >また、ロードバランスについては、 >This standard does not mandate any particular distribution algorithm(s); >のように、アルゴリズムを特定しているようではないようです。 これはその通りです。 >また、LAG は、Point-Point なので、イーサネットのPHY の都合を除けば、Pause Frame による >パケットの停滞は、まずないでしょう!?(RX Desc を多分に用意するので) 10Gとかだと怪しいですが、1G程度であれば、最近のマシンなら大丈夫でしょう。 検証がんばってください。

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.3

>Linux の Bonding ではどうなのかは、まだ、試していません。(送出側として) LinuxのBondingであれば、 動作モードに、round-robin方式(balanced-rr)を選択することで、 期待の動作となります。

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.2

>NIC2個を一個のストリームとして見た場合の、 >時系列の判断が、無理ではないか?と理解してます。 時系列(パケット到着順序)の判断はドライバレベルでは不要です。 パケット到着順序が保証されない(順不同となる可能性がある)旨は、 EthernetやIP等のプロトコル規約でも明言されています。 時系列の判断は、上位層のしかるべきプロトコル層で処理すべき内容であり、 物理NICドライバや(チーミング用)仮想NICドライバは関与する必要がありません。 具体例をいくつかあげると。。。  ・IPフラグメント結合のための時系列判断は、TCP/IPスタックが処理すべき。  ・UDPを利用した音声ストリーミングの時系列判断は、アプリケーションレイヤが実装すべき。 といった具合です。 ご質問のように「UDP利用が前提」で、さらに「時系列の補償が必要」であれば、 アプリケーションレイヤで時系列を補償するための仕組みを実装する必要があります。

trail_run_tyo
質問者

お礼

明快な回答、ありがとうございます。 WEB でいろいと検索すると、 プレゼン資料 IEEE 802.3 HSSG IEEE 802.3ad Link Aggregation (LAG) 17-April-2007 Ottawa IEEE 802.3 HSSG では、 All packets associated with a given “conversation” are transmitted on the same link to prevent mis-ordering と記載があり、同一リンク(この場合、物理リンクと解釈)で、送信するようです。 また、ロードバランスについては、 This standard does not mandate any particular distribution algorithm(s); のように、アルゴリズムを特定しているようではないようです。 このような表現が、IEEE の文献に多数記述があり、混乱していました。 しかし、このところのこの質問箱での、対話を通じて、下記のようにいけるかな?という理解になってきました。 NIC ドライバの受信系の一般的な構造は、以下のような感じ 割込み処理 割込み遅延処理 プロトコル層へのポスト チーム用のNIC処理は、上記プロトコル層へのポストの前ですね。 なので、確かに、パケットの順序性は、気にしようにも、できません。 また、LAG は、Point-Point なので、イーサネットのPHY の都合を除けば、Pause Frame による パケットの停滞は、まずないでしょう!?(RX Desc を多分に用意するので) 従って、ここは、UDP 層の上位にて、パケットの順序性・確実性を補償すべきでしょうね。 今後は、この検証作業をしようと思います。

  • onosuke
  • ベストアンサー率67% (310/456)
回答No.1

Link Aggregationにおいて、どのケーブルを利用して送信するかは、 信号送信側の制御に依存します。(受信側が来た信号を全て受け取るだけ) つまり、PCで受信パケットを負荷分散する場合、 通常は接続するL2スイッチ(=信号送信側)の制御に依存してしまいます。 今回の場合は、対向PCのINTEL NIC送信側ドライバの作りに依存して、 そのような挙動を示す結果が出てしまっており、期待する動作は実現不可能です。 以下、参考URLから、 INTEL NIC送信側ドライバの挙動に関する引用です。 ------------------------------------------------------- リンク・アグリゲーション / ロード・バランシング機能は、 サーバー - クライアントのような 1 : n の関係にある通信の帯域を広げるための機能です。  (中略) サーバー間接続のような、 1 : 1 の関係にある通信については、帯域を広げることはできません --------------------------------------------------------

参考URL:
http://www.intel.com/jp/support/network/sb/cs-009747.htm
trail_run_tyo
質問者

お礼

早速のご回答、ありがとうございます。 大変、参考になりました。 さらに、上記に、質問の補足をします。 どうぞ、よろしく、お願い申し上げます。

trail_run_tyo
質問者

補足

素早い、ご回答、ありがとうございます。 大変、助かります。 まさに、ご指摘の INTEL のサイトの以下の記述 >アドバンスド・ネットワーキング・サービス (ANS) の仕様により、 > 1 つのセッションを複数の物理アダプターに振り分けません。 ですね。 一つのセッション=UDP Port 1個分ですね。 実を申しますと、送出側は、独自に作ろうと思っていて、その事前調査で、既存品を調べました。 一方で、海外では、このINTEL NIC を2個受信側で使って、240MB/S 程度の速度を実現できているようです。 この事実と、INTEL サイトの記述からは、受信側は、できそうな感じです。 さらに、質問を具体化すると、 UDP 1 Port のパケットを2個の物理リンクに、バーストで、同時に流して、受信側で、どうやって 順序の検出ができるのだろう?というのが、私の疑問です。 受信側においては、INTEL NIC の RX Descriptor が、沢山つながっていて、そこを見て、 NIC が、バスマスター(DMA)で、転送するだけだと、思います。 そうすると、受信側では、今回の例では、2個同様の受信動作になり、PC の DDR 上には、 パケットが、各NIC毎に時系列に並びます。 NIC2個を一個のストリームとして見た場合の、時系列の判断が、無理ではないか?と理解してます。 リンクアグリゲーションのプロトコルの中に、Marker Protocol というのがあるのですが、 それで行うのか? わかっていません。 Linux の Bonding ではどうなのかは、まだ、試していません。(送出側として) 現状、分かっていることは、UDP Port を2個にすれば、PC-PC間は、1Gbps を超えられる ということです。 これを、なんとか、UDP 1 Port で済ませたいとチャレンジしてる次第です。 以上、どうぞ、よろしく、お願い申し上げます。

関連するQ&A

  • WinSockとWinPcapについて

    いつもお世話になります。 今、UDPパケット送受信ソフトを生成しています。 送信ソフトはWinSockを用いて作成しました。 受信ソフトをWinSockを用いて作成しましたが、 受信パケット数をカウントしようと思い、 recvfrom()でカウントしましたが、正常にカウントされない 保障されないことがWinSockではわかりました。 受信パケット数をカウントするには、 デバイスレベルで(Ethereal/WireShark)で行っている ようにWinPCapを用いると パケットをカウントできるのではないかと考えられます。 WinPcapでパケット受信を行う場合、 送信がWinSockで送信していても問題ないでしょうか? また、WinPcapでパケットを受信するには どうしたらいいのでしょうか? どうぞよろしくお願い致します。

  • パケットの計算方法について

    今、WinSockを使ったパケット送信プログラムを作成しています。 Ethernetフレームで、UDPを用いて転送する予定です。 そこで、送信するパケットについて検討しています。 UDPのペイロードサイズが、1472バイトであることはわかりました。 10Base-Tと100Base-Tそれぞれの場合で、送信パケットの上限数とパケット間隔についてどのように算出すればいいのでしょうか? どうぞよろしくお願い致します。

  • ネットワーク上に存在しないIPアドレスにはUDPパケットが送信できない?

    はじめまして。よろしくお願いします。 Cでソケットプログラミング(WinXP,VC++6.0)を行っています。 やろうとしていることは、 ・UDPパケットを同じネットワークセグメントのIPアドレスに送信する ということです。 プログラムを作成し、本当に送信しているのかどうかをパケット キャプチャソフト(wireshark)を使って確認してみました。 すると、ネットワーク上に存在するIPアドレスにはパケットを送信 しているのですが、存在しないIP(つまり、電源を切っているPC)には パケットを送信していないことがわかりました。 ネットワーク上においてそのIPの存在に関係なく、パケット を送信することは出来ないのでしょうか? よろしくお願いします。

  • WinsockによるUDP通信にて

    WinsockでUDP通信を行うプログラムを作っているのですが、 原因不明の問題が発生していて困っています。 通信手順は以下のとおりです。 (1) クライアントからサーバへ要求パケット送信 (2) 要求パケットを受け取ったサーバは、クライアントへACKを送信 (3) サーバが要求に対する応答パケットをクライアントへ送信 (4) 応答パケットを受け取ったクライアントは、サーバへACKを送信 クライアント-サーバ間でやりとりするデータは最大で992バイト、 それ以上になる場合は、分割して送信します。 パケットの分割が発生しない場合は、(1)~(3)がパケットの損失もなく通信できるのですが、 パケットの分割が発生する場合には、2回目以降の(4)のパケットがクライアントに届きません。再現率は今のところ100%です。 クライアント側のselect関数でもソケットを検出しません。 たしかにUDPは信頼性が低いですが、パケット分割が発生しないパターンでは100%届くので、UDPの仕様とは関係ないような気がします。 原因がさっぱりわからないので、アドバイスをお願いいたします。 ちなみに、クライアント、サーバともに同一端末内にあります(双方がループバックアドレスに対してパケットを送信)が、 これはテスト段階だからであって、本来はそれぞれ別々の端末で動作します。

  • 急にLANケーブルを認識しなくなりました

    本日デスクトップPCを起動したら昨日まで大丈夫だったのが LANケーブルを読み込まなくなっていました。 ケーブルが抜けたかと繋ぎなおしたのですが認識しません。 ケーブルを他PCにつなげると認識します。 ドライバーが原因かと思いネットワークアダプターのIntel Gigabit CT Desktop Adapterを 他のPCからダウンロードして再インストールしたのですが、直りません。 どのような原因が考えられるのでしょうか。 回線:@nifty Wimax AtermWM3600R クレードル経由での有線LAN OS:Windows7 Professional 64bit CPU:Core i5 2500K マザーボード:ASRock Z68 Extreme4 Gen3 NIC:Intel EXPI9301CT

  • パケット数のカウント方法

    いつもお世話になります。 今、WinSockを用いて、パケット送受信ソフトを作っています。 送信は完成しましたが、受信で問題があります。 UDPプロトコルです。 受信側で受信したパケット数を数えたいのですが、 その方法がわかりません。 送信側で送信するパケットは 複数個で受信側にはそのパケット数はわかりません。 以下のようにカウントすると送信パケット数と異なる 数になります。 int count=0; while(1){ if((recvfrom( recvSocket, buf, sizeof(buf), 0, NULL, NULL)) != SOCKET_ERROR){ count++; } } 受信パケットを数える方法はありませんか? どうぞよろしくお願い致します。

  • C#でUDP通信

    C#でネットワークプログラミングを行いたいと思っています。 使用するプロトコルはUDPです。 TCP通信の参考書やwebページは見掛けるのですが UDPに関する資料はなかなか見つけることができません。 コーディングする上で、 TCP通信のプログラムをどのように変えたらよいのか 教えてください。 ちなみに、Windowsで開発する場合は WINSOCKを使ったほうがよろしいのでしょうか。

  • eoひかり 回線スピードに関して

     ご教授宜しくお願い致します。 先日、eo光を100Mから1Gにコース変更しましたが、イーサネットの状態の速度が100Mbpsと表示されており,回線スピードも当然遅いままです。  ネットワークアダプターの詳細設定にて[Speed&Duplex]の値を[1.0Gbps Full Duplex] に変更してみましたが、変更するとネットに接続出来なくなり、現状は[Auto Negotiation] に設定しております。Lanケーブルは、1Gbps対応品を使用しており、eoひかりの多機能ルーターからPCに直結しております。  eoひかりのカスタマーセンターでは、上記対応をしても駄目なので、PCメーカーに相談してみてくださいとのことでした。  PCメーカー(ACER)では、OSを変えているので(当初はVISTA)対応出来ないとのことです。 PCの構成  ・CPU intel core2 Quad /4Gb memory/hdd 500g/ネットワークアダプター intel 82566dc-2 gigabit network connection/ OS Windows8.1 PCには疎いため、何か対策があるのかどうか、ご教授宜しくお願い致します。  

  • UDPパケットの分割について

    こんにちは。 現在、クライアント&サーバの通信プログラムを作成しています。 クライアントがサーバに接続しにいく際、サーバの待ち受けポートにクライアントが UDPでブロードキャストしています。 その際、クライアントの情報もUDPに乗せて、送信しています。 ここで、問題なのですが、ネットワークモニタで通信データを見てみると、 クライアントから送信するUDPデータが1500バイト?を超えると、UDPパケットの分割が行われ、 2つめのデータが、UDPではなく、IPで送信されています。 しかも、2つめのIPのパケットがサーバ側に届くケースと届かないケースがあるように見受けられます。 (環境の違いかもしれません。) 2つめのパケット破棄は破棄が起こる環境では必ず起きます。 破棄が起きない環境では一回も起こりません。 スイッチ、NIC等で、破棄することってあるのでしょうか? ネットワーク上の問題っぽいので、OSの違い(Win2K pro,Win2k advanced server) などには関係ないですよね? どなたが、ご存知の方がおられましたらご教授願います。

  • Windows8.1をインストしたらネットリンク

    Windows8.1をインストールしたところネットリンクが1Gbpsから100Mbpsに下がってしまいました。 LANのドライバーも更新したり戻したりしましたが変わりません。 これって単にPCがWindows8.1に対応してないのでしょうか。 Windows7ではGigabit対応で1Gbpsでリンクしてました。 元々はWindows7 Home Premium 64ビットでしたが、マイクロソフトからアップグレード版をダウンロードしたものの、ダウンロード、ダウンロードのチェックで83%から進まずトラブルが続いてたのでマイクロソフトへ連絡してサポートして頂いたところ「8のプロダクトキーで8.1をダウンロードしてDVDに焼けるので・・・」という事で8.1をダウンロードしてDVDに焼いてインストールしました。 Windows7に戻したい気持ちもありますがお金を出してるので出来ればWindows8のまま使用したいです。 メーカーHPで調べたところWindows8まではドライバーやソフトがサポートされてるようですが、8.1だとサポートしてないようです。 (Windows8も8.1も変わらないと思いますが・・・) Windows8にしたところでGigabitになるとも思えません。 一体どうしたらいいでしょうか。 Windows7に戻す。 Windows8にしてみる。 Windows8.1のまま使う。 メーカー:富士通 商品名:ESPRIMO FH77/GD 型番:FMVF77GDW http://www.fmworld.net/cgi-bin/driversearch/drvlistm.cgi?MODEL_NAME=FMVF77GDW&KANZEN=1