18.6 tcp状態遷移ダイアグラム - labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6...

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

Upload: others

Post on 11-Jun-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

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

1

Page 2: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

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

2 正当だが、バークレー系ではサポートされていない

同時オープンでない場合は正当(クライアントからリセットを受け取った場合)

Page 3: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

2MSL待ち状態

3

最大セグメント寿命 (MSL)

ネットワーク上でセグメントが破棄されるまでに存在できる最大の時間量

RFC793では2分だが、実際には30秒・1分・2分など多様

アクティブクローズ実行後は TIME_WAIT でMSL2回分待機する

*  最後のACKが消失した場合でも再度ACKを送れる*  同一ポート番号の新しいコネクションへの古いセグメントの紛れ込みを防ぐ

Page 4: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

2MSL待ち状態

4

通常はクライアント側の話なので問題ないが、サーバ側だとポートがAlready in useとなる

SO_REUSEADDRオプションでポート番号の再利用はできるが、ソケットペアが2MSL待ちにあるとアクティブ・オープンでエラーとなる

バークレー系実装では、ソケットペアが2MSL待ち状態でも他のホストからの接続だとエラーにならない

前のコネクションの最終シーケンス番号より大きいシーケンス番号による接続は受け入れる

Page 5: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

沈黙時間・FIN_WAIT_2状態

5

ハーフ・クローズでない場合はFIN_WAIT_2で相手からのFINを待つ

相手からのFINがなければ永遠にFIN_WAIT_2にとどまり得る

バークレー系実装では、完全なクローズを行う場合はタイマーをセットして強制クローズを行う

ホストのクラッシュ時にはMSL時間以内に新しいコネクションを確立してしまう可能性が考えられる

RFC793ではホストの再起動後MSLの間はTCPコネクションを確立しないように定められている

殆どの場合はMSLの時間より再起動にかかる時間のほうが長い

Page 6: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

18.7 リセット・セグメント

6

ソケットに対して正しくないセグメントが到着した時に送られる

宛先ポートにプロセスが待機していない場合

UDPにおけるICMPポート到達不可の代わりにリセットが用いられる

シーケンス番号は0確認応答番号は ( 受信ISN + セグメントのデータ・バイト数 )

Page 7: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

コネクションを中断する�ハーフ・オープン・コネクションを検知する

7

正規リリース

FIN送る通常のコネクション終了

中断リリース

リセットを送ってコネクションを中断する場合

リセットセグメントは他方のエンドから何の応答も引き出さない

一方のエンドが他方のエンドに知らせずに終了・中断した場合データの転送が行われない限りクラッシュは検知されない

ハーフ・オープン

クラッシュしたホストが再起動されている場合はコネクションが確立されていないため、次に送られたセグメントに対してリセットで応える

Page 8: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

18.8 同時オープン

8

2つのアプリケーションが同時にアクティブ・オープンを実行する場合

各エンドは双方のエンドに対してウェルノウンポートを持つ必要がある

双方がクライアントであると同時にサーバーとしても機能している

Page 9: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

同時クローズ

9

双方のエンドからアクティブ・クローズを行う場合

Page 10: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

18.10 TCPオプション

10

オリジナルのTCP仕様で定義

NOPは4バイト境界にするためのパッドとして用いられる

Page 11: 18.6 TCP状態遷移ダイアグラム - Labweb.sfc.wide.ad.jp/~demmy/vol1/chapter18.pdf18.6 TCP状態遷移ダイアグラム 2 正当だが、バークレー系では サポートされていない

TCPサーバー設計

11

TCPサーバでは並行処理を行うためにさまざまなテクニックがある

*  fork関数を用いて新しいプロセスを生成する* スレッドを用いる

サーバは同じポート上でTCPコネクションを受け付けることができるが、クライアントが複数接続を保つ場合はエフェメラルポートを使用する

UDPでは外部IPアドレス・外部ポートを指定できたTCPでも外部ソケットを指定することはできるが、殆どのAPIがその方法を提供していない