5分でTCPプロトコルを理解する

TCPはインターネットのコアプロトコルの1つであり、この記事ではその基本的な知識を紹介します。

1. TCPプロトコルの役割

インターネットは一連の合意で構成されています。TCPはこれらの層の1つにすぎず、独自の分業を行っています。

(画像の説明:TCPは、イーサネットプロトコルとIPプロトコルの上位層プロトコルであり、アプリケーション層プロトコルの下位層プロトコルでもあります。)下位層イーサネットプロトコル(イーサネット)は、電子信号がパケットを形成し、サブネットを解決する方法を指定します内部ポイントツーポイント通信。

(画像の説明:イーサネットプロトコルは、ローカルエリアネットワークのポイントツーポイント通信を解決します。)ただし、イーサネットプロトコルは、複数のLANが相互に通信する方法を解決できません。これは、IPプロトコルによって解決されます。

(画像の説明:IPプロトコルは複数のLANに接続できます。)IPプロトコルは、IPアドレスと呼ばれる独自のアドレスルールのセットを定義します。これはルーティング機能を実装し、ローカルエリアネットワークのホストAが別のローカルエリアネットワークのホストBにメッセージを送信できるようにします。

(画像の説明:ルーターはIPプロトコルに基づいています。LANはルーターで接続されています。)ルーティングの原理は単純です。市場に出回っているすべてのルーターには、背後に多くのネットワークポートがあり、複数のネットワークケーブルを接続する必要があります。ルーター内にルーティングテーブルがあり、セグメントAのIPアドレスが1から出て、セグメントBのアドレスが2から出ることを規定しています。この「ガイドサイン」のセットにより、データパケットの転送が実現されます。

(画像の説明:このマシンのルーティングテーブルは、さまざまなIP宛先のデータパケットが送信されるインターフェイスを示します。)IPプロトコルはアドレスプロトコルにすぎず、データパケットの整合性を保証するものではありません。ルーターがパケットを失った場合(たとえば、バッファーがいっぱいになると、新しい着信パケットが失われます)、失われたパケットとそのパケットを再送する方法を見つける必要があります。これはTCPプロトコルに依存します。簡単に言えば、TCPプロトコルの役割は、データ通信の整合性と信頼性を確保し、パケット損失を防ぐことです。

次に、TCPパケットのサイズ

イーサネットパケット(パケット)のサイズは固定で、最初は1518バイトでしたが、後で1522バイトに増加しました。このうち、1500バイトがペイロード、22バイトが先頭情報です。IPデータパケットはイーサネットデータパケットのペイロード内にあり、独自のヘッダー情報もあるため、少なくとも20バイトが必要なので、IPデータパケットの負荷は最大1480バイトです。

(画像の説明:IPパケットはイーサネットパケットにあり、TCPパケットはIPパケットにあります。)TCPパケットはIPパケットのペイロードにあります。少なくとも20バイトのヘッダー情報が必要なので、TCPパケットの最大負荷は1480-20 = 1460バイトです。IPおよびTCPプロトコルには追加のヘッダー情報が含まれることが多いため、TCPの負荷は実際には約1400バイトです。したがって、1500バイトのメッセージには2つのTCPパケットが必要です。HTTP / 2プロトコルの主な改善点は、HTTPプロトコルのヘッダー情報を圧縮することです。これにより、HTTP要求を複数に分割する代わりにTCPパケットに入れることができ、速度が向上します。

(画像の説明:イーサネットデータパケットの負荷は1500バイト、TCPデータパケットの負荷は約1400バイトです。)

3. TCPパケットの数(SEQ)

1400バイトのパケットは、一度に大量のデータを送信するため、複数のパケットに分割する必要があります。たとえば、10MBのファイルは7,100パケット以上を送信する必要があります。送信時に、TCPプロトコルは各シーケンス番号(略してSEQ)を割り当てて、受信側がそれを順番に復元できるようにします。パケット損失の場合、どのパケットが失われたかも知ることができます。最初のパケットの数は乱数です。理解を容易にするため、ここではパッケージ1と呼びます。このパケットのペイロード長が100バイトであると仮定すると、次のパケットの数は101になるはずです。これは、各パケットが2つの番号を取得できることを意味します。それ自体の番号と次のパケットの番号です。受信者は、元のファイルに復元する順序を知っています。

(画像の説明:現在のパケット番号は45943で、次のパケット番号は46183です。これは、このパケットの負荷が240バイトであることを示しています。)

4. TCPパケットの組み立て

TCPデータパケットを受信した後、オペレーティングシステムによってアセンブリが復元されます。アプリケーションはTCPパケットを直接処理しません。アプリケーションの場合、データ通信の詳細は気にしないでください。回線に異常がない限り、常に完全なデータが受信されます。アプリケーションが必要とするデータはTCPパケットに入れられ、独自の形式(HTTPプロトコルなど)を持っています。TCPは、アプリケーション層プロトコルで指定されている元のファイルのサイズを示すメカニズムを提供していません。たとえば、HTTPプロトコルにはヘッダーContent-Lengthがあり、情報本文のサイズを示します。オペレーティングシステムの場合は、TCPパケットを継続的に受信して順番に組み立てることです。1つのパケットに多数あります。オペレーティングシステムは、TCPパケットのデータを処理しません。TCPパケットが組み立てられたら、それらをアプリケーションに転送します。TCPパケットにはポートパラメータがあり、ポートに転送されるアプリケーションを指定するために使用されます。

(図の説明:システムは、TCPパケットのポートに従って、組み立てられたデータを対応するアプリケーションに転送します。上の図では、ポート21はFTPサーバー、ポート25はSMTPサービス、ポート80はWebサーバーです。)アプリケーション組み立てられた元のデータを受信した後、ブラウザを例にとると、HTTPプロトコルのContent-Lengthフィールドに従ってデータを正しく読み取ります。これは、単一のTCP通信に複数のHTTP通信を含めることができることも意味します。

5、スロースタートとACK

もちろん、サーバーはデータパケットを送信しますが、早く送信するほど、一度にすべてを送信するのが最善です。ただし、送信速度が速すぎると、パケットが失われる可能性があります。帯域幅が狭い、ルーターが過熱している、バッファオーバーフローなどの多くの要因により、パケットが失われる可能性があります。回線が良くない場合は、送信速度が速いほど、損失が大きくなります。最も理想的な状態は、回線が許せば最高速度に到達することです。しかし、どのようにして相手の回線の理想的なレートを知ることができますか?答えはゆっくりと試すことです。効率と信頼性の統一を実現するために、TCPプロトコルはスロースタートメカニズムを設計しました。最初は送信が遅く、パケット損失の状況に応じてレートが調整されます。パケットが失われない場合は伝送速度が加速され、パケットが失われる場合は伝送速度が低下します。これはLinuxカーネルで設定されています(定数TCP_INIT_CWND)。通信が開始すると、送信側は一度に10パケットを送信します。つまり、「送信ウィンドウ」のサイズは10です。次に停止し、受信者の確認を待ってから、送信を続けます。デフォルトでは、レシーバーは2つのTCPパケットを受信するたびに確認メッセージを送信します。英語の「確認応答」は確認応答なので、この確認メッセージはACKと省略されます。ACKには2つのメッセージが含まれます。

次のパケット番号を受信する予定です
受信者の受信ウィンドウの残りの容量

送信者はこれら2つの情報に加えて、送信したデータパケットの最新の数を持っています。これにより、受信者のおおよその受信速度が推測され、送信速度が増減します。これは「送信ウィンドウ」と呼ばれ、このウィンドウのサイズは可変です。

(画像の説明:各ACKには次のパケットの数と受信ウィンドウの残りの容量が含まれます。両方の当事者がACKを送信します。)TCP通信は双方向であるため、両方の当事者がACKを送信する必要があることに注意してください。2つのパーティのウィンドウサイズは異なる可能性があります。また、ACKはいくつかの単純なフィールドであり、通常はデータと結合され、データパケットで送信されます。

(画像の説明:上の図では4つの通信があります。最初の通信では、ホストAからホストBに送信されるデータパケット番号は1、長さは100バイトです。したがって、2回目のホストBのACK番号は1 + 100 = 101、3回目の通信でのホストAのパケット番号も101です。同様に、2回目の通信でホストBからホストAに送信されるパケット番号は1、長さは200バイトなので、3回目の通信でホストAのACKこれは201であり、4番目の通信のBホストのパケット数も201です。)帯域幅が広く回線が良好な接続であっても、TCPは常に10パケットからゆっくりと試行します。最高の伝送速度に到達します。これはTCPのスロースタートです。

6.データパケットの処理の喪失

TCPプロトコルはデータ通信の完全性を保証できますが、これはどのように行われますか?前述のように、各パケットには次のパケットの番号が含まれています。次のパケットが受信されない場合、ACK番号は変更されません。たとえば、パケット4を受信しましたが、パケット5を受信して​​いません。5番パケット受信を楽しみにACKを記録します。しばらくすると、パケット5が受信され、次のラウンドのACKで数が更新されます。それでもパケット5が受信されず、パケット6または7が受信された場合、ACKの番号は変更されず、パケット5は常に表示されます。これにより、多くの重複したコンテンツACKが発生します。送信者は、3回連続してACKを繰り返し受信したことを発見した場合、またはタイムアウト後にACKを受信しなかった場合、パケット損失、つまりパケット5が失われたことを確認してから、このパケットを再度送信します。このメカニズムにより、TCPはパケット損失がないことを保証します。

(画像の説明:ホストBはパケット番号100を受信しません。同じACKを継続的に送信し、ホストAがパケット番号100を再送信するようトリガーします。)

488件のオリジナル記事を公開 85 件を賞賛 230,000回の閲覧+

おすすめ

転載: blog.csdn.net/Coo123_/article/details/105225059