【Linux】TCPの詳しい解説を含むネットワークプログラミングの基礎

ネットワーク構造パターン

C/S体制

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

   クライアントはLAN経由でサーバーに接続し、ユーザーのリクエストを受け付けたり、ネットワーク経由でサーバーにリクエストを出したりしてデータベースを操作します。サーバーはクライアントのリクエストを受け入れてデータをクライアントに送信し、クライアントはデータを計算して結果をユーザーに提示します。また、サーバーは完全なセキュリティ保護、データ整合性処理およびその他の操作を提供し、複数のクライアントが同時にサーバーにアクセスできるようにする必要があるため、サーバーのハードウェア データ処理能力に高い要求が課せられます。

   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アドレス

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

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

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

MAC アドレスの長さは 48 ビット (6 バイト) で、通常は 12 個の 16 進数で表されます。例: 00-16-EA-AE-3C-40 は MAC アドレスです。最初の 3 バイトの 16 進数 00-16-EA は、IEEE によって割り当てられたネットワーク ハードウェアの製造元の番号を表し、次のバイトは 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 進表記で表されます。

ポート

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

ポートの分類:

  1. ウェルノウン ポートウェルノウン ポートは、 0 ~ 1023 の範囲
       の多くのウェルノウン ポート番号 (ウェルノウン ポート、認識ポート、または一般的に使用されるポートとも呼ばれます) であり、いくつかの特定のサービスに密接にバインドされています(ポート 80 は WWW サービスに割り当てられ、ポート 21 は FTP サービスに割り当てられ、ポート 23 は Telnet に割り当てられます。など)    ネットワーク サービスでは他のポート番号を使用できます。デフォルトのポート番号ではない場合、そのポートはアドレスバーに「URL:ポート番号」を入力して、アドレスバーに指定した番号を入力します。ただし、一部のシステム プロトコルでは変更できない固定ポート番号が使用されます。たとえば、ポート 139 は NetBIOS と TCP/IP 間の通信に特別に使用され、手動で変更できません
  2. 登録されたポート
       番号は1024到49151一部のサービスに緩やかにバインドされ、ユーザー プロセスまたはアプリケーション (主にユーザーがインストールすることを選択したアプリケーション) に割り当てられます。これらのポートがサーバー リソースによって占有されていない場合、クライアントを使用して送信元ポートを動的に選択できます。【プログラム作成時に選択できるポート】
  3. 動的ポート/プライベート ポート
       動的ポートの範囲は 49152 ~ 65535 です。一般に特定のサービスを固定的にではなく動的に割り当てるため、ダイナミック ポートと呼ばれます。

ネットワークモデル

OSI 7 層モデル

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

ここに画像の説明を挿入します
アプリケーション層:ネットワーク サービスとエンド ユーザー間のインターフェイス。この層は、電子メール、ファイル転送、端末エミュレーションなどのユーザー アプリケーションにネットワーク サービスを提供します。

プレゼンテーション層:データ表現、セキュリティ、および圧縮。主に、受信したデータの解釈、暗号化と復号化、圧縮と解凍(つまり、コンピュータが認識できるものを人間が認識できるもの(画像、音声など)に変換します。システムのアプリケーション層が送信された情報は、別のシステムのアプリケーション層で読み取ることができます。

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

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

ネットワーク層:論理アドレス指定を実行して、地理的に異なる場所にあるネットワーク内の 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 つ以上のルーターを通過する必要があります。

ここに画像の説明を挿入します
    リンク層にはイーサネットやトークンリングなどの規格があり、ネットワークカードデバイスのドライバやフレーム同期(ネットワーク回線からどのような信号を検出したかを新しいフレームの先頭としてカウントする)などを担当します。 、競合検出(競合が検出された場合は自動再送信)、データエラーチェックなど。スイッチは、リンク層で動作し、異なるリンク層ネットワーク間でデータ フレームを転送できるネットワーク デバイスです。異なるリンク層のフレーム フォーマットは異なるため、スイッチは受信データ パケットのリンク層ヘッダーを削除し、再送信する必要があります。カプセル化して、後で再投稿してください。

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

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

    TCP は接続指向で信頼性の高いプロトコルで、電話をかけるのと似ています。双方が電話に出て ID を交換すると、接続が確立され、あとは話すだけです。相手に内容が聞こえることを確認してください。話し終わったら、電話を切って切断します。つまり、TCP 伝送の双方が最初に接続を確立する必要があります。その後、TCP プロトコルによってデータの送受信の信頼性が保証されます。失われたデータグラムは自動的に再送信されます。上位層のアプリケーションは常に信頼性の高いデータ ストリームを受信します。通信後に接続は閉じられます。

    UDP はコネクションレス型の伝送プロトコルであり、信頼性は保証されていません。手紙を送るのと似ています。手紙を書いて郵便受けに投函した後は、郵送中に紛失しないという保証はありません。手紙が送信される順序が保証されます。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 (インターネット インターネット プロトコル)、ICMP (インターネット コントロール プロトコル)、IGMP (インターネット グループ管理プロトコル)

ネットワークインターフェース層:ARP(アドレス解決プロトコル)、RARP(リバースアドレス解決プロトコル)

イーサネットプロトコル

ここに画像の説明を挿入します
宛先アドレスと送信元アドレスは、ネットワーク カードのハードウェア アドレス (MAC アドレス) を指します。長さは 48 ビットで、工場で固定されています。ifconfig コマンドを使用して表示できます。タイプ (つまり、データ内にどのプロトコルが含まれているか) には、IP、ARP、RARP に対応する 3 つの値があります。フレームの終わりは CRC チェック コードです。

类型:0x800表示IP、Ox806表示ARP、0x835表示 RARP

ARPプロトコル

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

    各ホストはカーネル内に ARP キャッシュ テーブルを維持します。送信元ホストは、まずホストの ARP テーブルで宛先ホストのハードウェア アドレスを検索します。見つかった場合は、対応する宛先ホストにデータ パケットを送信します。そうでない場合は、源主机将会用一个以太网协议封装好的ARP协议通过数据链路层广播一个ARP请求到本地网段(APP プロトコルの宛先イーサネット (ハードウェア) アドレスは 00:00:00:00:00:00 で埋められ、イーサネット フレームの先頭のハードウェア アドレスは FF:FF で埋められます。 FF:FF:FF:FF はブロードキャストを示します)。宛先ホストがブロードキャスト ARP 要求を受信し、IP アドレスが自身の IP アドレスと一致することが判明すると、ARP 応答パケットを送信元ホストに送信し、ARP キャッシュ テーブルを更新し、応答パケットに自身のハードウェア アドレスを埋めます。

要求 ARP は ip タイプ、イーサネットは ARP タイプ、応答 ip、ARP

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

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

ブロードキャスト時:宛先イーサネットアドレス FF:FF:FF:FF:FF:FF

IPデータグラム形式

ここに画像の説明を挿入します
4桁のバージョン番号:IPv4またはIPv6

ヘッダ長 4 ビット(単位は 4 バイト): 1 行は 4 バイトで、オプションを含まないと仮定すると 5 行になります。すると、1行(実際にはプロトコル全体は1行ですが、植字の便宜上表を形成するために多くの行に分割されています)は20バイトで、ヘッダーの長さはわずか4ビットで、2から4番目までです。 power は最大 15 バイトを表すことができますが、20 バイトを表す方法はありません。したがって、ヘッダ長の各ビットの単位は4バイトとなります。このように、4 ビットのヘッダー長は最大 60 バイトを表すことができるため、必要な 20 バイトに加えて、オプションは最大 40 バイトになります。

8 ビット サービス タイプ: 通常は使用されず、値は 0

全長: ヘッダーとデータの合計長 (バイト単位)

TTL: データグラムの送信元ホストによって設定された生存時間。ルーターを通過するたびに 1 ずつ減少します。0 になった場合は、経路が長すぎて宛先ホストのネットワークが見つからないことを意味しますしたがって、この生存時間 Time はホップです。

8 ビット プロトコル: プロトコル フィールドは、上位層プロトコルが 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: 伝送制御プロトコル、コネクション指向、信頼性の高い、バイト ストリーム ベースで、ユニキャスト伝送のみをサポートします。

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

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 フラグの位置を 1 に設定します。
    2. ランダムな 32 ビット シーケンス番号 seq=J を生成します。このシリアル番号はその後にデータ (データ サイズ) を運ぶことができます。 2 番目のハンドシェイク:
1.
    サーバー側クライアントの接続を受信します: ACK=1
    2. サーバーは確認シーケンス番号を返信します: ack = クライアントのシーケンス番号 + データ長 (上図では送信データが 0 であると仮定し、SYN のみが 1 バイトを占めます) + SYN/FIN (バイト カウントを押します)
    3. サーバーはクライアントへの接続リクエストを開始します: SYN=1
    4. サーバーはランダムなシーケンス番号を生成します: seq =K
3 番目のハンドシェイク:
    1. クライアントは次のように応答します。サーバーの接続要求: ACK=1
    2 。クライアントはサーバーからデータを受信したと応答します: ack = サーバーのシリアル番号 + データ長 + SYN/FIN (1 バイトとして計算)

seq はシーケンス番号、ack は確認シーケンス番号です。シーケンス番号 seq は、SYN=1 の場合にのみ役立ちます。同様に、確認シーケンス番号 ack は、ACK=1 の場合にのみ役立ちます。

なぜ3ウェイハンドシェイクがあるのでしょうか?

クライアントのデータ送信とデータ機能が正常であるかどうかは、3 回のハンドシェイクを通じてのみ判断できます。サーバー側は正常にデータを送受信します。双方向ハンドシェイクは明らかに証明できません。たとえば、クライアントが SYN 接続要求を送信し、サーバーが ACK メッセージで応答して送信した場合、クライアントがデータを正常に送信し、データを受信できることのみを証明できます。決定することはできません。4回の握手でも達成できますが、3回で済むのでもう1回握手する必要はありません。また、3 ウェイ ハンドシェイク中に、両当事者が送信するシーケンス番号の初期値や最大セグメント サイズなど、いくつかの情報についてネゴシエートします。

TCP スライディング ウィンドウ

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

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

ここに画像の説明を挿入します
上記の通信プロセスを見てください。

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

  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. クライアントはサーバーのリクエストに応答して接続を閉じます

接続を確立するプロセスは 3 ウェイ ハンドシェイクであり、接続を閉じるには通常 4 つのウェーブが必要です。通常、サーバーの応答と接続の終了要求は、半クローズ状態にあるため、1 つのセグメントに結合されません。さらに、A は必要なデータを送信した後に close() を呼び出します。B のバッファにはまだ処理されていないデータがあり、A が送信したデータに応答する必要があるため、B の書き込み端を一時的に閉じることができません。この場合、クライアントは接続を閉じた後はサーバーにデータを送信できなくなりますが、サーバーも接続を閉じるまでは引き続きデータをクライアントに送信できます。

TCP変換

ここに画像の説明を挿入します
赤線:クライアント 緑線(破線):サーバー側(2本同時に解析)

CLOSED: ID は初期状態です

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

SYN_SENT:この状態は STN_RCVD をエコーし​​ます。クライアント SOCKET が接続を実行するとき、最初に SYN メッセージを送信し、次に SYN_SENT 状態に入り、サーバーが 3 ウェイ ハンドシェイクで 2 番目のメッセージを送信するのを待ちます。SYN_SENT ステータスは、クライアントが SYN リクエストを送信したことを示します

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

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

FIN_WAIT_1: ESTABLSHED 状態にあるときに、接続をアクティブに閉じたい側が相手側に FIN メッセージを送信することを示します。この時点で、ソケットは (通常は非常に早く) FIN_WAIT_1 状態に入ります。

FIN_WAIT_2:アクティブにクローズする側は、FIN を送信して ACK を受信した後、この状態に入ります。これを半接続または半閉状態といいます。この状態のソケットはデータの受信のみが可能で、送信はできません。

TIME_WAIT:アクティブにクローズした側は相手の FIN メッセージを受信し、ACK メッセージを送信し、2MSL 後に CLOSED 利用可能状態に戻ることができます。为什么要设置2MSL? 确保最后一次发送的ACK对方能够接收到。如果丢失,则重新发送ACK

2MSL (最大セグメント存続時間)
積極的に切断する当事者 B は最終的に TIME_WAIT 状態に入り、その状態は 2msl 続きます。

  • msl: 公式推奨: 2 分、実際には 30 秒、2msl は 60 秒です

TCP 接続のアクティブな終了側が、パッシブな終了側によって送信された FIN と最終 ACK を受信した場合、接続のアクティブな終了側は 2MSL の間 TIME_WAIT 状態になる必要があります。

これにより、TCP 接続のアクティブな終了側は、送信した ACK が失われた場合に最終 ACK を再送信できます (パッシブな終了側が FIN を送信したが、アクティブな終了側が送信した ACK を受信しなかった場合、パッシブな終了側はFIN を再送信して、アクティブな終了側が ACK を再度送信するようにします。
アクティブなクロージング パーティによって再送信される最終 ACK 并不是因为被动关闭方重传了ACK(シーケンス番号は消費されず、パッシブなクロージング パーティはそれを再送信しません) 而是因为被动关闭方重传了它的FIN実際、受動的クロージング側は、最終 ACK を受信するまで常に FIN を再送信します。

結論:この状態は特別であり、まれです。通常、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 使用可能状態に入ることができます。

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

質問: サーバー側の ACK と FIN が 4 つの波で同時に送信されず、別々に送信されるのはなぜですか?
回答: クライアントのみが切断を希望しているため、おそらくサーバーは現時点では切断を望んでおらず、クライアントに送信する必要があるデータがある可能性があります。なので別送が必要です

質問: パッシブなクロージング パーティが 2msl 経過しても ACK を受信しない場合 (つまり、第 4 ウェーブが失われた場合) はどうなりますか?
回答: アクティブ パーティがパッシブ パーティから再送信された FIN メッセージを受信すると、2msl がリセットされます。サーバー (パッシブ クロージング パーティ) が FIN メッセージを再送信する回数は、tcp_orphan_retries パラメータによって制御され、再送信回数が tcp_orphan_retries を超えると、FIN メッセージは送信されなくなり、直接クローズ状態に入ります。

質問: 3 ウェイ ハンドシェイクと 4 ウェイ ウェーブがそれぞれ失われた場合はどうなりますか?
回答: TCP の 3 ウェイ ハンドシェイクと 4 ウェイ ウェーブが失敗した場合はどうなりますか?

質問: 4 つの波のうちの最初の波に ACK があるのはなぜですか?
回答: FIN を送信するときは、受動的クロージング側が送信した以前のデータを確認するための ACK も必要です。ACK : TCP协议规定,只有ACK=1时表示对方数据发送有效,也规定连接建立后所有发送的报文的ACK必须为1この記事を参照してください: 4 つの波についてまだ知らない ACK メカニズム

半分閉じた

A が TCP リンクで FIN 要求を B に送信し、もう一方のエンド B が ACK で応答した場合 (A が FIN_WAIT_2 状態になる)、FIN はすぐには A に送信されず、パーティ A は半接続状態 (ハーフスイッチ) になります。 )、この時点で A は B が送信したデータを受信できますが、A は B にデータを送信できなくなります。

プログラムの観点から見ると、API を使用して半接続状態を制御できます。

#include <sys/socket.h>
int shutdown(int sockfd,int how);
socket:需要关闭的socket的描述符
how:   
     SHUT_ED(0):  关闭sockfd上的读功能,此选项将不允许sockfd进行读操作
     该套接字不再接受数据,任何当前在套接字接受缓冲区的数据将被无声的丢弃掉
     SHUT_WR(1):  关闭sockfd上的写功能,此选项将不允许socked进行写操作。
                  进程不能对此套接字发出写操作。
     SHUT_RDWR(2):关闭sockfd的读写功能

ポートの再利用

ポート再利用の最も一般的な用途は次のとおりです。

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

ネットワーク関連情報を表示するために一般的に使用されるコマンド:
netstat
    パラメーター:
        -a すべてのソケット
        -p ソケットを使用するプログラムの名前を表示します
        -n ドメイン ネーム サーバーを経由せずに IP アドレスを直接使用します

接続を終了するには close を使用しますが、記述子の参照カウントが減少するだけで、接続は直接閉じられません。接続は記述子の参照カウントが 0 に達した場合にのみ閉じられます。shutdown は記述子の参照カウントを考慮せず、記述子を直接閉じます。一方向の接続を中止したり、読み取りのみを中止したり、書き込みのみを中止したりすることもできます。

  1. ソケットを共有する複数のプロセスがある場合、close が呼び出されるたびに、カウントが 0 になるまでカウントが 1 ずつ減らされます。つまり、使用されているすべてのプロセスが close を呼び出して、ソケットが解放されます。
  2. マルチプロセスでは、あるプロセスが shutdown(sockfd,SHUT_RDWR) を呼び出した場合、他のプロセスは通信できなくなりますが、あるプロセスが close(sockfd) を呼び出した場合、他のプロセスには影響を与えません。

テストを実行します:
1. まずサーバーを起動し、ネットワーク関連情報を確認します。実行結果は次のとおりです。
ここに画像の説明を挿入します

プロトコルは tcp、IP アドレスは 0.0.0.0、ポート番号は 9999、ステータスは LSTEN、サーバーはアプリケーションの名前です。

2. 次に、クライアントの起動を続けます。
ここに画像の説明を挿入します
最初のソケットは、監視用に特別に使用されます。次の 2 つは、サーバーとクライアント間で確立された接続を示しています。リンクを確立するには 2 つのソケットが必要なので、2 つあります。

3. 次に、Ctrl+C を使用してサーバーを終了します。
ここに画像の説明を挿入します
この時点では、サーバーが閉じられているため、名前も表示されなくなりますが、クライアントが積極的にシャットダウンを開始していないため、サーバーのステータスが表示されないことがわかります。サーバーは FIN_WAIT2 です。クライアントはクローズを待機している状態です。

次に、何も操作せずにしばらく待つと、サーバー情報が消えていることがわかります
ここに画像の説明を挿入します
4. サーバーを再起動します (先生のビデオでは、bind がエラーを報告しました。これは、ポート 127.0.0 が無効であることを証明するためです)。この時点では 0.1:9999 はまだ FIN_WAIT2 にあります。このポートはまだ解放されていないため、不便とエラー報告が発生し、ポートの再利用につながります) 私は ubuntu20.04 を使用しています。サーバーが再起動されると、以下に示すように、 0.0.0.0 にポートを割り当てるので、エラーは報告されませんでした
ここに画像の説明を挿入します
4. このとき、サーバーを閉じてからクライアントを閉じました。先生によると、次の図のようになるはずです( 6666应该是9999,这里用下别人的图)
ここに画像の説明を挿入します
TIME_WAIT 時間が経過するまで待つ必要があります (1 分)。その後ポートが解放され、再び使用できるようになります。すぐにサーバーを起動するとエラーが発生します。

ポート多重化機能

#include<sys/types.h>

#include<sys/socket.h>
//设置套接字的属性(不仅仅能设置端口复用)
int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen);
参数:
	-sockfd:要操作的文件描述符
	-level:级别 - SOL_SOCKET(端口复用的级别)
	-optname:选项的名称
		-SO_REUSEADDR
		-SO_REUSEPORT
	- optval:端口复用的值(整形)
		- 1:要复用端口
		- 0:不要复用端口
	- optlen:optval参数的大小

端口复用,设置的时机是在服务器绑定端口之前。
setsockopt();
bind();

おすすめ

転載: blog.csdn.net/mhyasadj/article/details/131121358