サーバーはLISTENとACCEPTプリミティブでコネクションの要求を待つ
三方向ハンドシェイクを使ってコネクションを確立する。コネクション確立のために、サーバーはLISTENとACCEPTプリミティブを使って受動的にコネクション要求を待つ。このとき、特定の送信元を指定することもできる。
クライアントがCONNECTプリミティブで諸情報を含ませてサーバーに送る
もう一方の端、つまりクライアントは、CONNECTプリミティブを実行し、接続先のIPアドレスとポート、受信できる最大のTCPセグメント・サイズ(もしあれば)ユーザー・データ(例えばパスワード)を指定する。CONNECTプリミティブはSYNビットをオンにしたTCPセグメントを送り、応答を待つ。
CONNECTプリミティブが届くと目的のプロセスがlisten状態かを調べる
このセグメントが宛先に到着すると、宛先のTCPエンティティは宛先ポート・フィールドに指定されたポートでlistenしているプロセスが存在するかを調べる。なければ、RSTビットをオンにした応答を送り、コネクションの確立を拒否する。
listen状態ならば確認通知を送る
あるセグメントがそのポートでlistenしている場合、そのプロセスは入力TCPセグメントを受け取り、そのコネクションを受理するか拒否するか決定する。受理する場合、確認通知を送り返す。TCPセグメントの通常のシーケンスを図6−37(a)に示す。SYNセグメントは1バイトの順序番号スペースを用いているので、あいまいなく確認通知されることに注意されたい。
二つのソケットで同時にコネクションができる
二つのホストが同じ二つのソケットの間で同時にコネクションはエンド・ポイントで識別されるので、結果として一つのコネクションだけが確立される。両者とも(x,y)で識別されるコネクションであるから、一つのテーブル・エントリ(x,y)だけが作成される。
SYNセグメントをたくさん記憶しなきゃいけなくなる攻撃 SYNフラッド
3方向ハンドシェイク実装の弱点は、リスニング状態のプロセスは、それ
自身のSYNセグメントを返信するとその順序番号を記憶しなければならない
点にある。その性質を使って、悪意のある送信者がSYNセグメントを次から次へと送り、その後何もせずにコネクションを完了させないようにして、ホストのリソースを使い切ることができる。この攻撃はSYNフラッド(SYN flood)
と呼ばれ、1990年代のWebサーバー攻撃に用いられた。現在では、この攻撃への防御方法はいくつか知られている。
SYNフラッドを防御するSYNクッキー
この攻撃に対処する一つの方法は、
SYNクッキー(SYN cookies)
である。ホストは、順序番号を記憶することなく、ある暗号的な関数によって生成された順序番号を選び、SYNセグメントに入れて送り、その番号を忘れる。三方向ハンドシェイクが完了すると、この順序番号+1がホストに返される。この時、ホストは、正しい順序番号を同じ暗号生成関数で再度計算する。ただし、この計算の入力がわかっている限り、正しい結果を得る。この手順によってホストは、順序番号(sequence number)を別々に記憶する必要なしにACK順序番号が正しいことを確認できる。
感想
- SYNクッキーの内容は理解できなかった。
- SYNとは?