5日目:アプリケーション層-CDN、TCPソケットプログラミング、UDPソケットプログラミング、まとめ

いい加減にして!ブロガーを盗む!

0、キラーアプリケーション(キラーアプリケーション)

1.ネットワークトラフィックが大きな割合を占めています
2.ユーザーにとって最も魅力的です。たとえば

、ビデオアプリケーション:youtube、tiktok、iqiyi、Tencent映画...


ビデオトラフィック:インターネットの帯域幅の大部分を占めます
課題:不均一性
異なるユーザーは異なる機能を持っています(例:有線アクセスとモバイルユーザー、帯域幅が豊富で制限されたユーザー)
ソリューション:分散型のアプリケーションインフラストラクチャ


ビデオについてもう一度話しましょう:

  • ビデオ:固定速度で表示される一連の画像。例:24画像/秒

  • ネットワークビデオ機能:
    高ビットレート:オーディオの場合は10倍以上、ネットワーク帯域幅の要件が高い
    圧縮可能
    ネットワークトラフィックの90%以上がビデオ

  • デジタル画像:
    ピクセルの配列各ピクセルはいくつかのビットで表されます

  • コーディング:画像と画像間の冗長性を使用して、コード化されたビットの数を減らします
    。空間的冗長性(画像内)
    時間的冗長性(隣接する画像間)
    例は次のとおりです。
    ここに画像の説明を挿入します
    フレームフレーム
    ここに画像の説明を挿入します


0.1ビデオを保存するためのストリーミングサービス(以下を参照)

ここに画像の説明を挿入します
マルチメディアストリーミングサービス:DASH

  • DASH:HTTPを介した動的でアダプティブストリーミング(httpに加えて動的でアダプティブストリーミングテクノロジー)

  • サーバー:
    ビデオファイルを複数のブロックに分割します
    各ブロックは個別に保存され、異なるビットレート(8〜10タイプ)でエンコードされ
    ますマニフェストファイル:異なるブロックのURLを提供します

  • クライアント
    最初に通知ファイルを取得します。
    サーバーからクライアントまでの帯域幅を定期的に測定します。
    通知ファイルをクエリし、一度にブロックを要求します。HTTPヘッダーはバイト範囲を指定します。
    帯域幅が十分な場合は、最大のビットレートを持つビデオブロックを選択します
    セッションのさまざまな時間に、さまざまなコーディングブロックを要求するように切り替えることができます(その時点で利用可能な帯域幅に応じて)

  • 「スマート」クライアント:クライアントは
    、ブロックを要求するタイミングを適応的に決定します(キャッシュを枯渇させたりオーバーフローさせたりしないでください)
    。要求するエンコードレートのビデオブロック(帯域幅が十分な場合は、高品質のビデオブロックを要求します)
    リクエストブロックに移動します(近くのサーバーにURLを送信するか、利用可能な帯域幅が高いサーバーにリクエストすることができます)
    ここに画像の説明を挿入します
    わかりすぎて、よくわかりません


一、CDN(コンテンツ配信ネットワーク)

課題:サーバーは、ネットワークを介してビデオコンテンツ(数百万のビデオコンテンツ)を数百万のユーザーに同時にストリーミングするにはどうすればよいですか?

  • オプション1:単一の大規模なスーパーサービスセンター「メガサーバー」
    サーバーからクライアントへのパスに多くのホップがあり、ボトルネックリンクの帯域幅が小さいため、一時停止します
    。「ツーエイトルール」は、ネットワークが同時に同じビデオで溢れていると判断します。複数のコピー、低効率(高支払い、帯域幅の浪費、効果の低下)
    単一障害点、パフォーマンスのボトルネック
    周囲のネットワークに関する輻輳
    コメント:かなり単純ですが、この方法はスケーラブルではありません

  • オプション2:CDNを介して、ネットワーク全体にキャッシュノードを展開し、サービスコンテンツを保存し、近くのユーザーにサービスを提供し、ユーザーエクスペリエンスを向上させます

    • 深く入り込む:(「大衆に深く入り込む」展開戦略)
      CDNサーバーを多くのアクセスネットワークに
      深めるユーザーに近く多数、ユーザーに近く、管理が難しい
      アカマイ、1700か所
    • 持ち帰り:(別の展開戦略「しゃがむキー」)POPの近く(複数の1stISP POPに近い)にサーバークラスターをインストールするなど
      、いくつか(約10)のキーの場所展開します。
      専用回線を使用してサーバークラスターをインストールします。
      ライムライト

ここに画像の説明を挿入します
中国Lanxun、CDNサービスプロバイダー。コンテンツアクセラレーションサービス(ストリーミングメディアオンデマンド、リアルタイムマルチメディア、ライブブロードキャスト、および春祭りガラのライブブロードキャスト)を実行します。


1.例を挙げてください。

Netflix(NetflixまたはNetflixと訳され、メンバーシップサブスクリプションストリーミングプラットフォームです)は、Akamaiのコンテンツアクセラレーションサービスを購入し、キャッシュノード(下の図の端にある濃い茶色のノード)にMadMenを事前にデプロイしました。

  • ユーザーがMadMenを注文すると、(左側の小さな家MadMenはどこにありますか?)
  • 次に、通知ファイルのマニフェストファイルを取得します。
  • 通知ファイルでは、デプロイされたノードをオンデマンドでブロードキャストできるかどうかを確認できます。
  • したがって、ネットワークの輻輳とトラフィックが最小の最も近いノード、つまり最適なノードが最初に選択され、ビデオオンデマンド(赤い矢印)が選択されます。
    ここに画像の説明を挿入します

アプリケーション層とネットワークのエッジでネットワークアクセラレーションサービスを提供します。
ここに画像の説明を挿入します

2. CDN:「単純な」コンテンツアクセスシナリオ-CDNの動作を確認するための簡単な例

ここに画像の説明を挿入します
この写真は散らかっています、説明させてください:

①:ボブはnetcema.comのウェブページを閲覧し、気に入った小さな映画を見つけて(URLはhttp://netcinema.com/6y7b23vですが、もちろんこのURLは試していません)、クリックしました。
②このURLはローカルネームサーバーの名前解決サーバーエージェントに送信されます
。③ローカルネームサーバーは、netcinemaの権威ネームサーバーをレベルごとに検索します。権威ネームサーバーはリダイレクトされたURL「http://kKingCDN.com ...」を返し、ローカルネームサーバーに「このURLを解決する必要があります」と伝えます
。④次に、ローカルネームサーバーはZhao KingCDNの権威ネームサーバーに移動し、ボブ(顧客)からの出発点として最も近いのはキャッシュノードです。
⑤したがって、ボブ(クライアント)は、ローカルネームサーバーから自分に最も近いキャッシュノードを知っています。
⑥ボブは最寄りのキャッシュノードにダッシュのストリーミングサービスを要求し、ウェブページで小さな映画を見ることができます。


今私は写真を見ています
ここに画像の説明を挿入します


1つは、TCPソケットプログラミングです。

1.ソケットプログラミング

  1. アプリケーションプロセスは、トランスポート層によって提供されるサービスを使用して、メッセージを交換し、アプリケーションプロトコルを実現し、アプリケーション
    TCP / IPを実現します。アプリケーションプロセスは、Socket APIを使用
    して、インターフェイスモードで送信サービスの場所:SAP(ソケット)にアクセスします。 :ソケットAPI
  2. 目標:ソケットと通信できるC / Sアプリケーションプログラムを構築する方法を学ぶソケット:分散アプリケーションプロセス間のドア、トランスポート層プロトコルによって提供されるエンドツーエンドのサービスインターフェイス
    ここに画像の説明を挿入します

トランスポート層サービス用の2種類のソケット:
3.TCP:信頼性の高いバイトストリームサービス
4.UDP:信頼性の低い(データUDPデータグラム)サービス

2.TCPソケット

ソケット:アプリケーションプロセスとエンドツーエンドトランスポートプロトコル(TCPまたはUDP)間のポータル
TCPサービスあるプロセスから別のプロセスへのバイトストリームの信頼性の高い送信
ここに画像の説明を挿入します


3.TCPソケットプログラミング

サーバーが最初に実行され、接続が確立されるのを待ちます

  • 1:サーバープロセスが最初に実行されている必要があります
    ウェルカムソケットを作成します(整数を返すソケットを作成します。意味があり
    ません(そしてこの整数をバインドします)ローカルポートで
    ユーザー接続の受信を待機しているウェルカムソケットのブロック(誰も接続しない場合、ブロックされます
    (待機するバンドルを作成します。これらはソケットAPI関数です)

クライアントはサーバーとの接続をアクティブに確立します。

  • 2:クライアントローカルソケットを作成します(ローカルポートに暗黙的にバインドされます)
    サーバープロセスに接続するサーバープロセスのIPアドレスとポート番号を指定します
  • 3:クライアントとの接続要求が来ると、
    サーバーはクライアントからの要求を受け入れ、待機のブロックを解除し、新しいソケット(接続ソケット値)(ウェルカムソケットとは異なります)を返し、クライアントと通信します。
    サーバーがクライアント通信できるようにする複数のクライアント通信
    送信元IPと送信元ポートを使用して異なるクライアントを区別する
  • 4:接続API呼び出しが有効な場合、クライアントPはサーバーとのTCP接続を確立します
    ここに画像の説明を挿入します

4. C / Sモードの適用例:

ここに画像の説明を挿入します

最初に2つのデータ構造を見てからC / Sソケットの相互作用についてさらに説明します。TCP
ここに画像の説明を挿入します
ここに画像の説明を挿入します

サーバーが次の図のバインド関数を呼び出す場合、パラメーター&sadは上記のsockaddr_in {}の構造です。
次のaccept()の&cadも
ここに画像の説明を挿入します
sockaddr_in {}の構造の説明です。多くの話が必要です。まず、ビデオリンクを添付して、Zheng氏の説明を確認します。21分19秒から、次の
ようになります。

最初に、サーバーはWelcomeSocket()を確立し、ランダムな整数(たとえば、8888)を返します。welcomeSocket関数にはパラメーターがあり、確立がTCPソケットかUDPソケットか、さらにはIPソケットかを表すことができます。
このとき、ソケットテーブルのエントリは次のとおりです。

ソケット s_ip スポーツ c_ip c_port
8888 / / / /

次に、bind()関数を呼び出し、ソケット8888のランダムな値をバインドし、サーバーのIP(1.1.1.1)とポート番号80をバインドします。
同時に、クライアントのIPが2.2.2.2で、ポートが777であると想定します。 。
テーブルエントリは次のように更新されます

s_socket s_ip スポーツ c_ip c_port
8888 1.1.1.1 80 / /

このエントリは、アプリケーション層とトランスポート層によって使用されるエントリです。

次に、サーバーはconnectionSocket = accept(welcomeSocket、&cad ...)を呼び出し、8888ソケット、ユーザーからの接続要求、クライアント要求なし、ブロックされるのを待ちます。

ここで、クライアントが接続要求を確立するときです。
同様に、クライアントはsocket(PF_INET、...)を呼び出して、ソケットのランダムな整数(たとえば、2222)を取得します。
ただし、違いは、クライアントが具体的にバインドする必要がないことです。暗黙的なバインドがあります。サーバーと比較して、クライアントはソケット接続を確立するために特定のポートを指定する必要はありません。
これで、クライアントにはソケットテーブルエントリもあります。


c_socket c_ip c_port s_ip スポーツ
2222 2.2.2.2 777 / /

ステータスを示すために、実際にはテーブルにもう1つの項目があります(現在は無効です)

6番目のステップでは、クライアントはconnec()を呼び出して、サーバーへの接続確立要求を開始します。(connect()のパラメーターは、サーバーのip:1.1.1.1とport:80の間のバインディング関係を示しているため、connect()が呼び出されるとc_socketテーブルエントリが更新されます)

c_socket c_ip c_port s_ip スポーツ
2222 2.2.2.2 777 1.1.1.1 80

このとき、サーバーソケットが応答し、接続が確立され、accept()がブロックを解除して、新しいソケット整数値(8899など)を返します。
このとき、サーバーソケットには、エントリが有効な値を持つ新しい行があります。

s_socket s_ip スポーツ c_ip c_port
8888 1.1.1.1 80 / /
8899 1.1.1.1 80 2.2.2.2 777

説明:
ここでは、元のwelcomeSocketをフォークし、新しい8899の有効なソケットプロセスを取得して、クライアントのソケットプロセスを処理します。
古いプロセス8888はまだポート80で待機しており、新しいクライアントプロセスが接続を要求するのを待機しています。
socketの値は、会話関係を表します。

これで、確立されたソケット接続は簡単に処理できます。connectionSocketおよびclientSocketを介して、応答の送信、読み取り、書き込みを開始します。
最後に、出発する時間だと感じたら
ここに画像の説明を挿入します
、メッセージのやり取りを表す赤い矢印を閉じます。

いくつかの実装コードを見てみましょう。
コードの説明はさらに面倒です。、、鄭先生の雄弁な説明を見てみましょう!(37分30秒)
ここに画像の説明を挿入します

ここに画像の説明を挿入しますここに画像の説明を挿入します

ここに画像の説明を挿入します

2、UDPソケットプログラミング

UDP:クライアントとサーバー間の接続がありません

  • 握手なし
  • 送信者は、各メッセージでターゲットのIPアドレスとポート番号を明確に指定します
  • サーバーは、受信したパケットから送信者のIPアドレスとポート番号を抽出する必要があります

UDP:送信されたデータが故障しているか失われている可能性があります
ここに画像の説明を挿入します

1.クライアント/サーバーソケットの相互作用:UDP

上記のTCPのソケットプログラミングを理解した後、以下のUDPのソケットプログラミングは簡単ではないでしょうか?(しかし、問題は私がまだ上記を理解していないということです)
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します
ここに画像の説明を挿入します

3、まとめ

6

おすすめ

転載: blog.csdn.net/m0_46156900/article/details/113802102