共有インターネット接続での帯域幅管理のオプション


13

前提:

田舎の場所。高帯域幅のインターネット接続には多くの選択肢はありません。最も速いのは衛星インターネットですが、それは高価で(機器と月額の両方のコストがあり、遅延の欠点があります)、複数の世帯が共有したいと考えています。

これ自体は簡単です。各家庭(VLANまたは物理ポート)にサブネットを持つルーターをセットアップし、それらの間のトラフィックをブロックし、それらのサブネットにルーティングするようにモデムを構成するか、ダブルNATをセットアップします。

問題:

TCPが通常機能する方法は、各TCP接続が多かれ少なかれ利用可能な帯域幅の1 / nを取得することを意味します。ここで、nは接続の数です。そのため、1人の世帯/ユーザーが多数の接続を作成すると、接続全体の大きなシェアを獲得できます。これは特に公平ではありません-飽和リンクでは、各世帯が平等なシェアを獲得する必要があります。一方、誰も接続を使用していない場合、全帯域幅を使用できるはずです。

たとえば、4世帯が12Mビット/秒のダウン接続を共有しているとします。それらのいずれかがダウンロード/ストリーミング/何であれ、彼らは完全な12Mbit / sを使用できるはずです(または十分に近い)。2つの世帯が接続を使用している場合、1つの世帯が1つのファイルをダウンロードしているかどうかに関係なく、それぞれ6Mbit / sを取得する必要があります。11。(帯域幅管理なしで、各ファイルはおよそ1Mbit / sそれぞれ4Mbit / sを取得します。

私がこれまでに解決したこと:

このようなポリシーを実装するのに最適な場所(ダウンストリーム用)は、狭いパイプのもう一方の端、つまりISPです。明らかに、この場合はそれが不可能なので、なんとかそれを近似できると良いでしょう。しかし、どのように?このようなものをサポートする市販のルーターはありますか?LinuxまたはBSDボックスを構成することはできますか?それは防弾である必要はありません-誤動作するTCPサーバーまたは攻撃的なUDPサービスはおそらく最後に私ができることを回避することができます-しかし、それは多くのRFC準拠で構成されるトラフィックの一般的なケースで動作するはずですTCP接続。

明確にするために、私は特定のアプリケーションに優先順位を付けることについて話しているのではなく、特定のイーサネットデバイスまたはIPアドレス範囲との間でトラフィックを集約します。一部のトラフィックに他のトラフィックよりも高い優先順位を与えることは十分にサポートされているようですが、トラフィックのクラスに帯域幅を均等に割り当てようとすると状況はそれほど明確ではありません。

Web上のトラフィックシェーピングについては、ひどく書かれた/ひどく逆流された/そうでなければ情報のない情報がたくさんあります。ルーターのハードウェアに関するドキュメントは非常に不明確であるため、私は輪になって走り回っているようです。

私が理解しているように、TCPをこのように動作させる方法は、実際に利用できるよりもわずかに狭いパイプを実際にシミュレートし、パケットをドロップしてバックオフさせることです。したがって、余分なパケットを人為的にドロップすることにより、上記の例で全員に正確に3Mbit / sを提供するのはかなり簡単だと思います。ほとんどの場合、予備の容量があるため、これは実際に接続を効率的に使用しません。

私が求めていることを行う方法はありますか?私はそれについて間違っていますか?私は(または問題の世帯は)これにお金を使うことをいとわない-それは手頃な価格の既製のルーター/アプライアンスであろうと、LinuxまたはBSDディストリビューションを実行する汎用ボックスであろうと。

回答:


4

この問題を解決するために何かを構築する場合、これをセットアップします:

ここでは、1つのリンクを共有する4台のコンピューターの例を取り上げます。ネットワークは次のような形になります。

{ ISP }=========[ SOHO router] ===LAN1=== [eth0 |Linux Box| eth1] ===LAN2=== Home Desktops/Laptops

LAN2で静的IPアドレスを使用するとします。

Linux Box 192.168.1.1
Home 1    192.168.1.11
Home 2    192.168.1.12
Home 3    192.168.1.13
Home 4    192.168.1.14

最初に小さなスクリプトを作成して、クライアントにpingを実行し、どこかに結果を書き込むことで、どのクライアントが稼働しているかを検出します。「これは読者の課題として残されています」接続されたホストの合計数を計算します(1〜4)

ホストがオンラインでない場合は必ず処理してください。

合計帯域幅を分割しますが、接続されているホストの数は分割します。(1が12Mb、2が6Mb、3が4Mb、4が3Mb)

次に、tcをHTBアルゴリズムとともに使用して、WAN側デバイスの各アドレスの帯域幅を制限します。まず、ルートクラスを作成します。

DEV="eth0"
TC="/sbin/tc"
TOT_BW=12
$TC qdisc add dev $DEV root handle 1: htb default 99

次に、「クライアント」ごとにクラスを追加します(ここでは、たとえば3つのクライアント)

NB_CLT=3
CLT_BW=$(($TOT_BW/$NB_CLT))mbit
for i in seq $NB_CLT
do
    $TC class add def $DEV parent 1: classid 1:$i htb rate $CLT_BW ceil $CLT_BW burst 15k cburst 1500
    $TC filter add dev $DEV protocol ip parent 1:0 prio 1 flowid 1:$i u32 \
     match ip dst 192.168.1.1$i/32 \
     match ip src [Router IP in LAN1]/32
done

(上記のスクリプトは完全にテストされておらず、タイピングエラーがありません)

毎分実行されるように適切にスクリプトを作成し、新しいホストが起動または停止するたびにバケット/フィルターを更新する必要があります。

それが正しい方向、幸運をあなたに向けることを願っています。

代替ソリューション

すべてのホストにローカルQoSソフトウェアをインストールして、帯域幅を制限します。個人的にNetLimiterを使用する(非無料)


私のアプローチの問題は、すべてのホストが共有をすべて使用していなくても、すべてのホストが相手の帯域幅を減らすことです。しかし、需要が高いときにのみ共有を強制するものを設計することは困難です。
mveroone 14年

2

OpenWRTはそれをサポートしているように見えますが、私自身は使用したことがありません。あなたはを見てとることができ、ネットワークトラフィック制御彼らのウェブサイトのページ、特に第二の例:HTBと(トラフィックシェーピング別名)無地シンプルな帯域幅の共有。これにはqdiscの単純な呼び出しが含まれるので、どのLinuxボックスでも実行できます。


その例がアップロード側のものであることに気付きました。私は現在、Linux Advanced Routing&Traffic Control HOWTO読んでいますが、これはいくぶん前途有望であり、これらのすべてのtcルールを理解できることを願っています。Linuxのトラフィックシェーパーは確かに有望に見えます。
pmdj

0

/superuser//a/1210164/257859で説明されているセットアップは、まさにそれを行います。

[...]キューは、制限されたBWをすべてのLANクライアントに正確に分配します(正確にはLAN IP)。


1
複数の質問に同じ回答を投稿しないでください。同じ情報が実際に両方の質問に答える場合、一方の質問(通常は新しい質問)をもう一方の質問の複製として閉じる必要があります。重複として閉じるように投票することでこれを示すことができます。または、そのための十分な評判がない場合は、重複であることを示すためにフラグ立てます。それ以外の場合は、この質問に対する回答を調整し、同じ回答を複数の場所に貼り付けないでください。
DavidPostill

@DavidPostill私は重複して投票することを考えましたが、これは3年前の質問なのでbecauseしました。さらにmeta.superuserを検索し、meta.superuser.com / questions / 3524 /…で関連する質問を見つけました。メタを読んだ後、状況は複雑だと思います(それぞれに十分な議論がある2つの古い質問の答えがあります)。私はあなたの考えを聞いてもいいです。
ndemou
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.