TCP は、多くの問題を解決する必要があり、これらの問題により多くのサブ問題とダークサイドが引き起こされるため、非常に複雑なプロトコルです。したがって、TCP の学習自体は苦痛を伴うプロセスですが、学習プロセスによって多くのメリットが得られます。 TCP プロトコルの詳細については、W. Richard Stevens の「TCP/IP 詳細な説明 第 1 巻: プロトコル」を読むことをお勧めします (もちろん、RFC793 やその後の多くの RFC を読むこともできます)。また、この記事では英語の用語を使用するので、これらの英語のキーワードを通じて関連する技術文書を見つけることができます。 この記事を書きたい理由は3つあります。
したがって、この記事ではすべてを網羅するのではなく、TCP プロトコル、アルゴリズム、および原則の概要のみを説明します。 さっそく、まず最初に、TCP は OSI の 7 層ネットワーク モデルの第 4 層 (トランスポート層) にあり、IP は第 3 層 (ネットワーク層) にあり、ARP は第 2 層 (データ リンク層) にあることを知っておく必要があります。第 2 層のデータはフレーム、第 3 層のデータはパケット、第 4 層のデータはセグメントと呼ばれます。 まず、プログラムのデータは最初に TCP セグメントに入力され、次に TCP セグメントが IP パケットに入力され、最後にイーサネット フレームに入力されることを知っておく必要があります。相手側に送信された後、各層は独自のプロトコルを解析し、データを処理のために上位レベルのプロトコルに渡します。 TCP ヘッダー形式 次に、TCP ヘッダーの形式を見てみましょう。 TCP ヘッダー形式 (画像ソース) 以下の点に注意する必要があります。
その他については、次の図を参照してください。 (画像出典) TCP ステートマシン 実際、ネットワーク上の伝送は TCP を含めてコネクションレスです。 TCP のいわゆる「接続」は、実際には、通信する 2 つの当事者間の「接続状態」を維持し、接続があるように見せかけるだけです。したがって、TCP 状態の変化は非常に重要です。 以下は、「TCP プロトコル ステート マシン」(画像ソース) と「TCP 接続の確立」、「TCP 接続の切断」、および「データ転送」の比較表です。比較しやすいように、2 つの画像を並べて配置しました。さらに、次の 2 つの画像は非常に重要なので、覚えておく必要があります。 (不満点: このような複雑なステート マシンを見ると、このプロトコルがいかに複雑であるかがわかります。複雑なものには常に多くのトリッキーな点があるため、TCP プロトコルは実際にはかなりトリッキーです)。 多くの人が、なぜ接続を確立するには 3 回のハンドシェイクが必要で、接続を切断するには 4 回のハンドシェイクが必要なのかと疑問に思うでしょう。
両端が同時に切断される(画像出典) さらに、注意すべき点がいくつかあります。
繰り返しになりますが、TIME_WAIT 問題を解決するために tcp_tw_reuse と tcp_tw_recycle を使用することは、これら 2 つのパラメータが TCP プロトコル (RFC 1122) に違反するため、非常に危険です。 実際、TIME_WAIT は、積極的に切断したことを意味するため、いわゆる「自殺しなければ死なない」状態になります。想像してみてください。もし相手側が切断したら、問題は相手側にあることになります、ハハハ。さらに、サーバーが HTTP サーバーである場合、HTTP KeepAlive (ブラウザーは TCP 接続を再利用して複数の HTTP 要求を処理します) を設定し、クライアントを切断させる (注意が必要です。ブラウザーは非常に貪欲な場合があり、必要がない限り積極的に切断することはありません) ことはどの程度重要ですか。 データ転送におけるシーケンス番号 下の画像は、coolshell.cn にアクセスしたときに Wireshark から取得したスクリーンショットで、SeqNum がどのように変化したかを示しています。 (Wireshark メニューの統計 -> フローグラフ… を使用) 転送されたバイト数に応じて SeqNum が増加することがわかります。上図では、3ウェイハンドシェイク後、Len:1440のパケットが2つ受信され、2番目のパケットのSeqNumは1441になります。前の ACK 応答は 1441 であり、1440 が受信されたことを示します。 注: Wireshark パケット キャプチャ プログラムを使用して 3 ウェイ ハンドシェイクを観察すると、SeqNum が常に 0 であることがわかります。これは事実ではありません。表示をよりわかりやすくするために、Wireshark は Relative SeqNum (相対シーケンス番号) を使用します。右クリック メニューのプロトコル設定でこれをキャンセルするだけで、「Absolute SeqNum」が表示されます。 TCP再送メカニズム TCP はすべてのデータ パケットが到着できることを保証する必要があるため、再送信メカニズムが必要です。 受信者から送信者への Ack 確認では、最後の連続パケットのみを確認することに注意してください。たとえば、送信者は 1、2、3、4、5 の合計 5 つのデータ パケットを送信しました。受信者は 1 と 2 を受信したため、ack 3 を返信し、次に 4 を受信しました (この時点では 3 は受信されていないことに注意してください)。このとき、TCP は何をするでしょうか。前述のように、SeqNum と Ack はバイト単位であるため、ack の場合は確認にジャンプできず、比較的大きな連続パケットのみを確認できることを知っておく必要があります。そうしないと、送信者は以前のパケットがすべて受信されたと見なします。 タイムアウト再送信メカニズム 1 つは、ACK で応答せずに 3 を待つことです。送信者は、タイムアウト後に 3 の ACK を受信できないことが判明すると、3 を再送信します。受信側は 3 を受信すると、4 を返します。つまり、3 と 4 の両方が受信されたことになります。 しかし、この方法にはさらに深刻な問題があります。それは、3 を待たなければならないため、4 と 5 が受信されたとしても、送信者は何が起こったのか分からないということです。Ack が受信されなかったため、送信者は悲観的に失われたと信じ、4 と 5 が再送される可能性があります。 これには 2 つのオプションがあります。
どちらのアプローチにも長所と短所があります。 1 つは帯域幅を節約しますが遅くなります。2 つ目は高速ですが帯域幅を浪費し、無駄になる可能性もあります。しかし全体的には良くありません。全員がタイムアウトを待っているため、タイムアウトが非常に長くなる可能性があります (次の記事では、TCP がタイムアウトを動的に計算する方法について説明します)。 高速再送信メカニズム そのため、TCP は時間駆動ではなくデータ駆動の再送信である Fast Retransmit と呼ばれるアルゴリズムを導入しました。つまり、パケットが連続して到着しない場合は、最後に失われた可能性のあるパケットが ACK されます。送信者が同じ ACK を 3 回連続して受信した場合、再送信が行われます。高速再送信の利点は、再送信前にタイムアウトを待つ必要がないことです。 たとえば、送信者が 1、2、3、4、5 個のデータを送信し、最初に 1 個が到着すると、2 に ack が返されます。しかし、何らかの理由で 2 が受信されず、3 が到着したため、再び 2 に ack が返されます。その後、4 と 5 が到着しますが、2 が受信されていないため、やはり 2 に ack が返されます。したがって、送信者は ack=2 の確認を 3 回受信し、2 がまだ到着していないことを認識し、すぐに 2 を再送信します。次に、受信側は 2 を受信します。この時点で、3、4、5 がすべて受信されているため、6 を返します。概略図は以下のとおりです。 高速再送信は、タイムアウトの問題だけを解決します。以前のものを再送信するか、すべての問題を再送信するかという難しい選択が依然として残っています。上記の例では、#2 を再送信するべきでしょうか、それとも #2、#3、#4、#5 を再送信するべきでしょうか。これは、送信者がこれらの 3 つの連続した ACK (2) を誰が送信したかわからないためです。送信者は、#6、#10、#20 から 20 個のデータを送信した可能性があります。この方法では、送信者は 2 から 20 までデータを再送信する可能性があります (これは一部の TCP の実際の実装です)。これは諸刃の剣であることがわかります。 SACK法 もう 1 つのより良い方法は、選択的確認応答 (SACK) と呼ばれます (RFC 2018 を参照)。この方法では、TCP ヘッダーに SACK を追加する必要があります。ACK は依然として高速再送信の ACK であり、SACK は受信したデータ フラグメントを報告します。下の図を参照してください。 このようにして、送信側は返された SACK に基づいて、どのデータが到着し、どのデータが到着しなかったかを知ることができます。そのため、高速再送信アルゴリズムが最適化されました。もちろん、この合意には双方の支持が必要です。 Linux では、この機能は tcp_sack パラメータを介して有効にできます (Linux 2.4 以降ではデフォルトで有効になっています)。 ここで注意する必要があるもう 1 つの問題は、受信側の契約破棄です。いわゆる契約破棄とは、送信者に報告された SACK 内のデータを受信側が破棄する権利を持つことを意味します。これは問題を複雑にするため推奨されませんが、メモリを他のより重要なものに渡すなど、受信者がこれを行う極端なケースもあるかもしれません。したがって、送信側は SACK に完全に依存することはできず、ACK に依存してタイムアウトを維持する必要があります。後続の ACK が増加しない場合は、SACK を再送信する必要があります。さらに、受信側は SACK パケットを Ack としてマークすることはできません。 注意: SACK は送信者のリソースを消費します。ハッカーが大量の SACK オプションをデータ送信者に送信すると、送信者は再送信を開始したり、送信済みのデータを走査したりすることになり、送信者のリソースが大量に消費されます。詳細については、「TCP SACK のパフォーマンスのトレードオフ」を参照してください。 重複SACK – 重複データを受信した問題 重複 SACK は D-SACK とも呼ばれ、主に SACK を使用して、繰り返し受信されたデータを送信者に通知します。詳細な説明と例は RFC-2883 に記載されています。以下にいくつかの例を示します (RFC-2883 より): D-SACK は SACK の最初のセグメントをマーカーとして使用します。
例1: ACKパケット損失 以下の例では、2 つの ACK が失われたため、送信者は最初のデータ パケット (3000-3499) を再送信します。受信側は重複を受信したことに気づき、SACK=3000-3500 を返します。ACK が 4000 に到達したため、4000 より前のすべてのデータが受信されたことを意味し、この SACK は D-SACK です。これは、送信者に重複データを受信したことを伝えることを目的としており、送信者もデータ パケットは失われなかったが、ACK パケットが失われたことを認識しています。
例2: ネットワーク遅延 以下の例では、ネットワーク パケット (1000-1499) がネットワークによって遅延され、送信者が ACK を受信できませんでした。後から到着した 3 つのパケットによって「高速再送信アルゴリズム」がトリガーされたため、再送信されました。ただし、再送信中に遅延パケットが再度到着したため、SACK=1000-1500 が返されました。ACK が 3000 に達したため、この SACK は D-SACK であり、重複パケットが受信されたことを示します。 この場合、送信者は、「高速再送信アルゴリズム」によってトリガーされた再送信が、送信されたパケットの損失または応答 ACK パケットの損失によって発生したのではなく、ネットワークの遅延によって発生したことを認識します。
D-SACK の導入には次のような利点があることがわかります。 1) 送信者は、送信したパケットが失われたか、返された ACK パケットが失われたかを知ることができます。 2) タイムアウトが短すぎて再送信が発生していませんか? 3) 最初に送信されたパケットがネットワーク上で後から到着する状況(並べ替えとも呼ばれる) 4) データ パケットはネットワーク上でコピーされていますか? これらのことを知ることで、TCP はネットワークの状況を理解し、ネットワーク上でより適切にフロー制御を実行できるようになります。 この機能を有効にするには、Linux の tcp_dsack パラメータを使用します (Linux 2.4 以降ではデフォルトで有効になっています)。 |
<<: 実践 | 人工知能が小売体験を向上させる 20 の例
>>: 自動運転の運転手が死亡事故で無罪となった。将来のAIの世界はより良くなるだろうか?
[[354709]]みなさんこんにちは。今日もディープラーニングについてお話していきましょう。クラ...
李静さん(仮名)は、団地内の自分のアパートのドアを開けることができなくなった。ドアには「顔認識」装置...
AIとIoTをロボットシステムに統合することで、その応用範囲が大幅に拡大すると期待されています。市場...
仕事以外では、私はほとんどの時間を2つの状態で過ごしています。1つは見出しを閲覧している状態で、もう...
[[422086]]過去数年間で、Transformer は NLP 分野全体をほぼ支配し、コンピ...
導入この共有では、ChatGPTテクノロジー製品の実装についてお話ししたいと思います。技術アーキテク...
[[227817]]画像出典: Visual Chinaカンニングは間違いなく長い歴史を持つ「科学...
この記事は公開アカウント「Reading Core Technique」(ID: AI_Discov...
消費財ブランドにとって、製品の売上を増やすことが仕事の中心となります。しかし、電子商取引が普及してい...
本日、OpenAI は立て続けにツイートを数回送信し、「準備フレームワーク」を大々的に発表しました。...