この記事はWeChatの公開アカウント「Linux Kernel Things」から転載したもので、著者はsongsong001です。この記事を転載する場合は、Linux Kernel Matters パブリック アカウントにご連絡ください。 コンテナ化が普及しつつある今日、Docker はコンテナ界の寵児と言えるでしょう。かさばる仮想マシンと比較すると、Docker はツバメのように軽量です。もちろん、この記事では仮想マシンと Docker の長所と短所を紹介するのではなく、Docker ネットワークの重要なコンポーネントの 1 つを紹介します。 仮想ネットワークデバイスペア: veth veth を紹介する前に、まずネットワーク名前空間を紹介しましょう。 ネットワーク名前空間ネットワーク名前空間は、Linux カーネルによって、異なるコンテナ間のネットワーク リソースを分離するために使用されます (各 Docker コンテナには独立したネットワーク名前空間があります)。ネットワーク名前空間は主に次のリソースを分離します。
次の図に示すように、システム内に 3 つのネットワーク名前空間がある場合: 異なるネットワーク名前空間は互いに分離されているため、直接通信することはできません。たとえば、IP アドレスが 172.17.42.1 のデバイスはネットワーク名前空間 A に設定されていますが、次の図に示すように、ネットワーク名前空間 B ではアクセスできません。 2 台のコンピューターの場合と同様に、ネットワーク ケーブルで接続されていないと、コンピューター同士は通信できません。そのため、Linux カーネルは、異なるネットワーク名前空間間の通信を解決するために、仮想ネットワーク デバイス ペア (veth) 機能を提供します。 仮想ネットワークデバイスペア (veth)仮想ネットワーク デバイス ペアは、異なるネットワーク名前空間間の通信を解決するために使用され、ネットワーク ケーブルで接続された 2 つのネットワーク カードとして表示できます。次の図に示すように、ネットワーク カードの 1 つがネットワーク名前空間 A に配置され、もう 1 つのネットワーク カードがネットワーク名前空間 B に配置されている限り、2 つの異なるネットワーク名前空間は通信できます。 上図に示すように、veth0 と veth1 は仮想ネットワーク デバイス ペアを形成します。仮想ネットワーク デバイス ペアはパイプのようなものです。データが一方の端に送信されれば、もう一方の端からデータを受信できます。 Docker は仮想ネットワーク デバイスを使用して、異なるコンテナー間の通信を実装します。原則は次のとおりです。 上の図からわかるように、各コンテナは仮想ネットワークデバイスペアを介して直接接続されていません。代わりに、ホスト上に docker0 という名前のブリッジが作成され、各コンテナは仮想ネットワーク デバイス ペアを介してブリッジに接続されます。ブリッジは、実際のスイッチと同様に、複数のネットワーク デバイスを接続する機能を備えています。 もちろん、この記事のテーマは veth の実装であり、ブリッジの実態ではないので、ブリッジの紹介はここで終わります。ご興味がございましたら、「Linux Bridge の動作原理と実装」の記事を参照してください。 仮想ネットワークデバイスペアの実装Linux カーネルでは、ネットワーク デバイスは net_device オブジェクトによって表されます。 veth は双方向通信を提供するため、これを実装するには 2 つの net_device オブジェクトが必要です。 net_device オブジェクトは非常に大きいため、この記事に関連するフィールドのみをここにリストします。
これら 2 つのフィールドの機能について次に説明します。
veth は 2 つの net_device オブジェクトで構成されているため、これら 2 つの net_device オブジェクトは互いへのポインターを持つ必要があります。しかし、コードを調べても、お互いを指すポインターは見つかりませんでした。カーネルは veth をどのように実装するのでしょうか? Linux カーネルは、net_device オブジェクトを使用してネットワーク デバイスを表しますが、異なるメーカーのネットワーク デバイスは互いに異なる場合があります。 Linux カーネルをさまざまなネットワーク デバイスに適応させるために、さまざまなネットワーク デバイスにプライベート データ用のストレージ スペースが提供されます。 つまり、ネットワーク デバイスには、net_device 部分に加えてプライベート データ部分があります。ネットワーク デバイスごとにプライベート データ部分が異なり、ネットワーク デバイスのプライベート データ部分は通常、次の図に示すように、net_device オブジェクトの最後に保存されます。 上図は、PCMCIA ネットワーク カードと RTL-8139 ネットワーク カードに対応するプライベート データ部分の保存場所を示しています。 PCMCIA ネットワーク カードのプライベート データ部分は pcnet_dev_t 構造体に対応し、RTL-8139 ネットワーク カードのプライベート データ部分は rtl8139_private 構造体に対応します。 話題に戻ると、仮想ネットワーク デバイス ペアのプライベート データ部分は、次のように定義される veth_priv 構造体によって表されます。
veth_priv 構造体の各フィールドの機能について次に説明します。
veth_priv 構造から、次の図に示すように、仮想ネットワーク デバイス ペアに属する 2 つのデバイス オブジェクトが peer フィールドによって関連付けられていることがわかります。 1. 仮想ネットワークデバイスペアを作成する ip コマンドを使用して仮想ネットワーク デバイスのペアを作成すると、作成を完了するために veth_newlink 関数が呼び出されます。実装は次のとおりです。
上記のコードは合理化された後もメインロジックを保持するため、veth_newlink は主に次のタスクを実行します。
このようにして、仮想ネットワークデバイスのペアの作成が完了します。 2. 仮想ネットワークデバイスペアを初期化する もちろん、仮想ネットワークデバイスペアを作成する場合は、初期化も必要です。初期化プロセスは、次のように実装される veth_setup 関数によって完了します。
仮想ネットワークデバイスペアを初期化する際に最も重要なことは、その操作機能セットを設定することです。 net_device_ops 構造体は、ネットワーク デバイスの操作機能セット構造体です。デバイスにデータが送信されると、デバイス操作機能セットの ndo_start_xmit メソッドがトリガーされます。 veth_setup 関数はこのメソッドを veth_xmit に設定します。つまり、仮想ネットワーク デバイス ペアの一方の端にデータを送信するときに、veth_xmit 関数が呼び出されてデータが送信されます。 3. 仮想ネットワークデバイスペアにデータを送信する 仮想ネットワーク デバイス ペアの一方の端にデータを送信する場合、送信プロセスを完了するために veth_xmit 関数が呼び出されます。これは次のように実装されます。
まず、veth_xmit 関数の各パラメータの意味を紹介します。
veth_xmit 関数の実装は比較的単純で、主に次のタスクを実行します。
データ送信のプロセスを示すために次の図を使用します。 上図に示すように、仮想ネットワーク デバイス ペアの一方の端からデータ パケットが送信されると、もう一方の端で受信され、カーネル プロトコル スタックに送信されて処理されます。 要約する仮想ネットワーク デバイス ペアの出現により、コンテナー間の通信の問題が解決されます。この記事では、主に仮想ネットワーク デバイス ペアの実装原理を分析しますが、一部の詳細については詳細に分析されていません。ご質問がある場合は、WeChat で私を追加して話し合うことができます。 |
<<: アリ・ジア・ヤンチン:ビッグデータとAI機能を通じて企業にアップグレードの力を提供する
新しい検索結果ページ古い検索結果ページGoogle検索結果ページ新浪科技報、北京時間5月2日午後のニ...
自己紹介させてください。私の名前はボボです。SEO 業界で働き始めたばかりです。現在は、ウェブサイト...
[51CTO.com クイック翻訳] Kubernetes は、コンテナ化されたアプリケーションを大...
ロングテール キーワードは、多くの SEO 担当者にとって、ウェブサイトへのトラフィックを誘導するの...
モーニングポストニュース(記者 韓元佳)アリババ会長のジャック・マーは「WeChatとの別れ」を発表...
すべてのアプリケーションがエッジ コンピューティング用に構築されているわけではありません。実際、今日...
今夜(4月11日)、私は自分のブログ本文からエクスポートされたリンクを注意深く数えてみたところ、その...
長い間何も書いていませんでした。怠惰は誰にでも共通する問題であり、もちろん私も例外ではありません。最...
百度の 11 の現象がいつごろから広く知られるようになったのかを正確に知ることは非常に困難です。ただ...
今日メールを開くと、ドメイン名登録番号が発行されていたことがわかりました。このドメイン名は昨年12月...
仕事柄、SEO がどのように行われているか、ウェブサイトの重量は安定しているか、収益はどうなっている...
過去1年間、疫病の影響により、企業の生産およびコラボレーションモデルは大きな変化を遂げ、オフラインか...
テンセントQQグループは、ユーザーを強制的にページにジャンプさせ、トロイの木馬をインストールするため...
SEOVIPウェブサイトは2012年11月15日に開設されました。18日後、ターゲット最適化キーワー...
アメリカの独立系サーバー業者 spinservers は現在、中国市場向けに、月額 99 ドルという...