TCPプロトコルとデータ構造

特徴

接続指向: 通信当事者はデータを交換する前に接続を確立する必要がある
信頼性: 信頼性を確保するための複数のメカニズム

重要な用語の説明

バイトストリームサービス:8ビット(1Byte)を最小単位とするバイト
ストリーム ソケットアドレス:

  1. TCP は、最も基本的な抽象概念として (単なる「ポート」ではなく) 「接続」を使用し、同時に TCP 接続のエンドポイントをソケット (ソケット)、またはソケット、ソケット インターフェイスとして参照します。
  2. ソケット、ポート、IP アドレス セグメントの関係は次のとおりです。
    1. TCP の送信プロセスはデータをバイト ストリームの形式で転送し、受信プロセスも仮想のパイプラインと同様にデータをバイト ストリームとして受信します。
    2. UDP 送信プロセスのデータ パケットは独立しているため、UDP はフロー指向のプロトコルではありません。
    3. キャッシュ: データ フローの各方向に 2 種類のキャッシュがあり、1 つは送信キャッシュ、もう 1 つは受信キャッシュです。
    4. トランスポート層が IP 層にデータを送信するときは、バイト ストリームではなくパケット単位で送信する必要があります。TCP プロトコルでは、数バイトでパケットが形成されます。このようなパケットはセグメントと呼ばれます。セグメントは必ずしもすべてのセグメントである必要はありません。同じ長さでも、数バイトまたは数キロバイトになる可能性があります。
  3. バイト番号:
    1. バイト単位でのバイト数の定義範囲は、0~232-1、
    2. 番号付けメカニズム: ランダム
    3. 例: 乱数がちょうど 1057 で、6000 バイトが送信される場合、バイト番号の範囲は 1057 ~ 7056 になります。
  4. シリアルナンバー:
    1. TCP はバイトに基づいて各セグメントにシーケンス番号を割り当てます。
    2. 各メッセージセグメントのシリアル番号は、このメッセージセグメントの最初のバイトデータのシリアル番号です。
    3. 例: たとえば、TCP は 6000 バイトのファイルを送信する必要があります。最初のバイトの番号は 10001 です。データが 5 つのセグメントで送信される場合、最初の 4 つのセグメントはそれぞれ 1000 バイトのデータを伝送し、最後のセグメントは 2000 バイトのデータを伝送します。

第 1 バイト番号の範囲: 10001 ~ 11000
第 2 バイト番号の範囲: 11001 ~ 12000
第 3 バイト番号の範囲: 12001 ~ 13000
第 4 バイト番号の範囲: 13001 ~ 14000
第 5 バイト番号の範囲: 14001 ~ 16000

TCPプロトコル形式:

ここに画像の説明を挿入

Wireshark によってキャプチャされた TCP パケットの例は次のとおりです。

Transmission Control Protocol, Src Port: 59336, Dst Port: 443, Seq: 0, Len: 0
    Source Port: 59336
    Destination Port: 443
    [Stream index: 8]
    [Conversation completeness: Incomplete, DATA (15)]
    [TCP Segment Len: 0]
    Sequence Number: 0    (relative sequence number)
    Sequence Number (raw): 2876040241
    [Next Sequence Number: 1    (relative sequence number)]
    Acknowledgment Number: 0
    Acknowledgment number (raw): 0
    1000 .... = Header Length: 32 bytes (8)
    Flags: 0x002 (SYN)
        000. .... .... = Reserved: Not set
        ...0 .... .... = Nonce: Not set
        .... 0... .... = Congestion Window Reduced (CWR): Not set
        .... .0.. .... = ECN-Echo: Not set
        .... ..0. .... = Urgent: Not set
        .... ...0 .... = Acknowledgment: Not set
        .... .... 0... = Push: Not set
        .... .... .0.. = Reset: Not set
        .... .... ..1. = Syn: Set
        .... .... ...0 = Fin: Not set
        [TCP Flags: ··········S·]
    Window: 64240
    [Calculated window size: 64240]
    Checksum: 0x6f7a [unverified]
    [Checksum Status: Unverified]
    Urgent Pointer: 0
    Options: (12 bytes), Maximum segment size, No-Operation (NOP), Window scale, No-Operation (NOP), No-Operation (NOP), SACK permitted
        TCP Option - Maximum segment size: 1460 bytes
        TCP Option - No-Operation (NOP)
        TCP Option - Window scale: 8 (multiply by 256)
        TCP Option - No-Operation (NOP)
        TCP Option - No-Operation (NOP)
        TCP Option - SACK permitted
    [Timestamps]

具体的な意味は以下の通りです。

  • 送信元ポート: 16 ビット、ポート番号の範囲は 0 ~ 216-1。コンピュータ上のプロセスは、コンピュータ ポートを介して他のプロセスと通信する必要があります。コンピュータ ポートは一度に 1 つのプロセスのみによって占有されるため、送信元ポートを指定します。
  • 宛先ポート: 16 ビット、ポート番号の範囲は 0 ~ 216-1。コンピュータ上のプロセスは、コンピュータのポートを介して他のプロセスと通信する必要があり、対象のコンピュータが開いているポートを指定することで、対象のコンピュータの開いているポートと通信することができます。この例では 443 などです。
  • ストリームインデックス:Wireshark でパケットをキャプチャすることで、ip A ポート A と ip B ポート B に対応するインデックス値と src/dst 変換の値を表示できます。
  • シリアル番号: seq シリアル番号、32 ビット (4 バイト)。これは、TCP 送信元ポートから宛先ポートに送信されるバイト ストリームを識別するために使用され、イニシエーターがデータを送信するときにマークされます。TCP 接続で送信されるデータ ストリームの各バイトには、シーケンス番号が割り当てられます。シーケンス番号フィールドの値は、このメッセージ セグメントで送信されるデータの最初のバイトのシーケンス番号を指します。
  • 確認番号: ack シリアル番号、32 ビット。相手の次のセグメントを受信する予定のデータの最初のバイトのシーケンス番号です。ACK フラグが 1 の場合のみ、確認シーケンス番号フィールドは有効です (ack=seq+1)。
  • ヘッダー長: 4 ビット。TCP ヘッダーが合計で 4 バイト何バイトあるかを示します。ヘッダーの長さは 20 ~ 60 バイト (20 バイトの固定ヘッダー + 40 バイトのオプション部分) の間で指定できます。したがって、このフィールドの値は 5(5*4=20) ~ 15(15*4=60) の範囲になります。
  • 予約フィールド: 6 ビット、将来の使用のために予約されていますが、現時点では 0 に設定する必要があります。
  • フラグビット: 6 ビット、URG、ACK、PSH、RSH、SYN、FIN、具体的な意味は次のとおりです。
    1. URG: 緊急ポインタ ビット (URGent) URG=1 の場合、緊急ポインタ フィールドが有効であることを示します。これは、このセグメントに緊急データがあり、できるだけ早く送信する必要があることをシステムに伝えます (高優先度データに相当)。
    2. ACK: 確認ビット (ACKnowledge)、確認番号フィールドは ACK=1 の場合にのみ有効です。ACK=0 の場合、確認番号は無効です。
    3. PSH: プッシュ ビット (PuSH)。受信側 TCP は、プッシュ ビットが 1 に設定されたメッセージ セグメントを受信し、キャッシュ全体がいっぱいになるまで待って上方に配信するのではなく、できるだけ早く受信アプリケーション プロセスに配信します。
    4. RST: リセット ビット (ReSeT) RST=1 の場合、TCP 接続に重大なエラー (ホスト クラッシュやその他の理由によるものなど) があり、接続を解放する必要があり、その後トランスポート接続を解放する必要があることを示します。再確立する必要があります。一般に、接続要求の拒否、接続の異常終了、アイドル状態の接続の終了の 3 つの状況があります。
    5. SYN: 同期ビット (SYNchronous)。同期ビット SYN が 1 に設定されている場合、これは接続要求または接続受け入れメッセージであることを意味します。
    6. FIN: 接続を解放するために使用される終了ビット (FINal)。FIN=1 の場合、このメッセージセグメントの送信側のデータが送信されたことを示し、トランスポート接続を解放する必要があります。
    7. TCP は、TCP ヘッダー内の 3 つのフラグを使用して ECN をサポートします。最初のマークはランダムな合計 (Nonce Sum、NS と呼ばれる) で、TCP 送信者のパケット マークが誤ってまたは悪意を持って変更されるのを防ぐために使用されます。他の 2 つは、輻輳表示を返すため (つまり、送信者が送信する情報量を減らす必要があることを示すため)、および輻輳表示応答の受信を確認するために使用されます。これらは、ECN-Echo (ECE) ビットと Congestion Window Reduced (CWR) ビットです。TCP 接続での ECN の使用はオプションです。ECN を使用する場合は、SYN および SYN-ACK セグメントに適切なオプションを含めることにより、接続の確立時にネゴシエートする必要があります。TCP 接続上で ECN をネゴシエートした後、送信者は、接続上の TCP セグメントが IP パケット送信トラフィックを伝送することを示し、送信をサポートする ECN に ECT コード ポイントをマークします。これにより、ECN をサポートする中間ルータは、IP パケットをドロップする代わりに CE コードポイントでマークし、差し迫った輻輳を示すことができます。特定の *encountered ブロッキング コードポイントを受信すると、TCP 受信側は TCP ヘッダーの ECE フラグを使用してこのブロッキング指示を返します。エンドポイントが ECE ビットを持つ TCP セグメントを受信すると、パケットをドロップする代わりに輻輳ウィンドウを縮小します。次に、セグメントの CWR ビットを設定して輻輳表示を確認します。ノードは、CWR がセットされたセグメントを受信するまで、ECE ビットがセットされた TCP セグメントを送信し続けます。
  • ウィンドウサイズ: 8 ビット、ウィンドウフィールドは相手が送信するデータ量を制御するために使用され、単位はバイトです。TCP コネクションの 1 つのセグメントは、設定されたバッファ サイズに従って自身の受信ウィンドウ サイズを決定し、相手の送信ウィンドウの上限を決定するように相手に通知します。一部のパケット キャプチャ ツールでは、[ウィンドウ] と [計算されたウィンドウ サイズ] が異なることがわかりますが、このとき、[ウィンドウ サイズのスケーリング係数] の値に [ウィンドウ] の値を乗じて、計算されたウィンドウ サイズを取得できます。ウィンドウに伸縮機能があり、現在のウィンドウは比較的小さいですが、変更できることを示します。変化係数はウィンドウ サイズのスケーリング係数で、最大値は計算されたウィンドウ サイズです。例えば:
Window: 944
[Calculated window size: 30208]
[Window size scaling factor: 32]
  • チェックサム: 16 ビット、チェックサム フィールド チェックの範囲にはヘッダーとデータが含まれます。チェックサムを計算するときは、TCP セグメントの前に 12 バイトの疑似ヘッダー (IP アドレス) を追加する必要があります。
  • 緊急ポインタ: 16 ビット。緊急ポインタは、このメッセージ セグメント内の緊急データの最後のバイトのシーケンス番号を示します。
  • オプションフィールド: 可変長。TCP は、最大セグメント長 MSS (最大セグメント サイズ) というオプションを 1 つだけ指定します。MSS は相手側 TCP に、キャッシュが受信できるメッセージ セグメントのデータ フィールドの最大長は MSS バイトであることを伝えます。その最大長は、TCP ヘッダーの長さに基づいて計算できます。MSS は、TCP セグメント内のデータ フィールドの最大長です。データ フィールドに TCP ヘッダーを加えたものは、TCP セグメント全体に相当します。MSS=MTU-20(TCP ヘッダー)-20(IP ヘッダー)。一般に、イーサネットでは MTU のデフォルトは 1500 バイトなので、MSS=1460 バイトになります。

参考:https://zh.m.wikipedia.org/zh-hans/%E6%98%BE%E5%BC%8F%E6%8B%A5%E5%A1%9E%E9%80%9A%E7%9F%A5

おすすめ

転載: blog.csdn.net/zyy247796143/article/details/126853462