TCP/IPとは、OSI参照モデルで考えた時のトランスポート層とネットワーク層に位置付けされるプロトコルです。TCPはTransmission Control Protocol の略語であり、IPはInternet Protocolの略語です。ここでトランスポート層、ネットワーク層という言葉を使いましたが、これらはOSI参照モデルの7階層を構成するもので、ISOやITU-Tによって標準化されているものです。現在、TCP/IPというと、上記の個々のプロトコルを意味する他に、インターネット全体のプロトコルとしての意味持つ場合があります。
プロトコルというものは何なのか、私が初めてTCP/IPの学習を始めた際にまずこの言葉すら知りませんでした。プロトコルというのは簡単に言えば標準化のための決まりごとのようなものです。世界中には様々なソフトやハードがあります。その一つ一つが異なる基準の下に作られた場合、汎用性に欠けることになります。従ってハード、ソフトなどの決まりごとを設け汎用性を高めています。
ISOとはInternational Organization for Standardizationの略語で国際標準化機構を意味します。OSIとはOpen System Interconnection の略語で開放型システム相互間接続を意味します。
第七層がアプリケーション層、第六層がプレゼンテーション層、第五層がセッション層、第四層がトランスポート層、第三層がネットワーク層、第二層がデータリンク層、第一層が物理層と呼ばれています
アプリケーションに由来するプロトコル。例えば電子メール用のプロトコルなどが挙げられる
データの表現方法の管理を行う。複数のコンピュータ間においてビット列が意味するものが異なることがあるので、それらの問題を対処する
下位層の管理及び接続と遮断のタイミングの管理を行う
データ送信に関する管理を行う(TCPやUDP)
複数のコンピュータ間の経路を選び、アドレスの管理をする(IP)
ビット列をフレームとして認識し、転送する
電圧の高低や光の明暗で0と1のビット列を表現する
OSIはISOなどに標準化されていますが、TCP/IPのプロトコルはIETFで決められています。IETFはInternet Engineering Task Forceの略語です。議論にはメールを用いて誰でも参加することが出来ます。
パソコンを利用される方ならば一度は耳にしたことがあるかもしれません。IPアドレスとは簡単に言えばパソコンに振り分けられる識別番号といったものでしょう。世界中で1つだけになるような番号になっています(正確には例外がありますが...)。IPアドレスは32ビットの2進数で表されますが実際は表現の簡易さから10進数で8ビットずつ4つに「.」で区切り「10.20.30.40」のように表されることが多いです。このIPアドレスは特にIPv4(バージョン4)と呼ばれるもので、現在IPv6(バージョン6)というものも順次導入されています。これはIPv4の個数が足りなくなってきているためにより多くのパターン数を表現できるバージョンが必要になってきたためです。詳しくは省略しますがIPv6で検索して頂ければ数多くのサイトが見つかります。さてこのIPアドレスですが自分のパソコンに割り振られているものを確認することが出来ます。Windowsではコマンドプロンプトを開き、ipconfigと打ち込みEnterボタンで確認が出来ます。コマンドプロンプトはスタートボタンを押し検索欄にcmdと打ち込めば見つかるはずです。後ほど紹介するチャットアプリではIPアドレスを認識している必要性がありますので一度試してみてください。IPアドレスはIP(インターネットプロトコル)が参照する重要な情報です。IPアドレスは被ることがない限り自分で変更することもできますが基本的に機械が割り振ることが多く仕事でもない限り自分で変更することは多くないでしょう。同じ端末を使っていても繋ぐWiFiなどによって自動的にIPアドレスが変化します。
IPアドレスは変化をするという話をしましたが、変化しない固定の物理アドレスというものがあります。別名MACアドレスとも呼ばれパソコンから携帯電話、ルーターに渡って割り振られています。IPアドレスとはことなり変化することのないアドレスです。また先に紹介したIPアドレスはこの物理アドレスに基づいて割り振られます。物理アドレスからIPアドレスを、IPアドレスから物理アドレスを検索することが出来ます。データの通信にはこれらのアドレスが多く関わっていますが詳しいことは後ほど紹介します。
IPは複数のホストの通信を受け持つプロトコルでIPアドレスを用いてデータの転送などをおこなうことは説明しました。ここでホスト内のデータに注目します。ホスト内では多くのアプリケーションが起動しています。ホストが受信したデータを正しく目的のアプリへ渡す仕組みはどうなっているのでしょうか?ここで登場するのがポート番号というものです。ホスト内のアプリケーションを正しく認識するための番号で0〜65535(16ビットの符号なし整数)までの番号を用います。このポート番号ですが予め使用されている番号があります。FTPやHTTP、SMTP、DNSなど頻繁に用いられるものには番号が振られているのです。後に紹介するチャットアプリケーションではポート番号も指定できるようにしていますので任意に番号を決めて実行してみてください。
プロトコルやIPアドレスはなんとなく掴めてきているでしょうか?TCPやIPを実際に用いるにはそれぞれのプロトコルに関連したIPアドレス、を利用します。ではIPアドレスをプログラムとして使うには?ここで用いるのがソケット通信です。ソケットとは抽象的なもので形はなく、アプリケーションのデータの送受信を受け持ちます。プログラミング言語としてC#やJavaなどいろいろな言語で用いることができ記述方法も様々です。アプリケーションからデータを送受信する際に橋渡しをするケーブルを思い浮かべて下さい。主にクライアント側とサーバー側にソケット通信のプログラムを置き相手のIPアドレスとポート番号を用いてソケットを接続、その後そのソケットを使ってデータをやり取りといった流れになります。相手がソケットをcloseしたらついになる相手側のソケットも遮断されるようになっています。IPやTCPの理解が薄くてもソケット通信を使って他のクライアントとデータのやり取りが出来てしまうくらいに優秀な技術です。
コンピュータからコンピュータまでどのようにしてデータを転送しているのでしょうか?ここでは、通信の流れを説明していきます。
説明のためにAさんとBさんの間の通信を考えます。現実の通信では直接AさんのデータがBさんへ届く間には、複数の端末を経由していくことがほとんどです。それでは具体的に説明していきましょう。送信に際して、AさんがBさんのIPアドレスをデータに添えて送りだし、最終的にBさんはそのIPアドレスが自分のものと一致するか調べ一致した場合受信という形になります。実際には複数のコンピュータが存在しているネットワークの中で、正しい道筋を判断しデータを経由する先を選ぶ端末をルーターと呼びます。ルーターにもIPアドレスが存在しています。以下に簡単にイメージ画像を載せます。左がAさん右上がBさん右下がその他のコンピュータだと考えてください。
さて、ここで、Aさんが送り出した相手はBさんなのになぜルータはデータを受信できるのでしょうか?MACアドレスを覚えていますか?ここで登場するのがMACアドレスです。実はAさんが送信したデータにはルーターのMACアドレスも添えられているのです。MACアドレスが等しいためルータはデータを受信し、次の端末のMACアドレスを添えてまた次へと送信します。この作業を繰り返しBさんまでデータを運んでいきます。しかし、なぜ送信の際に次の端末のMACアドレスが分かるのでしょうか?ここで新たに登場するプロトコルがあります。それはARP(Adress Resolution Protocol)です。ARPは特定のIPアドレスを持っていた場合MACアドレスを返してくれるように要求するものです。何処にデータを送っていいのかわからない時はブロードキャストアドレスといってMACアドレスなら「FF.FF.FF.FF.FF.FF」IPアドレスなら「255.255.255.255」を用いると全ての隣接する端末にデータを送ることが出来ます。つまり、MACアドレスが「FF.FF.FF.FF.FF.FF」でも、IPアドレスが「255.255.255.255」でなくても受信させるのです。このプロトコルとブロードキャスト、ルーターが持つルーティングテーブル(個々のネットワークの宛先への経路の一覧)を用いてデータをバケツリレーさせていきます。難しいと思いますが詳しくはもっと複雑なシステムです。ここではなんとなく概要を理解して頂けるように簡単に説明しています。TCP/IPについては多くの参考書も存在しているので興味を持っていただけたのなら読んでみるのもいい経験になると思います。
プログラムの説明はソースに記述しているので参照してください。アプリケーションの仕様と使い方を簡単に紹介します。
クライアント側はGUI制御にしています。起動直後は退室状態になっています。ウィンドウの左上がChatClient_outになっていることが確認できるはずです。入室するとChatClient_inに変化します。入室時退室時に関わりなくChatAreaは編集できないようにしています。ChatAreaのスクロールは上下のみ可能に設定しています。起動直後は退出状態なので退室ボタン及び送信ボタンは押すことが出来ないようにしています。またMessageも入力出来ないようになっています。任意で名前を入れIPアドレス、ポート番号を指定し入室ボタンを押し、入室した後は、入室ボタンを押せなくなります。退出の仕方などは上記の通りです。※JavaSDKがコンピュータにインストールされていない場合、プログラムをコンパイル、実行することはできません。