TCP はコネクション指向の、信頼性のあるバイト・ストリーム・サービスを 提供する。
「コネクション指向」とは、TCPを利用する2つのアプリケーション (一方がサーバで、他方がクライアントの場合が一般的)がデータを交換する前に、 相互にTCPコネクションを確立することである。
TCPコネクションでは、相互に通信する2箇所のエンドポイントが必ず存在する。 TCPは以下の方法で信頼性を保証する。
|<------------ IP Datagram ----------------->|
|<------- TCP Segment--------->|
+-------------+-------------+----------------+
| IP Header | TCP Header | TCP Data |
+-------------+-------------+----------------+
20bytes 20bytes
1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 (32bits width)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Port | Destination Port |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Acknowledgement Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Data | |U|A|P|R|S|F| |
| Offset| Reserved |R|C|S|S|Y|I| Window |
| | |G|K|H|T|N|N| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | Urgent Pointer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
( Options (if exists, max size=20bytes) )
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
| your data ... |
...
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
IP Address と port番号の組を、socket(ソケット)と呼ぶ。 TCPコネクションにおける2つのエンド・ポイントを socket pair (つまり、送信側のIP address とポート番号、 受信側のIP Addressとポート番号が含まれる)と呼ぶ。
TCPヘッダのオプションは、0バイト〜20バイトである。 よく使われるのが MSS (Maximum Segment Size, 最大セグメントサイズ) オプションで、コネクションの各エンドは交換する最初のパケット (SYNオプションのついたパケット)で指定する。 接続しているネットワークによって、一度に送ることのできる パケットサイズが異なるので、それを知らせるために行われる。
初期シーケンス番号は時間によって変化するため、各コネクションは異なる 初期シーケンス番号を持つ。
TCPヘッダのRSTは「リセット」の意味である。 一般に、ソケットペアに対して正しくないパケットが到着したとき、 リセットを送り返す。
使用されていないポート番号へのデータグラムTCPコネクションの双方のエンドは、通信の最初にそれぞれの 接続しているネットワークのMSS (Maximum Segument Size)を TCPヘッダのオプションで伝えるのが一般的である。 しかし、経路の途中にもっと小さなMTU (Maximum Transfer Unit,一度に送ることのできる最大のバイト数) のネットワークがあると、 そのネットワークのルータがIPパケットをフラグメント化 (もっと小さな単位に分割して送る)して送る必要がある。 これはルータの性能に悪影響を与えるので、 IPパケットを最初に送り出す側が、経路の最小のMTUを調べて それ以下のサイズでIPパケットを送るのが一般的になってきた。 (ちなみに、フラグメント化されたIPパケットは途中で組み立てられることはなく、 最終的なエンドで組み立てられる)。
最小MTU値を取得するには、パスMTUディスカバリ (経路MTU探索)を使う。 パケット分割を禁止した状態のパケットが、MTUがそれより小さい経路を通ると、 ICMP (Internet Control Message Protocol) エラーメッセージが 送った側に返される。 ICMPエラーメッセージには、エラーとなった回線のMTU値とヘッダー情報が 入っているので、MTU値を調整して再送信する。 宛先に届くまでこれを繰り返せば、経路中の最小のMTU値を見つけることができる。
外部からの攻撃から内部ネットワークを守るために、 一部のパケットだけを通すフィルタリングを行うことがある。
「外部のサーバにtcp接続することはできるが、外部から内部のサーバには 接続できない」ようにするには、 外部から内部へ送られるTCP接続開始パケット (SYNフラグがONで、ACKフラグがOFFになっている) をルータで捨てればよい。
外部からのアクセスにはセキュリティを厳格に適用するが、 内部からのアクセスにはセキュリティを甘く設定する例がよくある。 そのような状況を利用して侵入するために、 外部からIPヘッダのSource Addressを内部のIPアドレスに 偽装してIPパケットを送りつけることがある。
その際にTCPコネクションを確立するには、TCPシーケンス番号予測攻撃などを 併用する。
外部からのIPパケットなのにSource Addressが内部ネットワークの アドレスになっている場合は、そのパケットを捨てるなどの対策が必要となる。
DoS攻撃(Denial of Service Attack)とは、 攻撃対象のサービス提供を妨害することを目的として 大量のIPパケットを送りつけてくる攻撃である。