18.6 TCP状態遷移ダイアグラム

18.6 TCP状態遷移ダイアグラム
1
18.6 TCP状態遷移ダイアグラム
正当だが、バークレー系では
サポートされていない
同時オープンでない場合は正当
(クライアントからリセットを受け取った場合) 2
2MSL待ち状態
最大セグメント寿命 (MSL)
ネットワーク上でセグメントが破棄され
るまでに存在できる最大の時間量
RFC793では2分だが、実際には30秒・1分・2分など多様
アクティブクローズ実行後は TIME_WAIT でMSL2回分待機する
*  最後のACKが消失した場合でも再度ACKを送れる
*  同一ポート番号の新しいコネクションへの古いセグメントの紛れ込みを防ぐ
3
2MSL待ち状態
通常はクライアント側の話なので問題ないが、サーバ側だとポートがAlready in
useとなる
SO_REUSEADDRオプションでポート番号の再利用はできるが、
ソケットペアが2MSL待ちにあるとアクティブ・オープンでエラーとなる
バークレー系実装では、ソケットペアが2MSL待ち状態でも他のホストからの
接続だとエラーにならない
前のコネクションの最終シーケンス番号より大きいシーケンス番号による接続は受
け入れる
4
沈黙時間・FIN_WAIT_2状態
ホストのクラッシュ時にはMSL時間以内に新しいコネクションを確立してしまう
可能性が考えられる
RFC793ではホストの再起動後MSLの間はTCPコネクションを確立しないように
定められている
殆どの場合はMSLの時間より再起動にかかる時間のほうが長い
ハーフ・クローズでない場合はFIN_WAIT_2で相手からのFINを待つ
相手からのFINがなければ永遠にFIN_WAIT_2にとどまり得る
バークレー系実装では、完全なクローズを行う場合はタイマーをセットして強制
クローズを行う
5
18.7 リセット・セグメント
ソケットに対して正しくないセグメントが到着した時に送られる
宛先ポートにプロセスが待機していない場合
UDPにおけるICMPポート到達不可の代わりにリセットが用いられる
シーケンス番号は0
確認応答番号は ( 受信ISN + セグメントのデータ・バイト数 )
6
コネクションを中断する
ハーフ・オープン・コネクションを検知する
正規リリース
FIN送る通常のコネクション終了
中断リリース
リセットを送ってコネクションを中断する場合
リセットセグメントは他方のエンドから何の応答も引き出さない
ハーフ・オープン
一方のエンドが他方のエンドに知らせずに終了・中断した場合
データの転送が行われない限りクラッシュは検知されない
クラッシュしたホストが再起動されている場合はコネクションが確立されていな
いため、次に送られたセグメントに対してリセットで応える
7
18.8 同時オープン
2つのアプリケーションが同時にアクティブ・オープンを実行する場合
各エンドは双方のエンドに対してウェルノウンポートを持つ必要がある
双方がクライアントであると同時にサーバーとしても機能している
8
同時クローズ
双方のエンドからアクティブ・クローズを行う場合
9
18.10 TCPオプション
オリジナルのTCP仕様で定義
NOPは4バイト境界にするた
めのパッドとして用いられる
10
TCPサーバー設計
TCPサーバでは並行処理を行うためにさまざまなテクニックがある
*  fork関数を用いて新しいプロセスを生成する
*  スレッドを用いる
サーバは同じポート上でTCPコネクションを受け付けることができるが、クライ
アントが複数接続を保つ場合はエフェメラルポートを使用する
UDPでは外部IPアドレス・外部ポートを指定できた
TCPでも外部ソケットを指定することはできるが、殆どのAPIがその方法を提
供していない
11