C++実践プロジェクト - TCPの詳細な説明を含むネットワークプログラミングの基礎

目次

ネットワーク アーキテクチャ パターン (Web アプリケーション設計パターン)

C/S体制

B/Sの仕組み

 Macアドレス

IPアドレス

サブネットマスク 

ポート

ネットワーク モデル

通信プロセス

パケットのカプセル化

プロトコル 

イーサネット フレーム フォーマット

ARP データグラム形式

IP データグラム形式

UDP プロトコル形式

 TCP プロトコル形式

カプセル化 

共有

TCPの詳しい説明

TCP と UDP

TCP 通信プロセス

TCP スリーウェイ ハンドシェイク

TCP スライディング ウィンドウ (TCP フロー制御)

TCP 4 波

TCP 状態遷移

半分閉じた

2MSL

ポートの多重化

ポイントツーポイント、エンドツーエンド

 ルーターとスイッチの違い


ネットワーク アーキテクチャ パターン (Web アプリケーション設計パターン)

C/S体制

        クライアント - サーバー (クライアント サーバー) 構造。サーバーはデータの管理を完了し、クライアントはユーザーとのインタラクティブなタスクを完了しますクライアントは、インターネット上の他の人の情報にアクセスするマシンであり、サーバーは、人々がアクセスできるように情報を提供するマシンです。

        クライアントは、ローカル エリア ネットワークを介してサーバーに接続し、ユーザーの要求を受け入れ、ネットワークを介してサーバーに要求を行い、データベースを操作します。サーバーはクライアントの要求を受け入れ、データをクライアントに送信します。クライアントはデータを計算し、結果をユーザーに提示しますサーバーはまた、包括的なセキュリティ保護とデータ整合性処理を提供する必要があり、複数のクライアントが同時にサーバーにアクセスできるようにする必要があります。これにより、サーバーのハードウェア処理データ機能に高い要件が課せられます。

        C/S 構造では、アプリケーション プログラムは、サーバー部分とクライアント部分の 2 つの部分に分割されます。

        サーバー部分は、複数のユーザーが共有する情報と機能であり、データベースの操作を制御するなどのバックグラウンド サービスを実行します。

        クライアント部分はユーザー専用で、エラー プロンプト、データ計算などのフロントエンド機能の実行を担当します。

アドバンテージ:

        1. 柔軟なプロトコル選択

        2. クライアントは迅速に応答します (クライアント PC の処理能力をフルに発揮でき、クライアントの処理後に多くのタスクをサーバーに送信できます)。

        3. 美しい操作インターフェースと多彩なフォルム。顧客自身の個々の要件を完全に満たすことができます

        4. C/S構造の経営情報システムは、強力なトランザクション処理能力を持ち、複雑な業務プロセスを実現できます

        5. 高度なセキュリティ、C/S は一般に比較的固定されたユーザー グループを対象としており、プログラムはプロセスにより注意を払い、アクセス許可のマルチレベル検証を実行し、より安全なアクセス モードを提供し、強力な機能を備えています。情報セキュリティの管理、一般的な機密性の高い情報システムに適したC/S体制を採用。

欠点:

        1. クライアントは特別なクライアント ソフトウェアをインストールする必要があります。第一に、インストールの作業負荷が伴います。第二に、問題 (ウイルス、ハードウェアの損傷) のあるコンピューターは、インストールまたは保守する必要があります。ソフトウェアをアップグレードすると、各クライアントを再インストールする必要があり、メンテナンスとアップグレードのコストが高くなります。

        2. 一般的に、クライアントのオペレーティング システムには制限があり、クロスプラットフォームにすることはできません。

B/Sの仕組み

        B/S構造(ブラウザ、サーバーモード)は、Web台頭後のネットワーク構造モードであり、WEBブラウザはクライアントにとって最も重要なアプリケーションソフトです。このモデルは、クライアントを統合し、システム機能実現のコア部分をサーバーに集中させ、システムの開発、保守、および使用を簡素化し、クライアントにブラウザーをインストールし、データベース (MySQL、Oracle) をサーバーにインストールするだけで済みます。サーバ。ブラウザーは、Web サーバーを介してデータベースと対話します。

アドバンテージ:

        B/S アーキテクチャの最大の利点は、全体的な所有コストが低いこと、メンテナンスが便利であること、配布が強力であること、開発が簡単であることです.特別なソフトウェアをインストールする必要がなく、どこでも運用できます.クライアントはメンテナンスを必要とせず、システムは非常に簡単に拡張できます. . 必要なのは、インターネットにアクセスできるコンピューターだけです

欠点:

        1. 通信オーバーヘッドが大きく、システムとデータのセキュリティが確保しにくい

        2. パーソナリティ特性が大幅に低下し、特定のパーソナライズされた機能要件を実現できない

        3. 固定プロトコル: http/https

        4. クライアント サーバーのインタラクティブな要求応答モードでは、通常、ページが動的に更新され、応答速度が大幅に低下します。

 Macアドレス

ネットワーク カード コンピュータがコンピュータ ネットワーク上で通信できるように設計されたコンピュータ ハードウェアの 1 つで、ネットワーク アダプタまたはネットワーク インターフェイス カード (NIC) とも呼ばれます。MAC アドレスを持ち、OSI モデルのレイヤー 2 に属します。これにより、ユーザーはケーブルまたはワイヤレスで相互に接続できます。すべてのネットワーク カードには、MAC アドレスと呼ばれる固有の 48 ビットのシリアル番号があります。ネットワーク カードの主な機能: 1. データのカプセル化とカプセル化解除 2. リンク管理 3 データのエンコードとデコード

MAC アドレスは、LAN アドレス、イーサネット アドレス、物理アドレス、またはハードウェア アドレスとも呼ばれ、ネットワーク機器の位置を確認するために使用されるアドレスであり、ネットワーク機器の製造元によって生成され、ネットワーク カードに焼き付けられます。OSI モデルでは、ネットワーク層の第 3 層が IP アドレスを担当し、データリンク層の第 2 層が MAC アドレスを担当しますMAC アドレスは、ネットワーク内のネットワーク カードを一意に識別するために使用されます。デバイスに 1 つ以上のネットワーク カードがある場合、各ネットワーク カードには一意の MAC アドレスが必要であり、それを持っています。 

MAC アドレスの長さは 48 ビット (6 バイト) で、通常は 12 の 16 進数で表されます。例: 00-16-EA-AE-3C-40 は MAC アドレスで、最初の 3 バイト、16 進数の 00-16-EA は、IEEE によって割り当てられたネットワーク ハードウェアの製造元の番号を表します。最後の 3 バイト バイト。16 進数の AE-3C-40 は、メーカーが製造した特定のネットワーク製品のシリアル番号を表します。MAC アドレスを変更しない限り、MAC アドレスは世界で唯一のものです。視覚的に言えば、MAC アドレスは ID カード番号と同じように一意です。

IPアドレス

IP プロトコルは、コンピュータ ネットワークが相互に通信するために設計されたプロトコルです。インターネットでは、ネットワークに接続できるすべてのコンピュータ ネットワークが相互に通信するための一連の規則であり、インターネット上で通信するときにコンピュータが従うべき規則を指定します。

IP プロトコルは、実際にはソフトウェア プログラムで構成されるプロトコル ソフトウェアのセットです. さまざまな「フレーム」を「IP データグラム」形式に変換します. この変換は、インターネットの最も重要な機能の 1 つです。インターネット。インターネットが世界最大のオープンなコンピュータ通信ネットワークに急速に発展できるのは、まさに IP プロトコルのおかげです。したがって、IPプロトコルは「インターネットプロトコル」とも呼ばれます。

IP アドレスは、インターネット プロトコル アドレス (インターネット プロトコル アドレスとも呼ばれます) を指します。IPアドレスは、IPプロトコルが提供する統一アドレス形式で、インターネット上の各ネットワークや各ホストに論理アドレスを割り当て、物理アドレスの違いを隠蔽します

IP アドレスは 32 ビットの 2 進数で、通常は 4 つの 8 ビットの 2 進数に分割されます。通常、IP アドレスは「ドット付き 10 進数」で表されます。

IP アドレス指定方法

        アドレス指定を容易にし、ネットワークを階層的に構築するために、各 IP アドレスには、ネットワーク ID とホスト ID の 2 つの識別コード (ID) が含まれています。同じ物理ネットワーク上のすべてのホストは同じネットワーク ID を使用し、ネットワーク上のホスト (サーバー、ルーターなどを含む) には対応するホスト ID があります。

        クラス A IP アドレス

        クラス A IP アドレスとは、IP アドレスの 4 つのセグメントのうち、最初のセグメントがネットワーク番号で、残りの 3 つのセグメントがローカル コンピュータの番号であることを意味します。IP アドレスを 2 進数で表すと、クラス A の IP アドレスは 1 バイトのネットワーク アドレスと 3 バイトのホスト アドレスで構成され、ネットワーク アドレスの最上位ビットは「0」でなければなりません。クラスA IPアドレスでは、ネットワーク識別長は8ビット、ホスト識別長は24ビットです.クラスAネットワークアドレスの数は比較的少なく、126のネットワークがあり、各ネットワークは1600万を超えるホストに対応できます. クラス A IP アドレス アドレス範囲 1.0.0.1 ~ 126.255.255.254 (バイナリ表現: 00000001 00000000 00000000 00000001 ~ 01111111 11111111 11111111 11111110)。最後はブロードキャストアドレスです。クラス A IP アドレスのサブネット マスクは 255.0.0.0 で、各ネットワークでサポートされるホストの最大数は、256 の 3 - 2 = 16777214 ホストです。

        クラス B IP アドレス

         クラス B IP アドレスとは、IP アドレスの 4 つのセグメントのうち、最初の 2 つのセグメントがネットワーク番号であることを意味します。IP アドレスを 2 進数で表すと、クラス B の IP アドレスは 2 バイトのネットワーク アドレスと 2 バイトのホスト アドレスで構成され、ネットワーク アドレスの最上位ビットは「10」でなければなりません。クラス B IP アドレスのネットワーク識別の長さは 16 ビットで、ホスト識別の長さは 16 ビットです. クラス B ネットワーク アドレスは中規模のネットワークに適しています. 16384 のネットワークがあり、各ネットワークは 60,000 台以上のコンピュータを収容できます.タワー。クラス B IP アドレス アドレス範囲 128.0.0.1 ~ 191.255.255.254 (バイナリ表現: 10000000 00000000 00000000 00000001 ~ 10111111 11111111 11111111 11111110)。最後はブロードキャストアドレスです。クラス B の IP アドレスのサブネット マスクは 255.255.0.0 で、各ネットワークでサポートされるホストの最大数は、256 の 2 - 2 = 65534 ホストの累乗です。

        クラス C IP アドレス

        クラス C IP アドレスとは、IP アドレスの 4 つのセグメントのうち、最初の 3 つのセグメントがネットワーク番号で、残りのセグメントがローカル コンピュータの番号であることを意味します。IP アドレスを 2 進数で表すと、クラス C の IP アドレスは 3 バイトのネットワーク アドレスと 1 バイトのホスト アドレスで構成され、ネットワーク アドレスの最上位ビットは「110」でなければなりません。クラス C IP アドレスでは、ネットワーク識別長は 24 ビット、ホスト識別長は 8 ビットで、クラス C ネットワーク アドレスには 209 万以上のネットワークがあります。小規模なローカル エリア ネットワークに適しており、各ネットワークには最大 254 台のコンピューターのみを含めることができます。クラス C の IP アドレス範囲 192.0.0.1 ~ 223.255.255.254 (バイナリ表現: 11000000 00000000 00000000 00000001 ~ 11011111 11111111 11111111 11111110)。クラス C IP アドレスのサブネット マスクは 255.255.255.0 で、各ネットワークでサポートされるホストの最大数は 256 - 2 = 254 です。

        クラス D IP アドレス

        クラス D の IP アドレスは、歴史的にマルチキャスト アドレス、つまりマルチキャスト アドレスと呼ばれていましたイーサネットでは、マルチキャスト アドレスは、パケットを受信する必要があるネットワーク上のステーションのグループに名前を付けます。マルチキャスト アドレスの最上位桁は「1110」である必要があり、範囲は 224.0.0.0 から 239.255.255.255 です

         特別な URL

        すべてのバイトが 0 (「0.0.0.0」) のアドレスは現在のホストに対応し、IP アドレスのすべてのバイトが 1 の IP アドレス (「255.255.255.255」) は現在のサブネットのブロードキャスト アドレスです。すべての IP IP アドレスの「11110」で始まるクラス E のアドレスは、将来の実験的な使用のために予約されています。The IP address cannot start with the decimal "127". このタイプのアドレスの 127.0.0.1 から 127.255.255.255 までの数字は、次のようにループ テストに使用されます。127.0.0.1 はローカル IP アドレスを表すことができます。

サブネットマスク 

        サブネット マスク (サブネット マスク) は、ネットワーク マスク、アドレス マスク、およびサブネット マスクとも呼ばれます. IP アドレスのどのビットがホストが配置されているサブネットを識別し、どのビットがそれを識別するかを示すために使用される方法です. のビットマスクです。ザ・ホスト。サブネット マスクは単独では存在できず、IP アドレスと組み合わせて使用​​する必要があります。サブネット マスクには、IP アドレスをネットワーク アドレスとホスト アドレスの 2 つの部分に分割する機能が 1 つしかありません。サブネット マスクは、IP アドレスの一部をマスクしてネットワーク ID をホスト ID と区別し、IP アドレスがローカル エリア ネットワーク上にあるかワイド エリア ネットワーク上にあるかを示すために使用される 32 ビット アドレスです

         サブネットマスクとは、IPv4アドレスのリソース不足を背景としたIPアドレスの割り当て問題を解決するために生まれた仮想IP技術で、サブネットマスクにより、A、B、Cの3種類のアドレスを複数のサブネットに分割することで、IPアドレスの割り当てを大幅に改善します。アドレス割り当ての効率化により、IP アドレス リソースの不足を効果的に解決します。一方、企業イントラネット内のネットワークをより適切に管理するために、ネットワーク管理者はサブネット マスクの役割も使用して、大規模な企業イントラネットをより小規模なサブネットに人為的に分割し、3 つのルーティング機能を使用します。レイヤ スイッチはサブネットの相互接続を実現し、ネットワーク ブロードキャスト ストームやネットワーク ウイルスなどの多くのネットワーク管理の問題を効果的に解決します。

ポート

ポートは各プロセスにバインドされているか、サーバーはこのポートを介してクライアントが接続されているかどうかを監視します。

ポート分類:

1.ウェルノウンポート

        ウェルノウン ポートは、0 ~ 1023 の範囲の多くのウェルノウン ポート番号 (ウェルノウン ポート、ウェルノウン ポート、または共通ポートとも呼ばれます) であり、いくつかの特定のサービスに密接にバインドされています。[ポート 80 は WWW サービスに割り当てられ、ポート 21 は FTP サービスに割り当てられ、ポート 23 は Telnet などに割り当てられます。]

        ネットワークサービスは他のポート番号を使用することができます. デフォルトのポート番号でない場合, アドレスバーにポート番号を指定する必要があります. 方法は, アドレスバーに「URL: ポート番号」と入力することです. ただし、一部のシステム プロトコルは、変更できない固定ポート番号を使用します。たとえば、ポート 139 は、NetBIOS と TCP/IP 間の通信に特別に使用され、手動で変更することはできません

2. ポート登録

        ポート番号の範囲は1024 から 49151 で、一部のサービスに緩やかにバインドされ、ユーザー プロセスまたはアプリケーションに割り当てられます。これらのプロセスは、主にユーザーがインストールすることを選択したアプリケーションです。これらのポートがサーバー リソースによって占有されていない場合、クライアントはビット ソース ポートを動的に選択できます。弊社間でプログラムを作成する際に使用できるポート

3. 動的ポート/プライベート ポート

        動的ポートの範囲は 49152 ~ 65535 です。通常、特定のサービスを固定的に割り当てるのではなく、動的に割り当てるため、動的ポートと呼ばれます。

ネットワーク モデル

OSI 7層モデル

        OSI (Open System Interconnection) 参照モデルとも呼ばれる 7 層モデルは、オープン システム相互接続です。参照モデルは、コンピュータまたは通信システム間の相互接続のために国際標準化機構 (ISO) によって開発された標準システムであり、一般に OSI 参照モデルまたは 7 層モデルとして知られています。これは、一連の抽象的な用語や概念だけでなく、特定のプロトコルも含む、7 層の抽象モデル本体です。

アプリケーション層 アプリケーションの提供
プレゼンテーション層 データ形式変換、データ暗号化
セッション層 セッションの確立、管理、維持
トランスポート層 エンドツーエンドの接続を確立、管理、維持する
ネットワーク層 IP アドレッシングとルーティング
データリンク層 メディア アクセスとリンク管理を提供
物理層 物理デバイスの規格
        アプリケーション層 : Web サービスとエンド ユーザー間のインターフェイス。この層は、電子メール、ファイル転送、ターミナル エミュレーションなどの ネットワーク サービスをユーザー アプリケーションに提供します

        プレゼンテーション層: データのプレゼンテーション、セキュリティ、および圧縮。主に、受信したデータの解釈、暗号化と復号化、圧縮と解凍などを行います。送信された情報は、別のシステムのアプリケーション層で読み取ることができます。

        セッション層:トランスポート層(ポート番号: 送信ポートと受信ポート)を介してデータ伝送パスを確立します主に、システム間でセッションを開始するか、セッション要求を受け入れます。

        トランスポート層: データを送信するためのいくつかのプロトコルとポート番号を定義します。主に、下位層から受信したデータを分割して送信し、宛先アドレスに到達した後に再組み立てすることですこのデータ層は、多くの場合、セグメントと呼ばれます。

        ネットワーク層: 論理アドレス指定を実行し、地理的に異なる場所にあるネットワーク内の 2 つのホスト システム間の接続とパス選択を提供しますインターネットの発達により、世界中のさまざまなサイトから情報にアクセスするユーザーの数が大幅に増加しましたが、この接続を管理する層がネットワーク層です。

        データ リンク層:論理接続を確立し、ハードウェア アドレスのアドレス指定、エラー チェック、およびその他の機能を実行します。フォーマットされたデータをフレームで送信する方法と、物理メディアへのアクセスを制御する方法を定義しますビットをバイトに結合してからフレームに結合し、MAC アドレスを使用してメディアにアクセスします。

        物理層主に、ネットワークケーブルのインターフェースタイプ、光ファイバーのインターフェースタイプ、さまざまな伝送メディアの伝送速度など、物理機器の標準を定義します。その主な機能は、ビット ストリームを送信することです (つまり、1, 0 は送信のために現在の強度に変換され、宛先に到達した後に 1, 0 に変換されます。これは、デジタルからアナログへの変換およびアナログ変換と呼ばれることがよくあります)。デジタル変換)。この層のデータはビットと呼ばれます。

TCP/IP 4 層モデル

        インターネットで使用される主流のプロトコル ファミリは、階層化されたマルチプロトコル通信システムである TCP/IP プロトコル ファミリです。TCP/IP プロトコル ファミリは、データ リンク層、ネットワーク層、トランスポート層、およびアプリケーション層で構成される4 層のプロトコル システムです各層はさまざまな機能を実行し、いくつかのプロトコルを介して完了します。上位層のプロトコルは、下位層のプロトコルによって提供されるサービスを使用します。     

 アプリケーション層: アプリケーション層は TCP/IP プロトコルの最初の層であり、アプリケーション プロセスにサービスを直接提供します。

                (1) さまざまなタイプのアプリケーションに対して、彼らは自分のニーズに応じてアプリケーション層のさまざまなプロトコルを使用します。

                     (メール転送プロトコル: SMTP World Wide Web アプリケーション: HTTP リモートログインサービス: TELNET)

                (2) データの暗号化・復号化・整形(コンピュータが理解できるものを人間が理解できるものにする)

                (3) 他のノードとの接続を確立または解放することで、ネットワーク リソースを完全に節約できます。

トランスポート層: データを送信するためのいくつかのプロトコルとポート番号を定義します。主に、下位層から受信したデータを分割して送信し、宛先アドレスに到達した後に再組み立てすることですこのデータ層は、多くの場合、セグメントと呼ばれます。

ネットワーク層: ネットワーク接続の確立と終了、IP アドレスの検索などの機能を実行できます。

ネットワークインターフェース層: 物理層とデータリンク層の合併により、ネットワークインターフェース層はデータを送信するための物理媒体であるだけでなく、ネットワーク層に正確なルートを提供します。

通信プロセス

TCP/IP プロトコルを介して通信する 2 台のコンピューターのプロセス:

 上の図は、2 台のコンピューターが異なるネットワーク セグメントにある場合、2 台のコンピューターが同じネットワーク セグメントにある状況を示しています。その後、データは、あるコンピューターから別のコンピューターに移動するときに、1 つ以上のルーターを通過します。

         リンク層にはEthernetやトークンリングネットワークなどの規格があり、リンク層ではネットワークカードデバイスのドライバ、フレーム同期(つまり、ネットワーク回線から検出された信号を新しいフレームの先頭としてカウントする)などを担当しています。 )、競合検出(競合が検出された場合、自動再送信)、データ エラー チェックなど。スイッチは、リンク層で動作し、異なるリンク層ネットワーク間でデータ フレームを転送できるネットワーク デバイスです. 異なるリンク層のフレーム形式は異なるため、スイッチは着信データ パケットのリンク層ヘッダーを削除して再パッケージ化する必要があります.後でリツイートします。

        ネットワーク層の IP プロトコルは、インターネットの基盤です。インターネット上のホストは、IP アドレスによって識別されます. インターネット上には、IP アドレスに基づいてデータ パケットを転送するための適切なパスを選択する役割を担う多数のルーターがあります. データ パケットは、多くの場合、送信元から 10 を超えるルーターを通過する必要がありますホストをインターネット上の宛先ホストに接続します。ルーターは、第 3 層で動作するネットワーク デバイスであり、異なるリンク層インターフェイス間でデータ パケットを転送できるスイッチの機能も備えています. したがって、ルーターは、ネットワーク層とネットワーク層の両方から着信データ パケットを削除する必要があります。データリンク層. 層ヘッダーと再パッケージ. IP プロトコルは送信の可能性を保証するものではなく、送信中にデータ パケットが失われる可能性があり、信頼性は上位層のプロトコルまたはアプリケーションでサポートされます。

        ネットワーク層はポイントツーポイント伝送 (ホストまたはルーター) を担当し、トランスポート層はエンドツーエンド伝送 (送信元ホストと宛先ホスト) を担当します。トランスポート層は、TCP または UDP プロトコルを選択できます。

        TCP は接続指向で信頼性の高いプロトコルです. 電話をかけるのと少し似ています. 両者が電話を取り、ID を交換すると、接続が確立され、通話が可能になります. ここで話すと、はい、話した後、電話を切って切断します。つまり、TCP 伝送の両側が最初に接続を確立する必要があり、次に TCP プロトコルがデータ送受信の信頼性を保証します. 失われたデータグラムは自動的に再送信されます. 上位層のアプリケーションは常に信頼できるデータ ストリームを受信し、通信後、接続は閉じられます。

        UDP は信頼性を保証しないコネクションレス伝送プロトコルです. 手紙を送るのと少し似ています. 手紙を書いてメールボックスに入れた後, 郵送プロセス中に手紙が失われないことを保証することはできません.手紙を送る順序を保証する。UDP プロトコルを使用するアプリケーションでは、ホストが失われたパケットの再送信、メッセージの配置、およびその他のタスクを完了する必要があります。

        宛先ホストがデータ パケットを受信した後、プロトコル スタックの各層を通過し、最終的にアプリケーション プログラムに到達するとどうなるでしょうか。

イーサネット ドライバは、最初にイーサネット ヘッダーの「上位層プロトコル」フィールドに基づいて、データのペイロード (プロトコル ヘッダーによって送信されたデータを削除) が IP、ARP、および RARP プロトコルのデータグラムであると判断し、ハンドリングします。対応するプロトコルに渡して処理します。IP データグラムの場合、IP プロトコルは、ヘッダーの「上位層プロトコル」フィールドに従って、データグラムのペイロードが TCP、UDP、ICMP、IGMP のいずれであるかを判断し、対応するプロトコルに渡して処理します。TCP または UDP セグメントの場合、TCP または UDP は、TCP ヘッダーまたは UDP ヘッダーの「ポート番号」フィールドに従って、どのユーザー プロセスがアプリケーション層データを引き渡す必要があるかを決定します。【分割】

        IP アドレスは、ネットワーク内のさまざまなホストを識別するアドレスであり、ポート番号は、同じホスト上で識別されるさまざまなプロセスのアドレスです。IP アドレスとポート番号は、ネットワーク上で一意のプロセスを識別します。

        IP、ARP、および RARP データグラムはすべて、それらをフレームにカプセル化するためにイーサネット ドライバーを必要としますが、機能的には、ARP と RARP はリンク層に属し、IP はネットワーク層に属します。TCP、UDP、ICMP、IGMP のデータはいずれもデータグラムをカプセル化するために IP プロトコルを必要としますが、機能的には ICMP と IGMP は IP としてネットワーク層に属し、TCP と UDP はトランスポート層に属します。

パケットのカプセル化

        プロトコル層が異なれば、データ パケットの名前も異なります。トランスポート層ではセグメント、ネットワーク層ではデータグラム、リンク層ではフレームと呼ばれますデータはフレームにカプセル化された後、伝送媒体に送信され、宛先ホストに到達した後、各レイヤー プロトコルが対応するヘッダーを取り除き、最後にアプリケーション レイヤー データがプログラム アプリケーションに渡されます。 

プロトコル 

 プロトコルと呼ばれるネットワーク プロトコルは、通信する両方のコンピューターが従わなければならない一連の契約です。接続を確立する方法、お互いを識別する方法などを含みます。この契約が守られている限り、コンピュータは相互に通信できます。

3 つの要素: 構文、セマンティクス、タイミング

データがネットワーク上の送信元から宛先に到達するためには、ネットワーク通信の参加者が同じ規則に従う必要があります. この一連の規則はプロトコルと呼ばれ、ネットワーク上で送信されるデータ パケットの形式を最終的に反映します. .

多くの場合、プロトコルは複数の層で定義されます。層の定義は、ある層でのプロトコルの変更が他の層のプロトコルに影響を与えないようにすることです。

一般的なプロトコル:

アプリケーション層: FTP (ファイル転送プロトコル)、HTTP (ハイパーテキスト転送プロトコル)、NFS (ネットワーク ファイル システム)

トランスポート層: TCP (伝送制御プロトコル)、UDP (ユーザー データグラム プロトコル)

ネットワーク層:IP(Internet Interconnection Protocol)、ICMP(Internet Control Protocol)、IGMP(Internet Group Management Protocol)
ネットワークインターフェース層:ARP(Address Resolution Protocol)、RARP(Reverse Address Resolution Protocol)

イーサネット フレーム フォーマット

 

ここで、宛先アドレスと送信元アドレスはネットワーク カードのハードウェア アドレス (MAC アドレス) を指し、長さは 48 ビットで、工場出荷時に固定化されています。ifconfig コマンドで表示できます。プロトコル フィールドには、IP、ARP、および RARP に対応する 3 つの値があります。フレームの最後はCRCチェックコードです。

イーサネット フレームのデータ長は、最小 46 バイト、最大 1500 バイトと規定されていますが、ARP および RARP データ パケットの長さが 46 バイトでは足りないため、後で補足します。1500 の最大値は、イーサネットの最大伝送単位 (MTU) と呼ばれます. ネットワークの種類が異なれば、MTU も異なります. データ パケットがイーサネット ルーターからダイヤルアップ リンクに送信され、データ パケットの長さが次の値を超える場合ダイヤルアップ リンクの MTU は、パケットがフラグメント化されている必要があります。[ifcong で確認できます] MTU の概念は、フレーム ヘッダー長を除いた、データ フレーム ペイロードの最大長を指します。 

補足: TTL は、1 ホップあたり 1 ユニット (ルーターが TTL-1 を通過するたびに) 最長のライフ サイクルを意味します。

質問: イーサネット フレーム プロトコルのペイロードを増やさないのはなぜですか (超大型化)?

           送信されたデータが受信側で受信されない場合は、再送信する必要があるためです。明らかに、1500 を再送信する方が 60000 よりも便利 (高速) です。

ARP データグラム形式

        ネットワーク通信中、送信元ホストのアプリケーション プログラムは宛先ホストの IP アドレスとポート番号を知っていますが (事前に通知され、プログラムに含まれています)、宛先ホストのハードウェア アドレスはわかりません。上位層プロトコルを処理する前に、ネットワーク カードによって最初に受信されます。受信したデータ パケットのハードウェア アドレスがローカル マシンと一致しない場合は、直接破棄されます。したがって、通信前に宛先ホストのハードウェアアドレスを取得する必要があります。ARP プロトコルがこの役割を果たします。

各ホストのカーネルには ARP キャッシュ テーブルが保持されます. 送信元ホストは、まずホストの ARP テーブルで宛先ホストのハードウェア アドレスを検索し、見つかった場合は、対応する宛先ホストにデータ パケットを送信します. そうでない場合、送信元ホストは ARP 要求をローカル ネットワーク セグメントにブロードキャストします (イーサネット フレーム ヘッダーのハードウェア アドレスは、ブロードキャストを示すために FF:FF:FF:FF:FF:FF で埋められます)。宛先ホストがブロードキャスト ARP 要求を受信し、IP アドレスがホストの IP アドレスと一致することを検出すると、ARP 応答パケットを送信元ホストに送信し、独自の ARP キャッシュ テーブルを更新し、応答パケットに独自のハードウェア アドレスを入力します。 .

        各ホストは、arp -a コマンドで表示できる ARP キャッシュ テーブルを維持します。キャッシュ テーブルのエントリの有効期限は通常 20 分です。

ハードウェアの種類: 1 は MAC アドレスを意味します

プロトコルの種類: 0x800 は IP アドレスを意味します 

ハードウェア アドレス長: 6 (6*8 = 48)

プロトコル アドレスの長さ: 4 (4*8 = 32)

操作: 1 は ARP 要求、2 は ARP 応答、3 は RARP 要求、4 は RARP 応答を意味します。   

同報時:送信先Ethernetアドレス FF:FF:FF:FF:FF:FF

IP データグラム形式

IP データグラムのヘッダー長とデータ長は可変ですが、常に 4 バイトの整数倍です。IPV4 の場合、4 桁のバージョン フィールドは 4 です。4 桁のヘッダー長の値は 4 バイト単位で、最小値は 5、つまりヘッダー長の最小値は 4* です。 5=20、つまりオプションの IP ヘッダーでは、4 ビットで表現できる最大値は 15、つまりヘッダーの最大長は 60 バイトです8 ビットの TOS フィールドには、IP データグラムの優先順位を指定するために使用される 3 ビット (現在は廃止) と、オプションのサービス タイプ (最小遅延、最大スループット、最大信頼性、最小コスト) を示す 4 ビットがあり、1 ビットは常に 0 です。

全長は、データグラム全体 (ヘッダーとデータを含む) のバイト数です。

IP データグラムが送信されるたびに、16 ビットの識別子が 1 ずつ増加し、データグラムの断片化と再構成に使用できます。

シャーディングには、3 ビットのフラグと 13 ビットのオフセットが使用されます。

TTL: データグラムの送信元ホストによって設定された存続時間. ルーターを通過するたびに 1 ずつ減少します. 0 に減少した場合, ルートが長すぎてネットワークが切断されていることを意味します.宛先ホストが見つからず、パケットは破棄されます. 時間はホップです. プロトコル フィールドは、上位層のプロトコルが TCP、UDP、ICMP、IGMP であることを示します。次に、IPヘッダーのみをチェックするチェックサムがあり、データチェックは上位層のプロトコルを担当します。

UDP プロトコル形式

送信元ポート番号: 送信元ポート番号

宛先ポート番号: 受信側ポート番号

長さ: UDP ユーザー データグラムの長さ。最小値は 8 (ヘッダーのみ)

チェックサム:UDPユーザーデータグラムの送信に誤りがないかを検出し、誤りがあれば破棄する

 TCP プロトコル形式

 1.送信元ポート番号:送信元ポート番号

2.宛先ポート番号:受信ポート番号

3. シリアル番号: このセグメントのデータの最初のバイトのシリアル番号

4. 確認シーケンス番号: 相手の次のセグメントの最初のデータ バイトのシーケンス番号を受信することを期待する

5. ヘッダー長 (データ オフセット): TCP メッセージ セグメントの先頭から TCP メッセージ セグメントのデータ先頭までの距離、つまりヘッダー長。単位: 32 ビット

6. 予約済み: 将来の使用のために予約されている 6 桁。現在は 0 に設定する必要があります。

7. 緊急 URG: このビットは 1 で、緊急ポインター フィールドが有効であることを示し、このセグメントに緊急データがあり、できるだけ早く送信する必要があることをシステムに伝えます。

8. 確認 ACK: 確認番号フィールドは、ACK=1 の場合にのみ有効です.TCP では、接続が確立された後、すべての送信メッセージは ACK を 1 に設定する必要があると規定されています

9. PSH のプッシュ: 2 つのアプリケーション プロセスが対話的に通信する場合、一方の側のアプリケーション プロセスが、コマンドを入力した直後に他方からの応答を受信することを望む場合があります。この場合、TCP はプッシュ操作を使用できます. 送信側の TCP は PSH を 1 に設定し、すぐに送信するセグメントを作成します. 受信側は PSH=1 のセグメントを受信し、できるだけ早く受信側のアプリケーション プロセスに渡します. 、上方に配信する前にバッファ全体がいっぱいになるまで待つのではなく

10. PST のリセット: 対応する TCP 接続をリセットするために使用されます。

11. 同期 SYN: スリーウェイ ハンドシェイクが TCP 接続を確立する場合にのみ有効です。SYN=1、ACK=0 の場合は、接続要求メッセージセグメントであることを示し、相手方が接続の確立に同意する場合、対応するメッセージセグメントでは SYN=1、ACK=1 を使用する必要があります。SYN は、これが接続要求または接続受け入れメッセージであることを示すために 1 に設定されます。

カプセル化 

アプリケーション データが物理ネットワークに送信される前に、プロトコル スタックに沿って上から下に渡されます. プロトコルの各層は、独自のヘッダー情報 (イーサネット フレームの末尾の CRC を含む) を追加します.上位層のデータ. この層の機能を実現するために、このプロセスはカプセル化と呼ばれます 

共有

フレームが宛先ホストに到着すると、プロトコル スタックに沿って下から上に渡されます。各層のプロトコルは、必要な情報を取得するためにフレーム内のヘッダー データを処理し、最終的に処理されたフレームをターゲット アプリケーションに配信します。このプロセスは分割と呼ばれます。共有は、ヘッダー情報のタイプ フィールドに依存することによって実現されます。

TCPの詳しい説明

TCP と UDP

        TCP と UDP はどちらもトランスポート層プロトコルです。

        UDP: ユーザー データグラム プロトコル、コネクションレス指向、ユニキャスト、マルチキャスト、ブロードキャスト、データグラム指向、信頼性の低い配信

        TCP: Transmission Control Protocol、接続指向、高信頼性、バイト ストリームに基づく、ユニキャスト伝送のみをサポート

UDP TCP
接続を作成するかどうか 接続なし 接続指向
信頼できるか 信頼性の低い配信 (パケット損失は再送信されません) 信頼性の高い配信 (パケット損失と再送信)
接続オブジェクトの数 1対1、1対多、多対多 1対1
振込方法 データグラム指向 ストリーム指向
頭上 8バイト 最小 20 バイト
適用シーン リアルタイム アプリケーション (ビデオ会議、ライブ ブロードキャスト) 信頼性の高いアプリケーション(ファイル転送)

TCP 通信プロセス

サービス端末:

1.リッスン用のソケットを作成する

        - リスニング: クライアントとの接続をリッスンする

        -ソケット: このソケットは実際にはファイル記述子です

2.リスニングファイル記述子をローカルIPとポートにバインドします(IPとポートはサーバーのアドレス情報です)

        -クライアントは、サーバーに接続するときにこの IP とポートを使用します

3. モニタリングを設定すると、モニタリング fd が機能し始めます

4. ブロッキングを設定し、クライアントが接続を開始したときにブロックを解除します。クライアントからの接続を受け入れ、クライアントと通信するためのソケット (fd) を取得します

5.通信

        - データを受け入れる

        -データを送る

6. 通信が終了し、接続が切断されます

クライアント:

1.通信用のソケット(fd)を作成する

2.サーバーに接続するには、接続されたサーバーのIPとポートを指定する必要があります

3. 接続が成功し、クライアントはサーバーと直接通信できます

        - データを受信

        - データを送る

4. 通信が終了し、接続が切断されます

TCP スリーウェイ ハンドシェイク

TCP は接続指向のユニキャスト プロトコルで、データを送信する前に、通信する両方の当事者が相互に接続を確立する必要があります。いわゆる「接続」は、実際には、クライアントとサーバーのメモリに保持される互いに関する情報 (IP アドレス、ポート番号) です。

TCP はバイト ストリームと見なすことができ、IP レイヤー以下でパケットの損失、重複、およびエラーを処理します。接続の確立中に、両者はいくつかの接続パラメーターを交換する必要があります。これらのパラメーターは、TCP ヘッダーに配置できます。

TCP は、接続を確立するために 3 つのハンドシェイクを使用し、接続を閉じるために 4 つのハンドシェイクを使用して、信頼性の高い接続指向のバイト ストリームおよびトランスポート層サービスを提供します。

 スリーウェイ ハンドシェイクのプロセス:

        1.クライアントは SYN フラグを含む TCP メッセージをサーバーに送信しますこのスリーウェイ ハンドシェイクのセグメント 1

          クライアントはセグメント 1 を送信し、SYN ビットは接続要求を示します。シリアル番号は 0 です. このシリアル番号は通信の一時アドレスとして使用されます. 秘書バイトが送信されるたびに, シリアル番号を 1 ずつ増やして, 受信側でデータ パケットの正しいシーケンスを配置できるようにする必要があります.シリアル番号によると、パケットロスもわかります。また、SYN ビットと FIN ビットもシリアル番号を占有することが規定されており、今回はデータは送信されませんが、SYN ビットは送信されるため、次回の送信ではシリアル番号 1001 を使用する必要があります。mms は最大セグメント サイズを示します. セグメントが大きすぎて, フレームへのカプセル化がリンク層の最大フレーム長を超える場合, IP 層でフラグメント化する必要があります. この状況を回避するために, クライアントはその独自の最大セグメント サイズ サーバーから送信されるセグメントは、この長さを超えないようにすることをお勧めします。

        2.サーバーは、ACK および SYN フラグを含む応答メッセージで応答しますこれは、クライアント SYN への応答を表し、同時に SYN をクライアントに送信して、クライアントがデータ通信の準備ができているかどうかを尋ねます。これは、スリーウェイ ハンドシェイクの 2 番目のセグメントです。

        サーバーはセグメント 2 も SYN ビットとともに送信し、確認を示すために同時に ACK ビットを設定します。確認シーケンス番号は 1 です。つまり、「シーケンス番号 0 以前のすべてのセグメントを受信しました。送信してください。次回はシーケンス番号 1 のセグメント」、また、クライアントの接続要求に応答することであり、同時にクライアントに接続要求を送信し、同時に最大サイズが 1024 であることを宣言します。

        3.クライアントはサーバーに ACK メッセージで再度応答する必要があります。このセグメント 2

        クライアントは、サーバーの接続要求に応答するためにセグメント 3 を送信します。確認シーケンス番号は 8001 です。このプロセスでは、クライアントとサーバーがそれぞれ接続要求を相互に送信し、相互の接続要求に応答しました。接続を確立している間、両者はいくつかの情報をネゴシエートします。たとえば、双方が送信するシリアル番号の初期値、最大セグメント サイズ

なぜ 3 ウェイ ハンドシェイクなのですか?

3 ウェイ ハンドシェイクによってのみ、クライアントの送信データとデータ データの機能が正常であると判断できます。サーバー側の受信データと送信データは正常です。双方向ハンドシェイクは明らかに証明できません. たとえば, クライアントが SYN 接続要求を送信し, サーバーが ACK メッセージで応答してそれを送信します. その後, クライアントがデータを正常に送信し, 受信する能力があることのみを証明できます.データを特定できません。4 ウェイ ハンドシェイクも実現できますが、3 ウェイ ハンドシェイクが可能で、もう 1 時間費やす必要はありません。また、スリーウェイ ハンドシェイク中に、両者が送信したシリアル番号の初期値や最大セグメント サイズなど、いくつかの情報をネゴシエートしました。

TCP スライディング ウィンドウ (TCP フロー制御)

スライディング ウィンドウは、フロー制御手法です。初期のネットワーク通信では、通信当事者はネットワークの輻輳を考慮せず、データを直接送信します。誰もがネットワークの輻輳を認識せず、同時にデータを送信するため、中間ノードがブロックされてパケットが失われ、誰もデータを送信できないため、この問題を解決するためのスライディング ウィンドウ メカニズムがあります。スライディング ウィンドウ プロトコルは、送信者が確認応答を受信する前に追加のパケットを送信できるようにすることで、スループットを向上させるために使用される手法です。受信者は、特定の瞬間に送信できるパケット数 (ウィンドウ サイズ) を送信者に伝えます

別のケースでは、送信側がより速い速度で送信し、受信側がより遅い処理速度でデータを受信し、受信バッファーのサイズが固定されている場合 (通常は循環キューを使用)、データは失われます。TCP プロトコルは、「スライディング ウィンドウ」メカニズムによってこの問題を解決します。

上記の通信プロセスを見てください。

     1. 送信者 (クライアント) が接続を開始し、最大サイズが 1460 であることを宣言します。初期シーケンス番号は 0 で、ウィンドウ サイズは 4K です。これは、「受信バッファーにはまだ 4K バイトの空き容量があり、送信するデータは 4K を超えてはならない」ことを意味します。受信側は、最大セグメント サイズが 1024、初期シーケンス番号が 8000、ウィンドウ サイズが 6K であることを示す接続要求に応答します。送信者が応答し、スリーウェイ ハンドシェイクが終了します。

     2. 送信側はセグメント 4 ~ 9 を送信します。各セグメントには 1K のデータが含まれており、送信側はウィンドウ サイズに応じて受信側のバッファーがいっぱいであることを認識しているため、データの送信を停止します。(6*1024=6K)

     3. 受信側のアプリケーション プログラムが 2K データを処理し、受信バッファに 2K の空きがあり、セグメント 10 を送受信し、6K データを受信したことを応答し、ウィンドウ サイズが 2K であることを宣言し、シーケンス番号を含む次の送信の

     4. 受信側のアプリケーション プログラムは 2K データを処理し、受信バッファには 4K の空きがあり、送受信セグメントは 11 です。ウィンドウ サイズを 4K に再宣言します。

     5. 送信側はセグメント 12 ~ 13 を送信します。それぞれに 1K データが含まれており、セグメント 13 には FIN ビットも含まれています (FIN は切断を意味します)。

     6. 受信側は 2K データ (6145-8192) を受信したことを確認し、さらに FIN ビットがシリアル番号 8193 を占有しているため、次の送信がシリアル番号 8194 から開始されることを送信側に通知します。半分閉じた状態で、受信セグメントはウィンドウ サイズを 2K として宣言します。

     7. 受信側のアプリケーションが 2K データを処理し、受信側がウィンドウ サイズを 4K として再宣言した

     8. 受信側のアプリケーションは 2K データを処理し、受信側はウィンドウ サイズを 6K として再宣言しました。

     9. 受信側のアプリケーション プログラムがすべてのデータを処理した後、接続を閉じることを決定し、FIN ビットを含むセグメント 17 を送信し、送信側が応答し、接続が完全に閉じられます。

        アプリケーションがデータをフェッチすると、点線のボックスが右にスライドし続けるため、スライディング ウィンドウと呼ばれます。

現象を分析することもできます。

        アプリケーション プログラムから見たデータは、全体またはストリームです. 基礎となる通信では、これらのデータは送信されるデータ パケットに分割される場合がありますが、データ パケットのバイト数はアプリケーション プログラムからは見えないため、TCP プロトコルはバイトストリーム指向のプロトコルであるのに対し、UDP はメッセージ指向のプロトコルです.各 UDP セグメントはメッセージです.アプリケーションはメッセージ単位でデータを抽出する必要があり,一度にデータのバイトを抽出することはできません.これは非常に重要です. TCP とは異なります。

TCP 4 波

        

         TCP は半二重であるため、各方向を個別に閉じる必要があります。原則として、一方がデータ送信タスクを完了すると、FIN を送信してこの方向の接続を終了できます。FIN の受信は、この方向にデータ フローがないことを意味するだけであり、TCP 接続は FIN の受信後もデータを送信できます。シャットダウンを実行する最初のパーティはアクティブ シャットダウンを実行し、もう一方のパーティはパッシブ シャットダウンを実行します。(データの送信は、リクエスト応答の送信とは異なり、1 つは TCP ヘッダー (FIN、ACK、SYN) で定義され、もう 1 つはデータ部分に属します)

     

        1. クライアントは、接続を閉じる要求を示すために FIN ビットを送信します。

        2. サーバーは、接続を閉じるクライアントの要求に応答します。 

        3. サーバーがバッファ内のデータの処理を終了した後 (および対応する応答を作成した後)、クライアントに FIN を送信して、接続が閉じられたことを示します。 

        4. クライアントは、接続を閉じるサーバーの要求に応答します。

接続を確立するプロセスはスリーウェイ ハンドシェイクであり、接続を閉じるには通常 4 回のハンドシェイクが必要です。通常、サーバーの応答と接続の終了要求は 1 つのセグメントに結合されません。上の図, そして A は送信する必要があります データを送信した後, close() を呼び出して閉じます. B のバッファにはまだ処理されていないデータがあり、領域は A によって送信されたデータに応答する必要があります.そのため、B の書き込み終了を当分の間閉じることはできません)。この場合、クライアントが接続を閉じると、サーバーにデータを送信できなくなりますが、サーバーも接続を閉じるまで、サーバーはクライアントにデータを送信できます。

TCP 状態遷移

赤線:クライアント側 緑線(点線):サーバー側(2本同時解析)

CLOSED : ロゴは初期状態

LISTEN:この状態は、サーバー側の SOCKET がリッスン状態にあり、接続を受け入れることができることを示します。

SYN_SENT:この状態は STN_RCVD に対応します. クライアント SOCKET が接続を実行するとき, 最初に SYN メッセージを送信してから SYN_SENT 状態に入り、サーバーがスリーウェイ ハンドシェイクで 2 番目のメッセージを送信するのを待ちます. SYN_SENT 状態は、クライアントが SYN 要求を送信したことを示します

SYN_RCVD : この状態は SYN メッセージを受信したことを示します. 通常、この状態は、TCP 接続を確立する際のサーバー側の SOCKET のスリーウェイ ハンドシェイク セッション中の中間状態であり、非常に短いです。この状態で、クライアントから ACK メッセージを受信した後、ESTABLSED 状態に入ります (クライアントとサーバーの両方が ACK を受信した後に ESTABLSED 状態に入ります)。

ESTABLSHED:接続が確立されたことを示します

FIN_WAIT_1: ESTABLSED 状態のときに、積極的に接続を閉じたい相手が相手に FIN メッセージを送信することを示します. このとき、ソケットは FIN_WAIT_1 状態に入ります (通常は非常に迅速に)

FIN_WAIT_2: アクティブにクローズし、FIN を送信し、ACK を受信した後にこの状態に入るパーティ。半接続または半閉鎖状態と呼んでください。この状態のソケットはデータを受け入れることしかできず、送信することはできません

TIME_WAIT:積極的にクローズした側が相手のFINメッセージを受信して​​ACKメッセージを送信し、2MSL後にクローズ可能状態に戻る。なぜ 2MSL を設定するのですか? 最後に送信された ACK を相手が受信できることを確認してください。失われた場合は、ACK を再送信します

CLOSING:この状態は特殊で、比較的まれな状態です。通常、FIN メッセージを送信するときは、まず相手の ACK メッセージを受信して​​から、相手の FIN メッセージを受信するのが妥当です。ただし、CLOSING 状態は、FIN メッセージを送信した後、相手の ACK メッセージを受信せず、代わりに相手の FIN メッセージを受信したことを意味します。(両方の当事者が同時にクローズした場合、両方の当事者が同時に FIN を送信し、CLOSING 状態に入ります)

CLOSE_WAIT:この状態は、閉じるのを待っていることを意味します。相手が SOCKET を閉じて自身に FIN メッセージを送信すると、システムは相手に ACK メッセージで応答し、CLOSE_WAIT 状態に入ります。次に、相手に送信するデータがあるかどうかを確認し、ない場合は、SOCKET を閉じて相手に FIN メッセージを送信する、つまり接続を閉じることができます。したがって、CLOSE_WAIT 状態では、接続を閉じる必要があります。

LAST_ACK:この状態は受動的に閉じられており、一方が FIN メッセージを送信した後、最後に他方の ACK メッセージを待ちます。ACK メッセージを受信した後、CLOSED 使用可能状態に入ることができます。

追加させてください:ソケットは本質的に疑似ファイルです

半分閉じた

        アクティブに FIN 要求を送信してクローズする TCP コネクションの端が、相手から送信された ACK 応答を受信し、相手が FIN を送信していない場合、アクティブにクローズする側は FIN_WAIT_2 状態 (ハーフクローズ状態) になります。 、およびアクティブに閉じる端は、読み取りのみが可能ですが、書き込みはできません。

        

 close() を使用する: 半分閉じていると言われていますが、読み取りも書き込みもできません。この状態は実際には半分閉じた状態ではないため、shutdown() を使用します。

 

close を使用して接続を終了しますが、記述子の参照カウントを減らすだけで、接続を直接閉じるのではなく、記述子の参照カウントが 0 の場合にのみ接続を閉じます。shutdown は、記述子のアプリケーション数に関係なく、記述子を直接閉じます。読み取り専用または書き込み専用の、一方向の接続を中止することも選択できます。

 

        プログラム側から見れば、APIを使って半接続状態を制御できます(能動的に半閉状態を実現)

        #include <sys/socket.h>

        int shutdown(int sockfd,int how);

        socket: 閉じる必要があるソケットの記述子

        どうやって:   

                 SHUT_ED(0): sockfd の読み取り機能を閉じます。このオプションは sockfd の読み取りを許可しません。

                 ソケットはデータを受け入れなくなりました。現在ソケットの受信バッファにあるデータは黙って破棄されます。

                SHUT_WR(1): sockfd の書き込み機能を閉じます。このオプションは、socked による書き込みを許可しません。

                                        プロセスは、このソケットに書き込み操作を発行できません。

                SHUT_RDWR(2): sockfd の読み書き機能を閉じる

      複数のプロセスがソケットを共有している場合、close が呼び出されるたびに、カウントが 0 になるまで、つまり、使用中のすべてのプロセスが close を呼び出し、ソケットが解放されるまで、カウントが 1 ずつ減らされます。

        マルチプロセスでは、プロセスが shutdown(sockfd,SHUT_RDWR) を呼び出すと、他のプロセスは通信できなくなりますが、プロセスが close(sockfd) を呼び出すと、他のプロセスには影響しません。  

2MSL

TIME_WAIT 状態が存在する理由:

1. 4 ウェイ ハンドシェイク クロージング プロセスの信頼性を高める. 4 ウェイ ハンドシェイクの最後の ACK は、アクティブ クロージング パーティによって送信されます. ACK が失われると、パッシブ パーティは再び FIN を送信します. アクティブ クロージング パーティが2MSL TIME_WAIT 状態を維持できる場合、失われた ACK が再度送信される可能性が高くなります。

2. 失われた複製が後続の新しい通常のリンクの送信に損傷を与えるのを防ぎます。失われた重複は、実際のネットワークでは非常に一般的です. 多くの場合、ルーターに障害が発生し、パスが収束せず、パッケージがルーター A、B、および C の間を無限ループのようにジャンプします。(TCP オーバータイム再送信、TCP ストリーミング、到着するすべてのパケットの順序に一貫性がない、TCP は 2MSL TIME_WAIT 状態を介してシーケンス番号によってスプライスされ、失われたすべての重複が確実に消えるようにし、新しい接続のエラーを回避します)

なぜアクティブクロージング側のデザインなのか:

1. 最後の ACK を送信したのは、アクティブに閉じたパーティです。

2. 一方が TIME_WAIT 状態を維持している限り、インカネーション接続が 2MSL 内で再確立されることを回避でき、両方の当事者が必要ない

RFC 793 では MSL は 2 分と規定されており、実際のアプリケーションでは通常 30 秒です。

プログラミングの問題

テストを行うには、最初にサーバーを起動し、次にクライアントを起動し、Ctrl-C でサーバーを終了し、すぐにサーバーを再実行します。操作の結果は次のとおりです。

 これは、サーバーのアプリケーションプログラムが終了しても、TCPプロトコル層の接続が完全に切断されていないため、同じサーバーポートを再度監視できないためです。netstat コマンドで確認してみましょう。

 サーバーが終了すると、ソケット記述子は自動的に閉じられ、FIN セグメントがクライアントに送信されます. クライアントが FIN を受信した後、クライアントは CLOSE_WAIT 状態になりますが、クライアントは終了せず、ソケット記述子も閉じません。 FIN をサーバーに送信しないため、サーバーの TCP 接続は FIN_WAIT2 状態になります。

ここで Ctrl-C を使用してクライアントを終了し、現象を観察します。

 クライアントが終了すると、ソケット記述子は自動的に閉じられ、クライアントから送信された FIN セグメントを受信した後、サーバーの TCP 接続は TIME_WAIT 状態になります。TCP プロトコルでは、アクティブに接続を閉じる側がTIME_WAIT 状態でなければならず、CLOSED 状態に戻る前に 2 つの MSL (セグメントの最大有効期間) を待機する必要があることが規定されています。最初に Ctrl-C でサーバーを終了するため、サーバーはアクティブに接続を閉じたパーティは、TIME_WAIT の間、同じサーバー ポートを再度リッスンできません。

 

ポートの多重化

ポートの多重化の最も一般的な用途:

  • サーバーの再起動時に以前にバインドされたポートが解放されないようにする
  • プログラムが突然終了し、システムがポートを解放しない

        サーバーの TCP 接続が完全に切断されるまで、再リッスンを許可しないのは合理的ではありません。TCP 接続が完全に切断されていないため、connfd (127.0.0.1:6666) が完全に切断されていないことを意味し、list-tenfd (0.0.0.0:6666) をリッスンしていますが、同じポートを占有していますが、 IP アドレスは異なります。connfd は特定のクライアントと通信する特定の IP アドレスに対応し、listenfd はワイルドカード アドレスに対応します。この問題の解決策は、setsockopt() を使用してソケット記述子の SO_REUSEADDR オプションを 1 に設定することです。これは、同じポート番号で異なる IP アドレスを持つ複数のソケット記述子を作成できることを意味します。

#include<sys/types.h>

#include<sys/socket.h>

int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);

        setsockopt() は、ソケット記述子のオプション SO_REUSEADDR を 1 に設定します。これは、同じポート番号で異なる IP アドレスを持つ複数のソケット記述子を作成できることを意味します。

サーバー コードの socket() 呼び出しと bind() 呼び出しの間に次のコードを挿入します。

    整数オプション = 1;

    setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));

ポイントツーポイント、エンドツーエンド

 ルーターとスイッチの違い

 ルーターとスイッチの違い: スイッチは主に、誰もがネットワーク ケーブルを介してインターネットを閲覧できるようにすることを目的としていますが、全員が個別にダイヤルアップし、独自のブロードバンドを使用してインターネットを閲覧できます。他の人がダウンロードしていても、自分のインターネット アクセスには影響せず、同じスイッチを使用するすべてのコンピュータが同じ LAN 内にあります。ルーターは、スイッチよりも仮想ダイヤルアップ機能を持っています. 同じルーターを介してインターネットにアクセスするコンピューターは、同じブロードバンドアカウントを共有します. 全員間のインターネットアクセスは互いに影響します. たとえば、コンピューターがダウンロードしている場合、他のコンピューターはインターネットの速度が非常に遅いと感じます。同じルーター上のコンピューターも同じ LAN 内にあります。

スイッチはリレー層で動作し、スイッチは MAC アドレスに従ってアドレス指定され、ルーターはネットワーク層で動作し、IP アドレスに従ってアドレス指定されます。ルーターは TCP/IP プロトコルを処理できますが、スイッチは処理できません。  

 

おすすめ

転載: blog.csdn.net/weixin_46120107/article/details/126446175