コンテンツにスキップ
3 ウェイハンドシェイクで双方が確かめているのは何か。

互いの初期シーケンス番号。双方が自分の初期シーケンス番号を送り、相手からその確認応答を受け取ることで 同期が成立する。

フロー制御と輻輳制御はどう違うか。

フロー制御では、送信側は受信側が広告するウィンドウ(rwnd)に従う。 輻輳制御では、送信側が推定する輻輳ウィンドウ(cwnd)を使う。 送信側は両者の小さい方に従う。

TCP はコネクションを確立してから通信し、シーケンス番号・累積確認応答・再送によって配送と順序を保証するトランスポート層プロトコルである。

sequenceDiagram
    participant C as ホスト A
    participant S as ホスト B
    C->>S: SEQ=X, CTL=SYN
    S->>C: SEQ=Y, ACK=X+1, CTL=SYN,ACK
    C->>S: SEQ=X+1, ACK=Y+1, CTL=ACK
    Note over C,S: 双方が初期シーケンス番号を送り、<br/>その確認応答を受け取って同期が完了する

TCP は通信に先立ってコネクションを確立する。RFC 9293 は、この同期が 「双方が自分の初期シーケンス番号を送り、相手からその確認応答を受け取る」ことを必要とすると述べている。 上の図の 3 つのセグメントがそのやり取りにあたる。

データについては、TCP コネクション上で送られるすべてのオクテットにシーケンス番号が付く。 確認応答は累積的で、シーケンス番号 X の確認応答は「X を含まない、そこまでのすべてのオクテットを受け取った」 ことを示す。届かなかった分は再送され、これによって全セグメントの配送が確保される。

送れる量は 2 つのウィンドウで抑えられる。cwnd は「TCP が送れるデータ量を制限する状態変数」で、 rwnd は「直近に広告された受信ウィンドウ」である。RFC 5681 は、送信側が 「確認済みの最大シーケンス番号に cwnd と rwnd の小さい方を足した値」より大きなシーケンス番号のデータを 送ってはならないと定めている。

輻輳への対処として RFC 5681 は、スロースタート(slow start)、輻輳回避(congestion avoidance)、 ファストリトランスミット(fast retransmit)、ファストリカバリ(fast recovery)の 4 つのアルゴリズムを規定する。 ファストリトランスミットは、重複した確認応答を 3 つ受け取った時点ですぐに再送する。

ヘッダはオプションを除いて 20 オクテットである。

UDP との違い

観点TCP(このノート)UDP
接続コネクション型コネクションレス
通信開始前のやり取り3 ウェイハンドシェイクが要る不要
配送と順序の保証ありなし