TCPとは、TCP/IPにおける、トランスポート層プロトコルの1つである。
TCPは信頼性のある通信を担保するのだが、それはどういう意味なのかというと、
というこれらの特性を併せ持つ。結果として、仕様は非常に大きなものになっている(UDPはわずか3ページなのに対し、TCPは初期の1974年版の段階で70ページ、現在のバージョンで98ページ)。あまりに巨大なので、簡単に仕様を説明していく。
TCPセグメントの中身は、以下の通り。
| 領域 | サイズ | 説明 | |
|---|---|---|---|
| 送信元ポート番号 | 16ビット | 送信元のポート番号 | |
| 送信先ポート番号 | 16ビット | 送信先のポート番号 | |
| シーケンス番号 | 32ビット | 送るデータの開始地点 | |
| 確認番号 | 32ビット | 次にほしいシーケンス番号。ACK=1の時のみ有効 | |
| TCPヘッダ長 | 4ビット | TCPヘッダの長さを32ビットで割ったもの | |
| フラグ | 予約済み | 4ビット | 将来の用途に予約されている 0を入れること なお、一番最後のビットはかつてはRFC3540でNSフラグになっていた |
| CWR | 1ビット | 輻輳制御ウィンドウ縮小 RFC3168で定められている |
|
| ECE | 1ビット | ECN-Echo RFC3168で定められている |
|
| URG | 1ビット | 緊急フラグ これが1の場合、緊急ポインタが有効である |
|
| ACK | 1ビット | 確認応答フラグ これが1の場合、確認番号が有効である TCP通信において、ここが1でないパターンは限定される |
|
| PSH | 1ビット | プッシュフラグ これが1の場合、速やかに上位層へ引き渡すよう要求される |
|
| RST | 1ビット | リセットフラグ 不正なセグメントを受け取った場合、ここを1にして接続を強制終了する |
|
| SYN | 1ビット | シーケンス番号同期 接続の開始時には、ここを1にする |
|
| FIN | 1ビット | 送信データ終了 これ以上データを送らないことを伝える |
|
| ウィンドウサイズ | 16ビット | ウィンドウサイズのオクテット数 ただし、ウィンドウスケールオプションを使った場合、ビットがシフトする 例えばここに32768と指定し、オプションで4と指定した場合、512KiBとなる |
|
| チェックサム | 16ビット | データが破損してないかチェックするフィールド 作り方に関しては割愛(ほぼUDPと同じ) |
|
| 緊急ポインタ | 16ビット | 緊急データの場所(シーケンス番号からのオフセット) URG=1の時のみ有効 |
|
| オプション | 可変長 | TCPの様々なオプション。最終的に32ビットの倍数になる | |
| ペイロード | 可変長 | 実際のデータ | |
まず、接続の状態には、以下のものがある。
状態遷移は、以下のようになっている。
これだけでもすでにおなかいっぱいになってる人も多いだろう。
この中で、CLOSED→SYN-SENT→ESTABLISHED、およびLISTEN→SYN-RECEIVED→ESTABLISHEDの一連の流れのことを、TCPの3ウェイハンドシェイクと呼ぶ。これは
という1往復半の流れから来ている。
まず、最初のSYN→ACK+SYN→ACKで、どのシーケンス番号から送信・受信するかの合意をとっている。その後、データを送信するが、どのシーケンス番号のデータかを送る。
なお、FINを送った後も、データがないACKは送ってもよいし、送らないとデータが受け取れたのか把握できないので送らないといけない。
例えば、このようになったらどうだろうか?
こうなったら、しばらく待ってから同じセグメントを送りなおす。
だが、いちいち送るたびに確認応答を待っているのでは時間の無駄である。まとめていくつかのセグメントを連続して送ってよいのだろうか?答えからいうと可能である。
1と2が到着順序が入れ替わってしまっているが、シーケンス番号でデータの順番はわかるので、正しい順序でデータの組み立てなおしができる。
でも、そんなに無秩序に送って大丈夫か?大丈夫だ、問題ない。
まず、ウィンドウサイズというフィールドがあるが、ここに、残りの空き容量が入っている。例えば2000あったとしたら、2000オクテットまではまとめて送って大丈夫だろうという判断になる(少なくとも受信側のバッファの問題はない)。
そんなこと言ってたらデータがボロボロ零れ落ちないか?という心配がある。ごもっとも。いくらデータをたくさんバッファできるからとたくさんまとめてデータを送ったら、回線輻輳で再送を余儀なくされることも出てくる。
なので、いきなりはたくさん連続して送ることはなく、スロースタートでどんどん増やしていく。再送が必要になったということは、まとめて送ってたら回線輻輳が起きているわけだから、まとめて送るデータ量を減らしてリトライする。
掲示板
掲示板に書き込みがありません。
急上昇ワード改
最終更新:2025/12/06(土) 07:00
最終更新:2025/12/06(土) 07:00
ウォッチリストに追加しました!
すでにウォッチリストに
入っています。
追加に失敗しました。
ほめた!
ほめるを取消しました。
ほめるに失敗しました。
ほめるの取消しに失敗しました。