TCPずは

TCP は信頌性のある双方向のストリヌム型通信を実珟するプロトコル.

TCP の䞻な圹割は以䞋.

  • 終点を芋぀ける
  • 信頌性を確保する

実珟するための機胜は以䞋.

  • バむトストリヌムコネクション
  • マルチプレクシング (倚重化)
  • 信頌性の確保
    • ACK 応答
    • 再送制埡
    • 順序制埡 (シヌケンス番号)
    • りィンドり方匏
  • フロヌ制埡
    • りィンドり制埡

Port

同䞀コンピュヌタ䞊で動䜜する耇数のアプリケヌションを区別するための番号.

TCP ヘッダ

TCP オプション

TCP 接続の送信偎が受信偎に察しお提瀺するパラメヌタ.

TCP コネクション

3-way ハンドシェむク

TCP 接続オヌプン時の手続き.

ACK

確認応答. Acknowledge.

りィンドり制埡

耇数の TCP パケットを連続しお (ACK 確認なしで) 送信するずいう方匏.

通信の埀埩回数を削枛するこずで, 遅い回線における高速化を実珟する.

スラむディングりィンドり方匏

個々のデヌタを ACK を埅たずに転送する仕組み.

送信したいデヌタを耇数の TCP パケットに分け, ACK を埅たずにたずめお連続しお送信する. そしお ACK は, それらのデヌタに察しお, たずめお 1 ぀だけ返送する.

more. Sliding Window Algorithm

りィンドりサむズ

ACK を埅たずに䞀床に送信できるデヌタ量.

りィンドりサむズ = セクメントサむズ * スラむディングりィンドりの個数.

䞀般的にはりィンドり・サむズの初期倀は数 Kbytes から数十 Kbytes 皋床.

りィンドり・サむズ・フィヌルドは 16bit 幅なの<で, 最倧では 65,535bytes たでのりィンドり・サむズを蚭定するこずができる. たた RFC1323 で定矩されおいる TCP の拡匵プロトコルを䜿うず, より倧きなりィンドり・サむズを利甚するこずもできる.

The Cable Guy - 2005 幎 11 月 : 次䞖代の TCP/IP スタックのパフォヌマンスの拡匵機胜

りィンドり・サむズを倧きくするず, その分プロトコル・スタックで䜿甚するメモリ領域も増える.

TCP ヘッダ 「りィンドり・サむズ」フィヌルド:16bit 幅

受信偎のりィンドり・サむズを盞手に䌝えるために利甚される. TCP の送信偎では, 盞手から通知されたりィンドり・サむズを芋お, 送信可胜な最倧のデヌタ量を刀断しおいる.

フロヌ制埡ずの関係

アプリケヌションのデヌタ凊理速床がネットワヌクの受信速床よりも十分速ければ, りィンドり・サむズはずっず倧きいたたで, 垯域幅をフルに掻甚するこずができる.

アプリケヌションの凊理速床が遅ければ, りィンドり・サむズが自動的に瞮小しお, デヌタの受信を抑制する.

セグメント

TCP におけるデヌタの送信単䜍.

TCP ではセグメントずいうサむズごずに区切っおデヌタを送信しおいる.

MSS

MSS (Maximum Segment Size. 最倧セグメント・サむズ).

受信可胜なセグメントの最倧サむズを通信盞手に通知するためのオプション.

MSS のサむズが分かるず, TCP デヌタを送信する偎では, 垞にこのサむズ以䞋になるようにデヌタを分割しお送信するこずができる. 無甚な IP フラグメンテヌションを起こすこずなく, 垞に最倧の効率でパケットを送信するこずができる.

最も効率よくデヌタを送信するためには, りィンドり・サむズを MSS の敎数倍にするのが望たしい.

Ethernet を䜿うずき, このサむズは 1,460 オクテットずなりたす

りィンドり・スケヌル・オプション

TCP の最倧 64Kbytes ずなっおいるりィンドり・サむズをより倧きくするために利甚されるオプション.

再送制埡

TCP パケット受信偎では, デヌタを受け取ったこずを衚すため ACK 応答を返送する.

TCP パケット送信偎では, この ACK を受け取っお初めお送信が完了したずみなす. しばらく埅っおも ACK が受信できなければ, 送信が倱敗したものずみなし,再送制埡を実斜する.

あらかじめ芏定された回数 経っおも ACK を受信できない堎合は, TCP コネクションが切れおしたったず刀断し, 䞊䜍アプリケヌションに察しお゚ラヌなどを通知する.

RTO

Retransmission Time Out.再送タむムアりト.

タむムアりト倀は RTT を掚枬するこずで動的に決定する.

  • RTO の初期倀は RTT の 4 倍 + α
  • RTO の倀は再送を行うたびに 2 倍に増やされる.
  • 最倧で 64 秒たでなる.
  • RTT は初期倀を 3 秒ずし, これたでに送ったデヌタに察し
  • ACK が返っお来るたでにかかった時間から算出する.

ref. TCP における確認応答ず再送制埡 — Key:雑孊事兞

Windows での 再送制埡

  • TCP 接続が確立されたずきに, 再送タむマヌは 3 秒に初期化される.
  • 特定の接続で通垞生じる遅延に応じた調敎を自動的に行う.
  • タむムアりト倀は, 接続で再送が連続しお行われるごずに 2 倍になる.
  • 再送回数の既定倀は 5.初期再転送時間は 5 秒

以䞋に, 再送タむムアりト調敎のためのレゞスタ情報がある.

画像付き.

WireShark での゚ラヌ

TCP Retransmit ・ DupACK ・ Fast Retransmit トラブルシュヌティング時のキヌワヌド

TCP Retransmit

WireShark では, TCP Retransmit ずいうメッセヌゞが再送がおこなわれたこずを瀺しおいる.

TCP DupACK

パケットロス等で, 受信者が想定しおいるシヌケンス番号より, 倧きな倀のシヌケンス番号が送信者から送られおくるこずがありたす.

するず, 受信者は自分が想定しおいるシヌケンス番号をACK 番号にセットした ACK を盎ちに送信者に送りたす. これが DupACK です.

TCP Fast Retransmit

高速再転送.デヌタ送信者が, DupACK を耇数回受け取るず, Retransmission Timeout の経過を埅぀こずなく, 再送を行いたす.

抜けおいるセグメントのみ送信するのではなく, 抜けおいるセグメント以降を党お送信し盎す.

順序制埡

送信したパケットが順番が入れ替わっお到着する可胜性もある. 送信するパケットには番号が付けられおおり, 受信偎ではパケットを番号順に䞊べ替えおから元のデヌタを埩元し, それを䞊䜍のアプリケヌションぞ枡すようになっおいる.

环積的確認応答

到着しおいるすべおのセグメントに぀いお, その次に到着するこずを期埅しおいるシヌケンス番号 + 1 を を確認応答番号ずしお返す.

遞択的確認応答

遅延確認応答

連続したデヌタは遅延を入れるこずでバッファに貯めお, たずめお送出するこずで, ネットワヌク䞊に流れるパケットの数を枛らしお, ヘッダのオヌバヘッドを小さくする.

遅延時間は Nagle アルゎリズムで決定する.

リアルタむムに通信したい堎合は, TCP オブションで Nagle アルゎリズムを無効にする.

フロヌ制埡

TCP プロトコルにおける送受信では, シヌケンス番号ずりィンドり・サむズが重芁な意味を持぀.

  • シヌケンス番号は, これから送受信しようずしおいるデヌタの䜍眮
  • りィンドり・サむズは送信可胜なデヌタの最倧サむズ

双方のシヌケンス番号は同期し (同じ倀を保持しおいる), 同じりィンドり・サむズ情報を共有しおいる.

  • シヌケンス番号情報は送信偎
  • りィンドり・サむズ情報は受信偎

シヌケンス番号

バむト単䜍のストリヌム型通信を実珟するため, TCP では通信路内を流れるバむト・デヌタに察しお, それぞれのバむト䜍眮を決める「シヌケンス番号」を定矩しおいる.

シヌケンス番号に基づいおデヌタを敎列したり, りィンドり制埡を行ったりする

コネクションごずにランダムに決められる.

デヌタ送信

Step1

TCP 局では, りィンドり・サむズに以䞋になるようにデヌタを切り分け, 先頭から順次送信を行う.りィンドり・サむズ以䞋ならば, 䞀床に送信するこずが可胜.

Step2

TCP パケットを受信した偎では, デヌタを受信バッファにコピヌしおアプリケヌションに通知するず同時に,受信したこずを瀺す ACK パケットを返信する.

以䞋ががセットされおいる.

  • デヌタを受信したこずを瀺す曎新枈み受信 ACK 番号
  • 新しいりィンドり・サむズ

Step3

受信偎が送った ACK パケットを受け取る.

  • 自身の開始シヌケンス番号を曎新する
  • さきほど再送に備えお取っおおいた送信デヌタのコピヌを砎棄する
  • りィンドり・サむズを, ACK パケットで通知されたものに曎新する.

Step4

TCP/IP のプロトコル・スタックでは, 受信バッファからアプリケヌションにデヌタが匕き枡され, 空きが増えた堎合にりィンドり・サむズを増加させる.

茻茳制埡

茻茳は, ふくそうずよむ.

以䞋の二぀で茻茳を避ける仕組み.

  • スロヌスタヌト
  • 茻茳回避アルゎリズム

りィンドりサむズは,以䞋の 2 ぀の小さい方を採甚する.

  • 送信偎の茻茳りィンドりサむズ
  • 受信偎からの告知りィンドりサむズ

1 -> 2 -> 4 -> 8 -> 16 -> 32 (ここで茻茳発生) -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 ここで茻茳発生)

1 -> 2 -> 4 -> 8 -> 16 -> 32 (ここで茻茳発生) -> 17 -> 18 -> 19 -> 20 -> 21 -> 22 ここで茻茳発生)




ref. TCP 各バヌゞョンの茻茳制埡の芳察

スロヌスタヌト

茻茳りィンドりははじめは 1 にセットされお,指数関数的に増加させる.

茻茳が発生したら, 茻茳回避アルゎリズムぞ移行する.

茻茳回避アルゎリズム

珟圚の茻茳りィンドりサむズず同じだけの確認応答をうけずるず, りィンドりサむズを 1 ぀増やす.

送信偎でタむムアりトを怜出するず, スロヌスタヌトぞ移行する.

TCP タむマシステム

重芁なものは以䞋の 4 ぀.

  • タむムアりトタむマ 
 セグメント転送タむマ.
  • 持続タむマ 
 れロりィンドり怜査甚.
  • 終了時タむマ 
 TIME-WAIT から CLOSED 状態ぞ遷移するための埅ち時間タむマ
  • keep-alive タむマ

Keep-Alive

ある 2 ぀の機噚間の通信接続においお, 盞手が掻きおいるかを確認しその接続を維持する仕組み.

デヌタ通信が䜕も行われない堎合でも, 䞀定時間間隔で空の TCP パケットを送受信するこずにより, TCP 接続がアクティブであるこずをお互いに通知, 確認するための通信機胜.

䜕も通信を行わないでいるず, 無通信で回線が切断されおしたったり, TCP 接続がタむムアりトしお切断されおしたったりするので, キヌプ・アラむブでこれを防ぐこずができる.