Transmission Control Protocol
TCPにおけるポートは「ホスト内アドレス」である。
単一のホストでは複数のプロセス(≒ アプリケーション)が動作している。TCPはホスト内の"部屋番号"に相当するポート、ポートとインターネットアドレスの組み合わせであるソケット(英: socket)を定義し、このソケット-ソケット間で通信を行う。単一ホスト内に複数ポートが存在することで、単一のホスト上で複数のプロセスが同時にTCP通信できる(多重化)。各ポートはポート番号として知られるポート識別子が設定されており、プロセスとポートを結びつけることでそのプロセスへの通信を可能にする。ポート番号は16ビット符号なし整数 (0-65535) の範囲をもつ。
コネクション(英: connection)は一組のソケットで識別される論理的通信路である。すなわち「ソケット 172.16.0.0:1024 とソケット 192.168.0.0:80 を繋ぐ論理的通信路」といった形で識別されるものがコネクションである。受信したTCPセグメントは特定のコネクションに属すると識別される。
小口正人:「コンピュータネットワーク入門―TCP/IPプロトコル群とセキュリティ」、サイエンス社、ISBN 978-4781911663 (2007年5月)。
村公保:「基礎からわかるTCP/IP ネットワークコンピューティング入門 第3版」、オーム社、ISBN 978-4274050732(2015年2月26日)。
安永遼真、中山悠、丸田一輝:「TCP技術入門 ――進化を続ける基本プロトコル」、技術評論社、ISBN 978-4297106232(2019年7月6日)。
みやたひろし:「図解入門TCP/IP 仕組み・動作が見てわかる」、SBクリエイティブ、ISBN 978-4815604974(2020年12月22日)。
コネクションを確立する際、TCPでは3ウェイ・ハンドシェイクを行う。
クライアントがサーバと接続する前、サーバはコネクション可能なようにポートをバインドしておかなければならない。これをパッシブ・オープンと呼ぶ。サーバ側がパッシブ・オープンになっていれば、クライアントはアクティブ・オープンを開始できる。コネクションを確立するための3ウェイ・ハンドシェイクは次のようになる。
SYN: クライアントはサーバにSYNを送り、アクティブ・オープンを行う。クライアントはこの際に無作為な値Aを選び、SYNセグメントのシーケンス番号とする。
SYN-ACK: それに対してサーバはSYN+ACKを返す。確認応答番号は受信したSYNセグメントのシーケンス番号に1を加えたもの (A + 1) とし、SYN+ACK のシーケンス番号は別の無作為な値 B とする。
ACK: クライアントがサーバからの SYN+ACK に対して ACK を返す。その際のシーケンス番号は受信した SYN+ACK の確認応答番号 (A + 1) とし、確認応答番号は SYN+ACK のシーケンス番号に1を加えた値 (B + 1) とする。
この時点でクライアントとサーバ双方がコネクション確立の確認応答を受け取ったことになる。
TCPセッションを盗聴できパケットをリダイレクトできる攻撃者は、TCPコネクションを乗っ取ることができる。その場合、攻撃者は進行中の通信からシーケンス番号を読み取り、ストリームにおける次のセグメントを装った偽のセグメントを作る。そのような簡単な乗っ取りで、通信中の一方に1つのパケットを誤って受け取らせることができる。受け取ったホストが余分なセグメントへの確認応答をコネクションのもう一方に返すと、同期が失われる。ARPまたはルーティング攻撃を組合わせることで、乗っ取ったTCPコネクションの制御を完全に奪うことができる。
RFC 1948 が登場する以前は異なるIPアドレスを真似ることは難しくなく、初期シーケンス番号は容易に推測可能だった。そのため攻撃者はARP/ルーティング攻撃を併用することなく、適当な一連のパケットを受信者に送信し、異なるIPアドレスからのものだと信じさせることができた。その際、偽装したIPアドレスの本来のホストがダウンしていれば十分であり、Dos攻撃でそのホストをダウンさせればよかった。以上のような理由から、初期シーケンス番号のランダムな選択が行われるようになった。