コネクション【connection】

広告

広告

コネクション とは

最終更新
2005-12-04T15:03:00+09:00
この記事のURI参照
http://www.7key.jp/nw/tcpip/tcp/connection.html#connection

TCPとはでTCPの概略について話しましたが、今回はそのTCPの通信手順について触れていきます。TCPが属するトランスポート層の機能に、「データをどのアプリケーションに渡すか」という制御がありました。これは言い換えれば、送信元と送信先のアプリケーションを仮想的な通信路で結ぶ役割となります。ネットワーク層以下が担っている役割は端末間のデータのやり取りだけですよね。上位層であるTCPで仮想的にアプリケーション同士を結ぶ通信路を確保し、相手に確実にデータを送信する制御を行うというわけです。この仮想的な通信路のことをコネクションと呼び、コネクションを使用する通信を総称してコネクション型通信と呼びます。

TCP が提供するコネクションを説明する際、通信手順が似ているため、電話の例に例えられます。電話を相手にかけ通話をする手順を思い出してください。

「相手を呼び出し電話回線を確保する」→「通話を行う」→「受話器を置いて回線を開放する」

これをそっくりTCPコネクション型通信に置き換えると次のようになります。

コネクションの確立」→「データ通信」→「コネクションの開放」

どうです、似ているでしょう?更に言うなれば、こちらから電話をかけ、相手が「もしもし」と言ったのを確認してからデータを送信することによって、確実にデータを送信できるコネクションが確保できた、と判断できるわけです。抽象的な話はこの辺にして具体的に見ていきましょう。

補足

コネクションは正確には、ある階層のプロトコルが利用する、その階層の下の階層の仮想的な資源(通信路)と定義されています。TCP/IPに限らずISO/OSI参照モデルの階層化要素を説明する際に使われる用語となっています。

スリーウェイハンドシェイク

最終更新
2004-12-24T00:00:00+09:00
この記事のURI参照
http://www.7key.jp/nw/tcpip/tcp/connection.html#threeway

ではTCPにおけるコネクションの確立手順から説明をします。TCP ではIPの世界のようにいきなりデータを送りつける事はできません。いきなりデータを送りつけたのでは、相手の準備が整っていない場合もありますし、そもそも端末の電源が切れているかもしれません。相手に確実にデータを届けるために、まずは「今から通信を開始します」→「OKですよ」の確認から始まるのです。またこの確認に合わせて、通信に必要な情報も相手に通知します。具体的にはシーケンス番号の初期値とウィンドウサイズMSS【Maximum Segment Size】です。

セグメントの順序を管理したり、セグメントに抜けが無いか確認するために重要な役割を果たすシーケンス番号ですが、これはセキュリティの関係上1から始まると決まっているわけではありません。よって何番から始めるかという初期値を相手に通知する必要があります(詳細はTCP における確認応答と再送制御)。

また、ウィンドウサイズについては最初のSYN パケットでは通知されませんが、コネクションの確立の際に交換される重要な情報です。別途詳しく解説しますので「ウィンドウとは」を参照下さい。

MSSTCP セグメントの最大サイズのことで、TCP ヘッダのオプション欄に格納されます。Ethernetを使うとき、このサイズは1,460オクテットとなります(EthernetのMTU 1,500オクテットからIPヘッダ20オクテット、TCP ヘッダ20オクテットを引いた数値)。

具体的には、接続側から「SYNパケット(Synchronize:同期パケット)」にてデータ転送の許可要求を送ります。この際、接続側ホストTCP ヘッダの中にシーケンス番号の初期値をセットします。もし準備ができていれば待ち受け側から「ACKパケット(Acknowledge:確認応答)」にて許可を接続側に送ります。この際、確認応答番号には受け取ったSYN パケットのシーケンス番号に1を加えた値が入ります。つまり、「このシーケンス番号からセグメントが欲しい」というわけで、接続側が最初のデータパケットを送信する際はこのシーケンス番号が使われます。同時に待ち受け側は最初のウィンドウサイズを接続側に通知します。これらの情報は全てTCP ヘッダの中に書き込まれます。TCP とはを参考にして下さい。

これらの手順を踏まえて接続側から待ち受け側ホストへの通信路は確保されたのですが、ちょっと待って下さい。これだけでは片方向の通信の安全性しか確保できません。多くの場合データのやり取りを行う際は「○○を下さい」→「はい、どうぞ」のようにリクエストとレスポンスから通信は成り立ちます。そのためにもコネクションは双方向の通信の安全性を確保できるものでなければなりません。よって、逆側(SYN パケットを最初に受け取った方)からも同じく SYNパケットを送信し、データ転送の許可を求めることになります。ただ、この際手順を効率化するために、最初に返すACKパケットに SYNパケットをまとめてしまいます。つまり、SYNフラグとACKフラグの両方が1のパケットを送信するというわけです。

以上、長々と説明をしましたが文章だけでは理解しにくいと思います。下図(Figure:CONNECTION-01)を参考にして下さい。

CONNECTION-01

上記のように、3つのパケットをお互いに交換してコネクションを確立する手続きの事を「スリーウェイハンドシェイク」と呼びます。スリーウェイハンドシェイクにより双方向に通信路を確保することができるようになるというわけです。

コネクションの開放

最終更新
2004-12-25T00:00:00+09:00
この記事のURI参照
http://www.7key.jp/nw/tcpip/tcp/connection.html#release

次にコネクションの開放手順です。こちらもコネクションの確立と同じように、双方から開放手続きをすることとなります。

「私の方はもう送るものありませんから切断して下さいね」→「はい、OKです」

といった感じでお互いにやり取りをします。ただ、切断の場合はスリーウェイハンドシェイクのように途中の手続きをまとめて効率化を図ることはできません。考えてもみて下さい。片方の送りたいデータが無くなったからと言って、もう片方の送信データも無くなっているとは限りませんよね。ですから、それぞれ別に通信の開放手続きを行う必要があるのです。

まず、切断したい方から「FINパケット(Finish)」を送信します。これは特にどちらからと決まっているわけではありません。先に送信データが無くなった方から切断手続きを行うのです。そして、もう一方の端末からACKパケットを受け取ると片方向のコネクションが開放されたことになります。この最初の切断をアクティブクローズ、片方だけコネクションが開放された状態のことをハーフクローズと呼びます。そして、最初にFINパケットを受け取った側の端末も送信データが無くなり次第 FINパケットを送信し、切断手続きを行います。こちらをパッシブクローズと呼びます。例のごとく文章だけでは分かりづらいので図(Figure:CONNECTION-02)を見ながら上記を確かめてください。

CONNECTION-02

広告

Copyright (C) 2003-2005 七鍵 key@do.ai 初版:2004年12月25日 最終更新:2005年12月04日