ネットワークとオペレーティング システム カーネルは、私にとっては馴染みのないものですが、魅力的でもあります。私はそれらの背後にある真実を明らかにしたいと思っています。 前回の投稿では、Kubernetes ネットワーク モデルについて詳しく説明しました。今回はもう少し深く掘り下げて、Kubernetes でパケットがどのように送信されるかを理解し、Kubernetes の eBPF ネットワーク アクセラレーションを学習する準備をし、ネットワークとオペレーティング システム カーネルについての理解を深めたいと思います。記事に漏れがあるかも知れませんので、アドバイスを頂ければ幸いです。 始める前に、私の学習成果を一文でまとめます。データ パケットのフローは、実際にはネットワーク ソケット記述子 (ソケット ファイル記述子、中国語は少し長いので、以下ではソケット fd と呼びます) のアドレス指定プロセスです。これは単にソケット fd のメモリ アドレスを参照するだけでなく、そのネットワーク アドレスも含まれます。 Unix および Unix ライクなシステムでは、すべてがファイルであり、ソケットもファイル記述子を通じて操作できます。 基礎データパックデータ パケットの流れについて説明するので、まずはデータ パケットとは何かを見てみましょう。 ネットワーク パケットは、ネットワーク データグラムまたはネットワーク フレームとも呼ばれ、コンピュータ ネットワークを介して送信されるデータの単位です。最も一般的な TCP データ パケットを例にとると、次の部分が含まれます。
アプリケーションがソケットを使用してデータをネットワークに送信するプロセスは、TCP パケット、IP パケット、イーサネット パケットなどのヘッダー情報を使用してデータをカプセル化するプロセスとして簡単に理解できます。逆に、ネットワークからイーサネット パケットを受信して、アプリケーションが処理できるデータに変換するのが、アンパックのプロセスです。パケットのカプセル化とカプセル化解除のプロセスは、カーネル ネットワーク プロトコル スタックによって完了します。 以下では、ソケットとカーネル ネットワーク プロトコル スタックの処理についてそれぞれ説明します。 ソケットソケットは、コンピュータ ネットワークで使用されるプログラミング インターフェイスであり、ユーザー スペース (ユーザー アプリケーションが実行されるスペース) とカーネル ネットワーク プロトコル スタック (データをカプセル化して解凍するカーネル内のコンポーネント) の間にあります。 プログラミング インターフェイスとして、ソケットは次の操作を提供します (一部のみをリストします)。
次の図から、各操作の役割を直感的に感じることができます。 カーネルネットワークプロトコルスタックの説明を始める前に、まずメモリ内のデータパケットのデータ構造であるsk_buff[1]について説明します。 sk_バフsk_buff は、Linux カーネルでネットワーク パケットを管理するために使用されるデータ構造です。パケットのプロトコル、データ長、送信元アドレスと宛先アドレスなど、受信および送信されたネットワーク パケットのさまざまな情報とプロパティが含まれます。sk_buff は、ネットワーク層とデータ リンク層の間で渡すことができるデータ構造であり、TCP/IP、UDP、ICMP など、すべてのタイプのネットワーク プロトコル スタックで使用できます。 sk_buff は、データリンク層、ネットワーク層、トランスポート層など、ネットワーク プロトコル スタックのさまざまな層の Linux カーネルで広く使用されています。 sk_buff データ構造には、4 つの重要なフィールドを含む多くのフィールドがあり、それらはすべてポインター型です。さまざまなレイヤーでの sk_buff の使用は、これらのポインターを変更して、ヘッダーを追加 (パッケージ化) したり、ヘッダーを削除 (アンパック) したりすることによって実現されます。
カーネルネットワークプロトコルスタックパケットアプリケーションは、ソケットの sendmsg 操作を使用してデータを送信します (netfilter、トラフィック制御、およびキュー規律についてはここでは詳しく説明しません)。
開梱NIC はネットワークからデータ パケットを受信します (ダイレクト メモリ アクセス、ネットフィルタ、トラフィック制御についてはここでは詳しく説明しません)。
Kubernetes ネットワーク モデル基本的な知識のもう 1 つの部分は、Kubernetes ネットワーク モデルです。前の記事「Kubernetes ネットワーク モデルとネットワーク通信の詳細な調査」を参照してください。 Kubernetes におけるパケットフローここでは、前回の記事で説明した 3 つの通信シナリオについて引き続き説明します。ポッド間の通信にはポッドの IP アドレスが使用されます。サービス経由のアクセスについて議論する場合、netfilter が含まれると議論の長さが大幅に長くなります。 同じポッド内のコンテナ間の通信ポッド内の 2 つのコンテナ間の方法では、通常、ループバック アドレス 127.0.0.1 が使用されます。パケットルーティングプロセス#4では、ループバックネットワークカードloを使用して送信することが決定されます。 同じノード上のポッド間の通信curl によって送信された要求は、パケット #4 で eth0 インターフェイスを使用しているものとして識別されます。次に、eth0に接続されたトンネル veth1 を介してノードのルート ネットワーク空間に到達します。 veth1 は、ブリッジ cni0 と仮想イーサネット インターフェイス vethX を介して他のポッドに接続されます。パケット #10 L2 アドレス指定では、ARP 要求がブリッジを介してすべての接続されたインターフェイスに送信され、元の要求の宛先 IP アドレス (ここでは 10.42.1.9) があるかどうかが確認されます。 veth0のMACアドレスを取得した後、パケット#11のデータパケットのリンク層情報を設定します。データ パケットが送信されると、veth0 トンネルを介してポッド httpbin の eth0 インターフェイスに入り、解凍プロセスが開始されます。 解凍プロセスは特別なものではなく、httpbin によって使用されるソケットが決定されます。 異なるノード上のポッド間の通信ここでの状況は少し異なります。 cni0 を介して ARP 要求を送信した後、応答が受信されない場合は、ホストのルーティング テーブルであるルート名前空間を使用して、ターゲット ホストの IP アドレスが決定されます。次に、ARP 要求がホストの eth0 を介して送信され、ターゲット ホストから応答が受信されます。パケット#11にMACアドレスを書き込みます。 データ パケットがターゲット ホストに送信された後、解凍プロセスが開始され、最終的にターゲット ポッドに入ります。
要約する統計によると、3 つのシナリオすべてにおいて、カーネル ネットワーク プロトコル スタックは、同じポッドまたはノード内であっても、パケットを 2 回処理します (netfilter プロセスを含む)。これら両方の状況は実際には同じカーネル空間で発生します。 同じカーネル空間内の 2 つのソケットがデータを直接送信できる場合、カーネル ネットワーク プロトコル スタックの処理によって発生する遅延を回避できますか? 次の記事に続きます。 参考文献[1] sk_buff: https://elixir.bootlin.com/linux/latest/source/include/linux/skbuff.h#L843 |
<<: エッジコンピューティングは長い間私たちの身近に存在してきました
Speedypage は、米国東海岸の Ashburn データセンターの VPS で、AMD Ryz...
コンテンツのないマーケティングは空砲を発射するようなものです。大きな音はしますが、栄養価はなく、内臓...
2021年初頭、主要機関は今後の技術発展の動向分析と展望を発表しました。クラウドネイティブ、ビッグデ...
4月12日から5月31日まで、Megalayerは、中国香港と米国サンノゼの2つのデータセンターの独...
エッジ コンピューティングは、コンピューター ビジョンをインテリジェント システム、スマート デバイ...
成都ビジネスデイリーのマイクロコミュニティ「紅星制作チーム」は、立ち上げ以来、数万回の訪問と多くのア...
pumpcloud は設立されてから数年が経ち、主に香港のダイナミック IP VPS、香港の固定 I...
「継続的インテグレーション」に精通している方であれば、「継続的インテグレーションの使用は必須となって...
百度が23日に正式に発表した「ハイパーリンク不正アルゴリズムアップグレード」が発効したとみられる。百...
[編集者注] この記事は、ブログ「Usability Counts」から @C7210 によって翻訳...
著者は2008年末にウェブマスター業界で働き始め、あっという間にウェブマスターとして4年目を迎えまし...
BandwagonHost VPS は、低価格、高速、使いやすさで常に知られています。ただし、Ban...
この記事の著者は、 Didiと Uxin で勤務し、多数の成長事業を担当してきました。製品の成長ロジ...
[[417927]]環境: springboot2.3.12.RELEASE + kafka_2.1...
Hosteons のお買い得な VPS が話題になっています。これから、Hosteons のロサンゼ...