トランスポート層の紹介

IPネットワーク層の学習を通じて、IPプロトコルは、ソースホストAから送信されたパケットを、ヘッダーの宛先アドレスに従って宛先ホストBに送信できることがわかります。では、なぜトランスポート層が必要なのでしょうか。
IP層から見ると、通信の両端は2つのホストであり、多くの場合、ポイントツーポイント通信と呼ばれます。しかし、コンピュータネットワークの実際の通信エンティティは、ホストコンピュータで実行されているプロセスであり、データのやり取りです。したがって、IPネットワーク層はパケットをホストに配信するだけで、実際の通信のプロセスには配信しません。したがって、トランスポート層は、ネットワークから受信したデータパケットをプロセスに引き渡す必要があることを示す必要があります。これは、エンドツーエンド通信と呼ばれることがよくあります。
ホストは同時に複数のネットワークアプリケーションを実行している可能性があるため、トランスポート層がネットワーク層のパケットを識別して、そのアプリケーションに配信する必要があることを確認する必要があります。このとき、アプリケーションに配信されることを示すためのサインが必要であり、ポート番号はコンピュータネットワークでの識別に使用さます複数のアプリケーションプロセスがトランスポート層プロトコルを使用してデータを送信できます。つまり、トランスポート層には多重化機能があり、パケットの受信後にパケットのヘッダーを削除した後、データをターゲットアプリケーションプロセスに正しく配信できます。また、逆多重化機能が必要です。次の図は、2つのホストのプロセス間の情報配信プロセスです。
ここに画像の説明を挿入
TCP / IPのトランスポート層は、16ビットのポート番号を使用してポートをマークします。ポート番号は、システムポート番号(0-1023)、登録ポート番号(1024-49151)、エンドユーザーが使用するポート番号(49152-65535)に分かれています)。よく使用される既知のポート番号は次のとおり
ここに画像の説明を挿入
です。トランスポート層がアプリケーションプロセス間の論理通信を提供します。論理通信とは、アプリケーション層がパケットを配信する限り、次のトランスポート層にこれらのパケットを配信できることを意味します。相手のトランスポート層は、水平方向に直接データをやり取りしているようです。しかし、実際には、2つのトランスポート層の間に水平方向の物理的な接続はありません。
トランスポート層は、高レベルのユーザーを以下のネットワークのコアの詳細から保護します。これにより、アプリケーションプロセスは、2つのトランスポート層エンティティ間にエンドツーエンドの論理通信チャネルがあるかのように見えますトランスポート層は、受信したメッセージのエラーをチェックする必要があります。IPパケットが宛先ホストに到着して上位層に配信されたときに、ポート番号が正しくない(つまり、このポートのプロセスがない)ことが判明した場合、「ポート到達不能」エラー制御メッセージを送信者に送信します。
トランスポート層の2つの主要なプロトコル:ユーザーデータグラムプロトコルUDPおよび伝送制御プロトコル

UDPプロトコル

UDPの主な機能

  • UDPはコネクションレスです。つまり、データを送信する前に接続を確立する必要はありません。
  • UDPはベストエフォート型配信を使用しますが、信頼できる配信を保証するものではありません
  • UDPはメッセージ指向、つまり、送信者からアプリケーションに送信されたUDPメッセージは、ヘッダーが追加された後にIPレイヤーに配信されます(メッセージはマージも分割もされません)
  • UDPには輻輳制御がありません。つまり、ネットワークに輻輳が存在しても、送信元ホストの送信速度は低下しません。
  • UDPは1対1、1対多、多対1、多対多の対話型通信をサポートします
  • UDPヘッダーがオーバーヘッド小さい、わずか8バイトの
    UDP最大の利点は、あるリアルタイム高いと単純下に示すように、UDPヘッダフォーマット:
    ここに画像の説明を挿入
  • 疑似ヘッダーは、UDPユーザーデータグラムの実際のヘッダーではなく、計算と検証にのみ使用され、上位または下位に送信されません。
  • ポート番号は、通信プロセスをマークするために使用されます
  • 長さ:ユーザーデータグラム全体の長さ
  • チェックサム:ユーザーデータグラム全体を確認します

TCPプロトコル

TCPの主な機能

  • TCPはコネクション型のトランスポート層プロトコルです。つまり、アプリケーションはTCPプロトコルを使用する前にTCP接続を確立する必要があり、データを送信した後、確立されたTCP接続を解放する必要があります。
  • 各TCP接続は2つのエンドポイントしか持つことができず、各TCP接続はポイントツーポイントのみにすることができます
  • TCPは信頼できる配信サービスを提供します
  • TCPはバイト指向です。TCP通信では、パケットに含まれる必要があるバイト数は、相手側から与えられたウィンドウ値と現在のネットワークの混雑度に基づいて決定されます
    各TCP接続には2つのエンドポイントがあるので、TCP接続のエンドポイントは何ですか?TCP接続のエンドポイントは、ソケットまたはソケットと呼ばれます。ソケットは、ポート番号からIPアドレスにスプライスされます。Linuxでは、TCPプロトコルとUDPプロトコルの両方が通信にソケットを使用します。

TCPセグメントのヘッダー形式

ここに画像の説明を挿入
TCPセグメントヘッダー最初の20バイトは固定されています、次の4Nバイトは、必要に応じて追加されるオプションです。以下では、各フィールドの意味を簡単に紹介します。

  • ポート番号:送信元ポートと宛先ポートを別々に記述します。上位層アプリケーションのタイプをマークするために使用されます。
  • シーケンス番号:シーケンス番号はmod 2 32を使用して計算されますヘッダーのシーケンス番号フィールドは、このセグメントで送信されるデータの最初のバイトのシーケンス番号を指しますTCPはバイト指向です。TCP接続で送信されるバイトストリームの各バイトには順番に番号が付けられます。接続が確立されたときに、送信されるバイトストリーム全体の開始シーケンス番号を設定する必要があります。
  • 確認番号:相手の次のセグメントの最初のデータバイトのシーケンス番号を受け取ることを期待する
  • データオフセット:TCPセグメントのデータの開始がTCPセグメントの開始からどのくらい離れているかを示します。これは、TCPパケットヘッダーの長さです
  • 緊急URG:URG = 1の場合、緊急ポインタフィールドが有効であることを示します。これは、このセグメントに緊急のデータがあることをシステムに伝えます。緊急のデータは、できるだけ早く送信する必要があります送信者はメッセージデータの前に緊急データを挿入し、緊急データの後のデータは通常のデータのままです。現時点では、ヘッダーの緊急ポインタフィールドと組み合わせて使用​​する必要があります。
  • 確認ACK:確認番号フィールドは、ACK = 1の場合にのみ有効です。それ以外の場合、確認番号は無効です。TCPは、接続が確立された後、送信されたすべてのセグメントがACKを設定する必要があることを規定しています。
  • プッシュPUH:TCPはプッシュプッシュ操作を使用します。このとき、送信側はPSHを1に設定し、すぐに送信するセグメントを作成します。同様に、受信側は、PSH = 1セグメントを受信した後、できるだけ早く受信アプリケーションプロセスを配信します。上に配信する前に、キャッシュ全体がいっぱいになるのを待つ代わりに。
  • RSTのリセット:RST =1。TCP接続で重大なエラーが発生したことを示します。接続を解放してから、トランスポート接続を再確立する必要があります。このフィールドは、不正なセグメントを拒否したり、接続を開くことを拒否したりするためにも使用されます。
  • 同期SYN:接続が確立されたときにシリアル番号を同期するために使用されます。SYN = 1、ACK = 0の場合、これは接続要求セグメントであることを示します。接続の確立に同意する場合、応答セグメントでSYN = 1およびACK = 1。
  • Terminate FIN:これは、接続を解放するために使用されます。FIN= 1の場合、このセグメントの送信側データが送信されたことを示し、トランスポート接続の解放を要求します。
  • ウィンドウ:ウィンドウは、このセグメントを送信するパーティの受信ウィンドウを指します。ウィンドウ値は、受信者が現在このセグメントのヘッダーにある確認番号から送信することを受信者が許可しているデータ量(バイト単位)を相手に通知します。
  • チェックサム:チェックサムチェックの範囲は、TCPメッセージ全体(つまり、ヘッダーとデータを含む)です。UDPと同様に、12バイトの疑似ヘッダーを追加する必要があります
  • 緊急ポインタ:このフィールドは、URG = 1の場合にのみ意味があります。これは、このセグメント内の緊急データ(緊急データの終了後の通常のデータ)のバイト数を示しますウィンドウがゼロの場合でも緊急データを送信できることに注意してください
  • オプション:可変長、最大40バイト。最大メッセージセグメント長には、MSS、ウィンドウ拡張、タイムスタンプ、選択確認、その他のオプションがあります。

TCPトランスポート接続管理

TCPは接続指向のプロトコルであり、トランスポート接続はTCPメッセージの送信に使用されます。TCPトランスポートプロセスと回線の相互作用には、接続の確立、データ送信、接続の解放という3つの段階があります。コネクション型は、TCP通信を指します。各TCPチャネルは2つのポートしか接続できません。通信プロセス中に、これらの2つのポート(対応するリソースを含む:伝送制御ブロックTCB)が通信プロセスに割り当てられています使用、他のアプリケーションは使用できませんここで修正されましたが、以前の接続指向の理解についてはまだいくつかの誤解があります。接続指向とは、TCPがデータを送信する前に接続を確立し、双方のシリアル番号を決定する必要があることなどを意味します。後続の送信では、これらの値は送信が成功したかどうかを判断するために必要です。前述の伝送制御ブロックTCBは重要ではありません。接続コアが確立されるたびに、アプリケーションにいくつかのリソースが割り当てられます。サーバーでの1対多通信と同様に、そのソケットリソースはパブリックです。これで理解はこうなりました。読者の理解が深ければ訂正してください。

接続を確立する

TCPは、3ウェイハンドシェイクを使用して接続を確立します。接続確立プロセス中に、次の問題を解決する必要があります。

  • 各当事者が他の当事者の存在を知ることができるようにするため
  • 両方の当事者が一部のパラメーター(シリアル番号、最大ウィンドウ値、オプションを使用するかどうかなど)をネゴシエートできるようにする
  • トランスポートエンティティのリソースに(バッファサイズ)
    ハンドシェイクを割り当てるプロセスは次のとおりです。接続はSYNフィールドを使用して確立されます。TCPは、SYNセグメントがデータを伝送できないことを要求しますが、シーケンス番号を消費します。ACKセグメントはデータを伝送できますが、データを伝送しない場合シリアル番号は消費されません。2番目のハンドシェイクも2つのセグメントに分割できることに注意してください。最初に確認応答を送信し(つまり、ACK = 1、ack = x + 1)、次に同期セグメントを送信します(SYN = 1、seq = y )このようなプロセスは、同じ効果を持つ4パケットのハンドシェイクになります。上記のACKはヘッダーフィールドACKで、ackは確認番号です。
    ここに画像の説明を挿入
    BがAにデータを返した後、それはABが存在することを示している可能性があります。これは主に、無効な接続要求メッセージが突然Bに送信されてエラーが発生するのを防ぐためです。たとえば、Aが送信した最初の接続要求メッセージはネットワークノードに長時間留まり、Aは確認メッセージを受信せずに接続要求を送信し続ける通常の通信...接続を解放します。接続を解放した後、長時間ネットワークに滞留していたリクエストがBに送信されました。これは、Bが誤って新しい接続リクエストを送信したと考えたため、Aに確認セグメントを送信し、接続を確立することに同意したためです。3番目のメッセージハンドシェイクが使用されない場合、Bが確認を送信した後、新しい接続が確立されます。このとき、Bは新しいトランスポート接続が確立され、Aがデータを送信するのを待っていると考えているため、Bの多くのリソースが無駄になっています。この機能を使用すると、サーバーに攻撃を引き起こす可能性があります。多くのホストはSYNリクエストをサーバーに1回だけ送信してから、プロセスをシャットダウンします。サーバーは常にAの応答を待機し、リソースを浪費します。sockでリッスンする各キューには、キューの長さがあります。超えた場合は破棄します。したがって、通常のリクエストは確立できません。これはしばしばSYN攻撃と呼ばれます。

TCP接続解放

send-release接続セグメントのヘッダーにある終了制御ビットFINを1に設定する必要があります。同じTCPでは、FINセグメントがデータを運んでいない場合でもシーケンス番号を消費することが規定されています
ここに画像の説明を挿入
プロセスは次のとおりです。

  • Aのアプリケーションプロセスは、最初にTCPに接続解放メッセージセグメントを送信し、データの送信を停止して、TCP接続をアクティブに閉じます。メッセージを送信し(FINは1に設定され、seq = u、uは以前に送信されたデータの最後のバイトのシーケンス番号に1を足したものです)、FIN-WAIT-1状態に入り、Bの確認を待ちます。
  • 接続解放メッセージを受信した後、Bは確認応答(ACK = 1、seq = u、ack = u + 1)を送信し、CLOSE-WAIT状態に入ります。この時点で、TCPサーバープロセスは、AからBへの接続が解放されたことを高レベルのアプリケーションプロセスに通知する必要があります。このとき、TCP接続はセミクローズ状態です。
  • AはBから確認を受け取った後、FIN-WAIT-2状態に入り、Bからの接続解放メッセージを待ちます。
  • BにAに送信するデータがない場合、そのアプリケーションプロセスはTCPに接続を解放するよう通知します。このとき、Bは解放メッセージを送信し、その後、BはLAST-ACK状態に入り、Aの確認を待ちます。
  • B接続解放メッセージセグメントを受信した後、Aはこれを確認し、メッセージを送信してから、TIME-WAIT状態に入る必要があります。TCP接続はまだ解放されていないことに注意してください。AがCLOSE状態になる前に、タイマー2MSLによって設定された時間待機する必要があります。ACKが発行されるたびに、待機タイマーがリセットされます。
  • Bは、Aの確認を受け取った直後にCLOSE状態になります。
    なぜAはTIME-WAIT状態で2MSLを待たなければならないのですか?
    Aが送信した最後のACKメッセージがBに到達できることを確認するにはこのACKは失われる可能性があります。対応する時間内にACKメッセージの確認を受信しない場合、BはFINメッセージを再送信しません。Bはこの待機時間内に確認を再送信する必要があります。そうでない場合、BはCLOSE状態に入ることができません。さらに、スリーウェイハンドシェイクで言及された無効な接続要求セグメントがこの接続に表示されるのを防ぐことができます。2MSL以降、この接続の期間中に生成されたすべてのセグメントがネットワークから消えるためです。
    接続を解放した後、ABは対応する伝送制御ブロックTCBをキャンセルします。上記の最長メッセージセグメントライフMSLは、基本的に2分に設定されています。TCPプロトコルの時間待機タイマーに加えて、キープアライブタイマーもあります。キープアライブタイマーは、通信プロセス中にデバイスが誤動作して正常に通信しないことを防ぎ、受信側が待機してリソースを無駄に消費する原因になります。キープアライブタイマーは通常2時間に設定されています。2時間以内にデータグラムが受信されない場合は、プローブセグメントが送信されます。10のプローブセグメントを継続的に送信しても応答がない場合は75秒ごとに、次に、接続を直接閉じます。

TCPの信頼性の高い送信のしくみ

TCPによって送信されたパケットがIP層に転送されて送信されることはわかっていますが、IP層はベストエフォートサービスしか提供できないため、TCPは2つのトランスポート層間の通信を信頼できるものにするために適切な対策を講じる必要があります。ここで使用される確認と再送信のメカニズムは、自動再送信要求ARQとも呼ばれます

  • 待機プロトコルの
    停止待機プロトコルの停止は、パケットが送信されるたびに送信を停止し、相手の確認を待ってから、確認を受信して​​から次のパケットを送信します。送信者は、パケットの送信後にタイムアウトタイマーを設定し、タイマーの期限が切れると、最後に送信されたパケットを再送信します。タイマーが切れる前に相手の確認を受け取る前に、設定したタイムアウトタイマーが解除されます。このような信頼性の高い送信プロトコルは、自動再送信要求ARQ
    ここに画像の説明を挿入
    停止待機プロトコルと呼ばれることが多く、利点は単純ですが、チャネル使用率が低すぎるという欠点があります。送信効率を向上させるために、送信者は非効率的なストップアンドウェイトプロトコルの代わりにパイプライン送信を使用できますつまり、送信者は、パケットが送信されるたびに一時停止して相手の確認を待つことなく、複数のパケットを連続して送信できます。次の図に示すように、
    ここに画像の説明を挿入
    これは継続的なARQプロトコルです。送信側は送信ウィンドウを維持し、パケット確認を受信した後、送信ウィンドウを1パケット先に移動します。受信側は、通常、累積確認応答方式を採用しており、複数のパケットを受信し後、順番に到着する最後のパケットに確認応答を送信します

TCPプロトコルには、データの安定した動作を保証するための多くのメカニズムがあり、その最も重要なものはスライディングウィンドウコントロールです。上記のパイプライン送信と同様に、条件が許せばデータパケットは継続的に送信されます。レシーバーはレシーバーのバッファーステータス(ポートサイズ)をセンダーに通知し、センダーはウィンドウに従ってレシーバーにデータを送信します。
ネットワーク通信では、アプリケーション層はトランスポート層に送信する必要のあるデータを引き渡してから、他の処理を行います。TCPはバイトストリーム送信を指向しているため、TCPキャッシュはいつアプリケーション層のデータを受信するのでしょうか。え?
3つのTCP送信機会があります。TCPは、最大メッセージセグメント長に等しい変数を維持し、バッファに格納されたデータがMSSバイトに到達すると送信されます。緊急処理が必要なデータに使用されるPUCHプッシュは、TCPがアプリケーション層からPUSHを受信します。指示の後、メッセージセグメントはすぐに送信され、TCPはタイマーを開始し、タイマーが終了するとタイマーが送信されます。
TCP通信のフロー制御は、送信側が速度を速くしすぎないようにするが、受信側は受信する時間を確保することです。実際には、ウィンドウのサイズを制御することです。次に、TCPをより効率的にするために、Nagleアルゴリズムを使用して、最初にキャッシュで受信したデータを送信し、確認応答を受信した後、キャッシュ内のすべてのデータを送信し、確認の受信を待ち続ける...同時に、それも規定するバッファリングされたデータが送信ウィンドウのサイズの半分またはメッセージセグメントの最大長に達した場合、メッセージセグメントがすぐに送信されます。レシーバーも同じです。レシーバーには、最長のセグメントを収容するのに十分なスペースがあるか、受信バッファーの空きスペースが半分になるまで待機します受信者は確認メッセージを送信します。
フロー制御には、ゼロウィンドウ期間タイマーがあり、TCP受信側が相手のゼロウィンドウ通知を受信して​​いる限り、期間タイマーが開始され、時間切れになります。ゼロウィンドウ検出メッセージセグメントを送信するだけで、デッドロックデッドロックを解除できます(送信者はゼロ以外のウィンドウメッセージを待っていましたが、このメッセージは失われています)。
ネットワークトラフィックが高すぎる場合にTCPの輻輳制御率と類似を達成するために、フロー制御は、それによって混雑度を低下させる、窓を介してデータ送信を制御します。しかし、輻輳とフロー制御は概念ではありません。

元の記事を35件公開 Like1 Visits 1870

おすすめ

転載: blog.csdn.net/lzj_linux188/article/details/104500164