■ コネクション
所謂、「コネ」という奴だな。
何がです?
コネクションだ。
あぁ。
就職とかで言われる「コネ」とは「コネクション」の事だ、と。
うむ。
不況の昨今、就職試験ではコネでポーカーをやりあって内定を決定するとかいう噂もあるとか。
ははぁ。
営業部長の3カードとかやるわけですね。
だがしかし、それではCEOのワンペアに負けるな。
ちなみに、政治家のカードも強いぞ。
ポーカーっていうより、トレーディングカードゲームですね、それじゃ。
で、今回はそういう話なんですか?
いやいや、そういうわけではない。今回はTCPの話だ。
TCPにはコネクションという言葉が付きまとう。
こねくしょん…。
前回も話したとおり、レイヤ4はアプリケーション間を接続する。
つまり、データの最終的なやり取りを行うわけだ。
エンドツーエンドでしたっけ。
うむ、レイヤ3以下では所詮コンピュータからコンピュータへ受け渡しするだけだからな。
この、アプリケーション間のやり取りを行うデータの道のことをコネクションという。
データの道?
そうだ。
レイヤ3以下は送りっぱなしであるし、ルーティングを行うので道はその時その場で違う可能性がある。決まった通信路を使うわけではない。
はぁ。
なので、TCPで作られる通信路は仮想的な通信路と呼ばれる。
事前に専用の通信路を確保しておくことによって、確実にデータを届けるのだよ。
でも、レイヤ3以下ではどの通信路を使うかは決まってないんですよね。
だから、「仮想的」なのだ。
実際は決まっていなくても、決まっているように見せかけるための制御を行うのだ。
[Figure39-01:仮想的な通信路]
なんか意味があるんですか?
先ほども言ったが、確実・効率よく伝える為だ。
通信路が不定、つまり相手までの道がわからない場合、もしかすると繋がっていないかもしれない。相手に届かない可能性もありうるし、何処かで詰まってる可能性もありうる。
確かにその可能性はありますよね。
なので、データ転送を始める前に事前に確認のやりとりを行っておく。
それにより、相手に確実に伝わることを確認するわけだ。
ははぁ。
電話の「もしもし?」みたいなものですか。
あぁ、それはなかなかいい考え方かもしれん。
「もしもし」で通信が確実にできる = 通信路が繋がった、と考えるわけだ。この仮想通信路を作り出すことを、コネクションの確立と言う。
こねくしょんを、確立する。
■ TCPヘッダ
そうだ。
どうやって確立するか、の話の前にTCPヘッダの説明をしよう。
送信元ポート番号(16) | 宛先ポート番号(16) | ||
シーケンス番号(32) | |||
確認応答番号(32) | |||
データオフセット(4) | 予約(6) | 制御ビット(6) | ウィンドウ(16) |
チェックサム(16) | 緊急ポインタ(16) | ||
オプション |
[Table39-01:TCPヘッダ]
後ろの括弧内の数字はビット数だ。
約20バイトと覚えてもらっていい。
ふむふむ。
まあ、それぞれの意味は後々でてくるからよいとして。
6ビットの制御ビットの所をちょっと詳しく説明しよう。
U R G | A C K | P S H | R S T | S Y N | F I N |
[Table39-02:制御ビット] :▼
制御ビットにはそれぞれ意味がある。
特に赤くしたACK、SYN、FINはよく使うので意味を覚えておくこと。
へぇ、どんな意味です?
まぁ、待て。ちゃんと説明する。
では、コネクションの確立の話をしよう。
はい。
■ スリーウェイハンドシェイク
TCPのコネクションの確立方法は、スリーウェイハンドシェイクと呼ばれる。
すりーうぇいはんどしぇいく?
そうだ。
コネクション、つまり通信路を確立するためには相手がデータ転送を許可してくれないと駄目なのだ。
いきなり勝手にデータを送りつけてはいけないってことですか?
いけないことはないが、勝手に送りつけたら相手が準備できてない可能性もあるだろう?
それでは確実なデータ転送ができないではないか。
ははぁ、そりゃそうですね。
なので確実なデータ転送のための通信路を確保するため、相手にデータ転送の許可要求を出す。
「いまからデータ送るけど、準備いいかい?」って感じですか。
そうだな。それで、要求を受けた相手は、許可を送信元に知らせる。
相手に正しく伝わることが確認できたわけだ。これで通信路が確保されたことになる。
「準備OK。いつでもどうぞ。」って返事するわけですね。
お願いに対し、返事が届いたってことですから、相手に届くことがわかる、と。
そして、それと同時に宛先側も送信元にデータ転送許可要求を出す。
?
相手側も、こちらにデータ転送するんですか?
うむ。
それに対し、送信元もデータ転送許可を送る。これで双方向の通信路が確保されたわけだ。
はぁ。
それはどういうことですか?
つまり、片方だけだと通信を要求した側からしかデータを転送できない。
じゃあ、相手にデータを送ってほしい場合はどうする?
そりゃ、相手からデータ転送許可要求をもらうんですよ。
確かにそうだが、その相手は、こちらがデータを欲しがっていることをどうやって知るのだ?
…。
え〜っと。
つまり、こちらから相手に「これこれこういうデータを送ってください」と頼むわけだ。その頼むために、「下さい」というデータを送る用に通信路を確立する必要がある。
逆に相手から頼んだデータを送ってもらう為に、相手からも通信路を確立する必要がある。
だから、双方向に通信路を確立するんですね。
そういうことだ。
では、実際のTCPの動きを説明しよう。
[Figure39-02:コネクションの接続]
このように、3回のデータ転送を行うことが、3方向(way)の握手(Handshake)、スリーウェイハンドシェイクと呼ばれる所以だ。
ははぁ。
3方向握手、ですか。
そうだ。
転送許可要求がSYN、転送許可がACKというのも覚えておくように。
SYN → ACK+SYN → ACKの流れですね。
そうだ。
よくあるものの本では、以下のような図で示されることが多いな。
[Figure39-03:3Way HandShake]
この、SYN_RCVとか、ESTABLISHEDとかはなんです?
うむ、TCPのコネクションの状態だ。
双方がESTABLISHEDになると、コネクションが確立された、という状態になる。
なるほど。CLOSEDは、閉まっていて通信なし。SYN_SENTはSYNを送った。SYN_RCVはSYNを受け取った、ですか。
LISTENってのは?
それは、データ転送待ち状態だ。
CLOSEDではないんですか?
うむ、CLOSEDでは完全に閉まっているので、相手からの通信を受け取れないのだよ。
なので、聞く(LISTEN)という待ち状態にしておく。これはポート番号の所で説明しよう。
はい。
■ コネクションの切断
このように、コネクションを確立する際は非常に礼儀正しく握手するわけだが。
通信が終わる際にも、礼儀正しく終了する。
[Figure39-04:コネクションの切断]
今回は、終了要求のFINを使うんですね。
うむ。
ポイントは、双方からデータ転送が可能にならなければコネクションが確立しなかったように。双方から終了しなければ、切断されないという点だな。
ははぁ。しかし、上の例のAはやけに待ちますね。
FIN_WAIT1 → FIN_WAIT2 → TIME_WAITと待ってから、ようやっとCLOSEDですからね。
そうだな。やはり、双方向の通信路が開かれているせいだな。
自分が終わったからといって、相手からの転送が終わったとは限らないからな。
ふむふむ。
FIN_WAIT1は、相手からのACK待ち。FIN_WAIT2は、相手からのFIN待ち。TIME_WAITは、相手にACKがちゃんと届いたかの確認待ち、だな。
相手にちゃんとACKが届かなかった場合、どうなるんです?
もう一度、FINが送られてくる。
なので、その可能性があるので一定時間待つわけだ。流れをもう一度図にしておこう。
[Figure39-05:コネクション切断]
ははぁ。
コネクションの確立にも、切断にも手間がかかってるんですねぇ、TCPって。
うむ。
このコネクションの確立あってのTCPだからな。
合言葉は。
確実・正確ってところですか。
ははは。そんな感じだ。
さて、コネクションが確立することによって、相手との通信路がオープンになったわけだ。
じゃ、いよいよデータ転送ですか?
うむ。
というわけで、それは次回。
あらら。
3分間ネットワーキングでした〜♪
- コネクション
-
[connection]
接続・連結。
- CEO
-
[Chief Executive Officer]
経営最高責任者。
日本では、代表取締役を示すことが多い。
- 制御ビット
-
特に解説しない部分の説明をします。
URG…緊急に処理するデータがあることを示す。
PSH…受け取ったセグメントをすみやかにアプリケーションに引き渡すよう要求する。
RST…接続を強制的に切断する。
- スリーウェイハンドシェイク
-
[3 Way Handshake]
- ESTABLISHED
- 確立、確立された、の意。
- 終了要求のFIN
- RST(リセット)を使えば、即切断することも可能です。
- ネット君の今日のポイント
-
- TCPでのデータ転送には、コネクションの確立が必要。
- コネクションは、仮想的なデータの通り道である。
- 双方向にデータ転送ができる。
- コネクションの確立はスリーウェイハンドシェイクで行う。
- 双方がデータ転送要求を送りあって、ESTABLISHEDにする
- コネクションの切断も、双方が終了要求を送りあう。