◇2002/12の日記◇

New← また来年 / メッセンジャー3 / メッセンジャー2 →Old


2002/12/25 また来年

めりーくりすます
基本的に、プログラマには関係ない行事ですが。


でも、ヒェミたんにクリスマスカードもらって嬉しかったです。ヽ(´ー`)ノ
ありがとうございます〜。


しかし、ROの街並みもすっかりクリスマスらしく飾り付けられ、やるせなさにとどめをさされる感じですね。
ルティエ以外の、雪がない街では、さっぱりクリスマスって感じがしないんですけどね。
バーチャル北海道に住んでいて、冬は雪があるのが当たり前という、固定観念を植え付けられているせいでしょうか。
雪で凍った道を、FRの車でくるくると回るのが楽しいのにねぇ。(ぇ


そんなことよりも、いよいよDirextX9の配布が開始されているようですね。
DirectX9SDKも配布されているようですので、とりあえずは日本語DOCだけでも落として、眺めてみようかと思います。


……って、日本語DOCだけで40MBってどういうことですかっ!
それだけ内容が充実しているってことなら大歓迎ですが、今までのDirextXのDOCを見る限り、ぁゃιぃもんです。
素直に雑誌の付録についてくるまで、待ったほうがいいのかもしれません……。


さて、12/27〜31は、人に会いに行ったりアレに行ったりする予定ですので、この更新が今年最後の更新となります。
今年を振り返ってみると、このページを始める前からも色々ありましたが、お世話になった方々、閲覧者の皆様、ありがとうございます。
来年も頑張りますので、これからも、よろしくお願い致します。
ちょっと早いかもしれませんが、皆様、よいお年を……


シェラ0x19歳は、来年の4/7にアトムが生まれることを、心待ちにしています。


2002/12/19 メッセンジャー3

間が空きすぎました……。_| ̄|○
師走ですからねぇ、何かと忙しいのですよと居直ってみるテスト。
……ごめんなさい


では、さっそく続きを……。


ということで、メッセンジャーでファイルの送受信が出来ない原因を探るために、メッセージやファイルのやりとりの仕組みを見てみましょう。




データの流れ


メッセンジャーでは、メッセージや現在のステータス等の軽いデータは、メッセンジャーのサーバを経由して送られます
例えば、マシンAからマシンBにメッセージを送信する場合、1と3の経路を通るわけです。
返信する時は、4と2の経路ですね。
何故わざわざサーバを経由するかというと、この方法では、メッセージを送るだけでは、お互いのIPアドレスはバレないんですね。
IPアドレスは、サーバが管理しておいて、サーバを経由する時にサーバが知っていればいいわけですから。


同じようなインスタントメッセージソフトでは、ICQというものがありますが、このソフトは昔、メッセージの送信だけでも直接相手と接続していたので、簡単に他人のIPアドレスを調べることができてしまうという欠点がありました。
現在は、ICQもメッセと同じく、サーバを経由する方法を採用しています。


このように、メッセージ等の軽いものを送る分には、サーバ経由でも問題ないのですが、ファイルの送受信となると、ちょっと困ったことが起こります。
サイズの大きいファイルが頻繁にやりとりされるとなると、サーバのトラフィックがスゴいことになって、サーバが耐えきれないんですね。


そこで、メッセでもICQでも、送受信の確認だけはメッセージと同じくサーバを経由し、合意が成立した上で、ファイルの送受信の際には、相手マシンと直接接続することになっています。
が、ここに例の、ファイル送受信に失敗する鍵が隠されています。


さて、ここでもまた、前回と前々回の「TCP/IP」の図を振り返ってみましょう。




ネットワーク層までの図


具体的に何が問題になるのかというと、マシンAからマシンBへとファイルを送信しようとする場合、まず、マシンAからマシンBへ、「これからこういうファイルを送りたいんだけど、おっけ〜だったらこのアドレスに直接接続してね」というメッセージが「ネットワーク層までの図」の3に入り、「データの流れ」の図の1と3の経路を伝わって送られます。


しかし、マシンAがルータを介してインターネットへと接続していた場合、データとして書き込まれるのは、ローカルネットワークのIPアドレスです。
この場合、「ネットワーク層までの図」の1に格納されるIPヘッダは、ルータによって書き換えられますが(前回更新参照)、3にデータとして格納されたIPアドレスはそのままです。
ルータから見た場合、3はあくまでも、アプリケーションが使用するデータですから、勝手にいじれないのは当たり前です。


このデータ自体は、ルータによってアドレス変換され、マシンBへと届きますが、困るのはマシンBです。
なにしろ、指定されたアドレスに接続しようにも、インターネット上のグローバルなIPアドレス上にそんなアドレスは存在しないのですから。


以上が、メッセでファイル送信が失敗する理由です。
ちなみに、上記のケースで、マシンAがグローバル接続、マシンBがルータ使用の場合は、ファイル送信が成功します
お暇な方は、その場合のデータの流れを、考えてみてください。
もちろん、ルータの設定で、使用するポートを開けておくことが条件です。


さて、今回で一応、メッセンジャーについての話は終わりです。
なんとかわかりやすくなるように、頑張って書いたつもりですが、いかがでしたでしょうか?
今年はもう、難しい話はしないと心に決めました。w


シェラ0x19歳は、大変なテーマが終わって、ほっと一息、気が抜けてます。


(私信)
蓮さん>誰か作らないかなぁ…。バーチャルネットプログラマの人とかシェラさんとか。
クルセイダーが実装される前にさw

激遅レスですが。(死
素材と時間さえあれば、作れないことはないような気もしますが、素材を集めるだけで1年くらいかかりそうな気がします。w
それに、クルセイダーが実装される前に、Jobをもっと上げないと〜。(ぉ
時間と心にゆとりがあれば、作ってみたいですけどねっ。


2002/12/08 メッセンジャー2

田仲ちゃんのところで、更新もしないでROやってることをバラされてるシェラです、こんばんは。
あぁ〜、BaseLvが4も上がってしまいましたよ。
JobLvも、もうすぐ2次職に転職可能なレベルです。
まぁ、クルセイダー待ちなので、転職しませんけどね〜。


今回は、ルータの働きについてです。
ルータというものが、内部でどんな働きをしているのか、これまた知ってる人が少ないような気がします。


わかりやすく説明するために、2台のマシンがルータに接続されていて、そこからインターネットに繋がっている場合を見てみましょう。
まずは、下図参照。




ルータを介した時の流れ


この図を見てわかるように、ルータは2つのネットワークを結んでいます。
2つのネットワークの間に立っているということは、IPアドレスが2つあるということです。
マシンAとB、ルータで構成される、ローカルネットワークのIPアドレス(1と書いてある側)と、ルータの外にある、グローバルなインターネットのIPアドレス(2と書いてある側)ですね。


ルータのローカル側のIPアドレスは、ほとんどのルータで、「192.168.0.1」に設定されていると思います。
この場合、ブラウザで、「http://192.168.0.1/」と、アドレス欄に打ってやれば、ルータの設定画面が出てくるはずです。


最近のルータは、DHCP(IPアドレスを自動で割り振る機能)も標準でついていると思いますが、とりあえず、マシンAのIPアドレスを「192.168.0.2」、マシンBのIPアドレスを「192.168.0.3」としておきます。
そして、ルータのグローバル側のIPアドレスを、「aaa.aaa.aaa.aaa」、相手マシンのIPアドレスを、「bbb.bbb.bbb.bbb」とでもしておきましょうか。


さて、ここで、前回の「TCP/IP」の図を振り返ってみましょう。




ネットワーク層までの図


マシンAから、相手マシンへと、メッセージが送られる場合を考えてみます。
前回と同じく、ブラウザで相手マシンのWEBページを見る場合を例に見てみましょうか。


まず、1のIPヘッダですが、送信元IPアドレスには、送信元であるマシンAのIPアドレス、ローカルネットワークの「192.168.0.2が入り、宛先のIPアドレスには、相手マシンのIPアドレス、グローバルネットワークの「bbb.bbb.bbb.bbbが入ります。
そして、2のTCPヘッダですが、送信元ポート番号には、ブラウザが決めた番号(仮にここでは「3000」としておきます)、宛先のポート番号には、80(大抵のWEBサーバが使用するポート番号)が入ります。
この状態で、この固まりはルータへと送られます。


この固まりを、ルータがそのまま相手マシンへと送ってしまうと、問題が生じます。
送信元にローカルネットワークのアドレスが入っているために、相手マシンは、どこにデータを返せばいいのかがわからないのです。
グローバルネットワークから見えるのは、ルータのグローバルネットワーク側の「aaa.aaa.aaa.aaa」というアドレスだけです。
そこでルータは、IPヘッダに書かれている送信元のIPアドレスを、ローカルネットワークの「192.168.0.2」から、グローバルネットワークの「aaa.aaa.aaa.aaa」へと書き換えます
これで、戻ってくるデータのIPヘッダには、送信元IPアドレスが「bbb.bbb.bbb.bbb」、宛先が「aaa.aaa.aaa.aaa」と書かれて、戻ってくることができます。


さらにここで、もう一つの問題が生じます。
マシンAとマシンBで、違うポート番号を使用してデータを送った場合は、そのポート番号をルータに記憶しておけば、どちらのマシンがどのデータを送ったのかがわかるのですが、同じポート番号を使用したデータを同時に相手マシンに送った場合、相手マシンから帰ってきたデータを、どちらのマシンに渡せばいいのかが判別できなくなってしまいます


そこでルータは、送信元ポート番号も書き換えて、どのように書き換えたかを自分で保存しておきます。
例えば、マシンAとマシンBが、同時にポート番号「3000」を使用したデータを送った場合、マシンA「192.168.0.2」から送られた方の送信元ポート番号を「4000」に、マシンB「192.168.0.3」から送られた方の送信元ポート番号を「5000」に書き換え、何をどう書き換えたかを保存しておくわけです。


これで、ルータにデータが戻ってきた場合、それぞれ宛先ポート番号が「4000」と「5000」で帰ってくるわけですから、保存されている内容を参照して、宛先ポート番号を「3000」に戻して、それぞれのマシンに送信してやるのです。
上手く出来ているものですね。


細かく語れば、ルータの機能はまだまだ奥が深いですが、この辺でやめておきます。w
次回は、ようやく、この仕組みをふまえた上での、メッセでファイル送信が失敗する理由を書きたいと思います。


シェラ0x19歳は、すごく大変なテーマを選んでしまったと、ちょっと後悔中です。


(私信)
美汐さん、さん、アルクさん、お疲れさまでした……。
このサイトを作る前から、みなさんには色々とお世話になりました。
本当に、ありがとうございます。