Windows system >> Windowsの知識 >  >> Linuxシステムチュートリアル >> Linuxチュートリアル >> Linuxでデバイスソケットをネットワークへの結合のアプローチ

Linuxでデバイスソケットをネットワークへの結合のアプローチ

  
                  


の事の原因の1原因は、私は、接続を指すように、帯域幅ポイントを拡張するために、2つのCDMAモデムを使用しようとし、2つのモデム間の負荷分散を実現したいと考えていますということです。しかし残念ながら、中国聯通のアクセスデバイスは、マルチリンク・PPPをサポートしていません。だから、方法はありません、私は、負荷分散を実装するしかありませんでした。ロードバランシングを実現するための方法は、一つの方法は、カーネルレベルで実装されたパッケージ・レベルのロード・バランシングを完了するために、iproute2をを使用して、ネットワーク上の指定され、いくつかあります。しかし、私は、各モデムに自分のトラフィックを制御することができるようにしたい、完了するために、カーネルにすべてのことをしたくありません。だから、どのように私はそれを行う必要がありますか?

最初は、私は、各ソケットは、ローカルIPアドレスにバインドされている方法は、2つのソケットを作成することだと思う、私はこの意志を考える
2.ソリューションネットワークデバイスから送信された原因データがバインドされたIPアドレスが配置されています。しかし、この考え方は間違っていることが判明しました。パケットを送信する前に毎回ので、カーネルがどのネットワークインタフェースからパケットを送信するために、ルーティングテーブルを決定する必要があります。適当なルーティングテーブルエントリが見つかると、ルートからテーブルエントリが送信されたネットワーク・インターフェース・パケットに示します。ルーティングテーブルがキャッシュされ、その各パケットが送信された後、データパケットを送信するためのインターフェースが再びカーネルを選択されているのより大きなチャンスがありますのでこのように、問題があります。最悪の場合、忙しいモデムを引き起こすが、他のモデム&'ます。プ'。これは明らかに私の本来の意図に反しています。結果は、他に、モデムのデータを数百キロバイトを送信した後に、まだだけ何十B.を送ったことを示しましたケースされていることを、そうです!上記の考えに従う前に、実際にそれがパケットを送信して少しずつ時間を驚かせた、ルーティングテーブルが最初に調整されます。ルーティングテーブルを調整して行うことは非常に簡単です。しかし、そうするのは少し面倒でもあるので、これはまた、捨てられた私の考えです。私もこの方法の実現可能性をテストしますが、理論的には可能ではありませんでした。また、それはちょうどそれのように、その中で達成されるが、場合インターネットルーティングレベルのロード・バランシングに記載の方法では、私が一番下に取得できませんでした。繰り返し失敗した試行の後、私は、「UNIXネットワークプログラミング」を入れて、UDP関連の部品を外に移動し、再び画面になります。唯一の場所の役割の可能性を発見した:SO_DONTROUTEが、オプションのもう少しあいまいな役割:あなたはのsetsockopt()を介してインターフェースオプションのセットを設定することができます。漠然としたとあいまいなリターン、私は実際の結果はまだ不明な理由のために十分ではない、それを試してみました。だから、私は、Linux自体が戻っていた、強大なマニュアルに対する男性の多くは、読みます。 SO_BINDTODEVICE:私は突然、私は自分自身のインタフェースオプションのセットにする方法を見ソケット(7)を、参照するとき。文字通り、このオプションは、私が欲しいものでなければなりません。その後の試験結果は、それが本当であることを証明します。説明ソケットオプションは、で:. SO_BINDTODEVICEバインドソケット(7)QUOT&ような特定のデバイスにこのソケットを以下;はeth0"、名前が空の文字列であるか、またはオプションの長さがゼロの場合通過インターフェース名で指定され、除去された結合ソケット装置は、渡されたオプションは、可変長ヌルがIFNAMSIZの最大サイズとのインタフェース名の文字列を終了する。ソケットがインターフェースにバインドされている場合、唯一のソケットによって処理される特定のインタフェースから受信したパケット。これが唯一のいくつかのソケットタイプ、特にAF_INETソケットのために働くことに注意してください。これは、パケットのソケットではサポートされていません。ここでは、私が直接コピーされた((8)が、通常のバインドを使用します)。しかし、バインドは(8)間違ってなければならないことを最後に、それがバインド(2)息子のことは明らかです。それがあるかどうか、私は物事を修正するつもりはないです。この通路の中心を意味する:パケットがインタフェース処理装置からのみ適用された後、ソケットを特定のネットワークインターフェースにバインドされたとき。だから、それのパケットを送信ソケットがされた場合はどうなりますか?かどうか、それは唯一のネットワークインターフェース、そこから発行されますか?ぞっとするにはノーと言うがないことです。しかし、気にしないで、我々はテストを知っているだろう。最初は、私はあなたがこのように見ることができると仮定します。char * DEV =" ppp0の"; int型sock1 =ソケット(AF_INET、SOCK_DGRAM、0);のsetsockopt(sock1、SOL_SOCKET、SO_BINDTODEVICE、DEV、はsizeof(DEV));しかし、練習は再び私が間違っていたことを証明しています。しかし、私はそれを助けることができない、(7)はそれほど目立たない書かれているソケットの命令が、私は許されるべき手がかりが表示されません。しかし、Googleは手にあり、この小さな問題は、私は恐れることは何もありませんか?だから、グーグル、すぐに問題の核心を見つけた:Linuxでは、ネットワーク機器は、基準構造体いるifreqによって行われます。 netdevice(7)以下の構造で説明:構造体いるifreq {ifr_nameに[IFNAMSIZ]チャー; /*インタフェース名* /組合{構造体sockaddrifr_addr、構造体sockaddrifr_dstaddr、構造体sockaddrifr_broadaddr、構造体sockaddrifr_netmask、構造体sockaddrifr_hwaddrと、短いifr_flags; INT ifr_ifindex; int型ifr_metric; ifr_mtuをint型、構造体ifmapifr_map;};}; [IFNAMSIZ] ifr_newnameをchar型;するchar * ifr_dataをifr_slaveは[IFNAMSIZ] char型ここでは、私はちょうどこのドメインのifr_nameにメンバーが十分である必要があります。構造体いるifreq if_ppp1; strncpyを(if_ppp0.ifr_name、" ppp0の" IFNAMSIZ)はstrncpy(if_ppp1.ifr_name、" PPP1" IFNAMSIZ); sock1 =ソケット(AF_INET、SOCK_DGRAM構造体いるifreq if_ppp0:このコードは、次のように変形されます、0); sock2 =ソケット(AF_INET、SOCK_DGRAM、0); IF(のsetsockopt(sock1、SOL_SOCKET、SO_BINDTODEVICE、(チャー*)& if_ppp0、はsizeof(if_ppp0))/*エラー処理* /} IF(のsetsockopt(sock2 、SOL_SOCKET、SO_BINDTODEVICE、(チャー*)& if_ppp1、はsizeof(if_ppp1))/*エラー処理* /}次に、プログラムの本体部分、sock1に、あろうまたsock2上のパケットの各送信データパケットを送信し、すべてのデータ・パケットのサイズは同じであるので何の行動プログラムは、データを受信しないようになるため、ネットワークインターフェイス上で送信されると予想されるデータの量は、ほぼ二魚でなければならない。強く試験結果にこの推測をサポートしています。いくつかの時間のためのプログラムを実行した後、データのインターフェースppp0量に送られた702キロバイトです元の状況に比べPPP1インタフェース8Array5KB上で送信されるデータの量。一方で、依然としてほぼ200キロバイトの違いが、どのような場合には、多くのことを改善しました。200キロバイトの間に、このようなギャップがある理由については、著者らはまた、原因.wwwを見つけます。 (1)TCPソケット、UDPソケット、RAWソケットのために、あなたはソケットオプションをSO_BINDTODEVICEことができます。it165.net結論3.よりSO_BINDTODEVICEソケットオプションは、男を読んでフル後の著者は、以下の結論に達しました後にのみトランシーバソケット指定されたネットワーク・インタフェースを介してすべてのパケットを、指定されたネットワーク・インタフェース・バインディングへのソケットを結合;(2)パケットタイプソケットため、Bunengtongguoは、特定のネットワークSO_BINDTODEVICEに結合しますインターフェースが、(2)特定のネットワークインターフェース、構造体sockaddr_llのために使用されるソケットアドレス構造体と結合する結合を介して、この構造は、特定のネットワークデバイスの独立したソケット・アドレス・リンク層アドレス構造、です。例えば、アドレス構造はPPPデバイスを表すために使用されてもよく、装置は、イーサネット(登録商標)を表すために使用することができます。 (3)SO_BINDTODEVICEソケットオプションは、Linuxシステムでのみ利用可能です。あなたが複数のプラットフォームCaozuoxitong上で動作するプログラムを書きたい場合は、特定のデバイスを完成するためにSO_BINDTODEVICEバインドソケットに頼ることはできません。しかし、著者は、TCPソケットとRAWソケットをテストしていません。私は実際に(2)の結合によって指定されたネットワーク・インターフェースにバインドされたパケットソケット見つかりDHCPDのソースコードを読み取るためPACKETソケットのために、上記の結論は、信頼あります。
zh-CN"],null,[1],zh-TW"]]]

Copyright © Windowsの知識 All Rights Reserved