Networkの基本

IP address

計算機とお話をするためには、その計算機を特定できないといけないわけで、たとえば、神戸大学の web server は、対外的には

という形で指定できるようになっています(2018年11月29日時点)。 上記の IP address は、32 bit (0-256 の 8bit x 4)で表現されたものですが、IPv6 という規格も広がりつつあります。

ホスト名は人間に読みやすい形式になっているわけですが、実際に計算機が通信する際は、ホスト名を IP address に変換してから処理します。 名前解決のためのサービスとして、例えば DNS (Domain Name System)サービスがあります。 以下は、nslookup コマンドを使って、DNS サービスにアクセスした例です。

kamada@www:~$ nslookup www.kobe-u.ac.jp
Server:         133.30.14.2 ← これは、DNS を調べてくれたサーバの情報
Address:        133.30.14.2#53

Name:   www.kobe-u.ac.jp  ← 調査対象(ホスト名)
Address: 133.30.30.70     ← 調査結果(IP address)

普段、web browser や mail サービスを使っているときも、知らず知らず DNS のお世話になっていることになります。

Port

計算機は、いろんな種類のサービスや通信を行っています。ということで、計算機のどのサービスとお話するのか識別できないと困ります。 で、そのために用いるのがport (ポート)番号です。

サーバ(サービスを提供する側)は、port番号を指定して、接続を待ちます。 クライアント(サービスを受ける側)は、サーバのIP addresport番号を指定して接続を行います。 接続毎に別ソケットが割り当てられるので、サーバプログラムは、指定 port で次の接続を待つこともできます。

port として利用可能な番号は、0〜65535 (16bit unsigned)と決まっており、0から1023までは利用法が決まっています。以下は例です。

  • SSH: 22
  • DNS: 53
  • HTTP: 80
  • HTTPS: 443

つまり、サーバは、各ポートを listen して待っていて、クライアントはそのポートに接続することで、サーバに接続するわけです。

皆さんが独自アプリで port を開いて実験する場合は、 1024 以降を使いましょう。

実例

例えば、皆さん WEB ページにアクセスする場合 URL を入力しますよね。

で、そうすると、計算機はホスト名から IP address を引いた後、そのホストの 80 番の port に対してアクセス要求を出す、といったことをします。

一方で、WEB サーバの方では、常に 80 番ポートにアクセス要求が来るのを待っています。 要は、80 番ポートというのが待ち合わせ場所になっているわけです。 これは、Mail の送受信や、ssh のログインなどでも基本的には同じ原理で、それぞれの用途毎に決まったポート番号を使うのが普通です。

自作ネットワークプログラムを起動する際は

皆さんのプログラムでも、基本は変わりません。

  • サーバプログラムが、計算機 X の port 番号 P で待っている。
    • 1024 以降の番号を使いましょう。
  • クライアントプログラムが、計算機 X と port番号 P を指定して接続を行う
    • X の指定法には、ホスト名や IP address が利用可能
  • サーバとクライアントの接続が確立する

ちなみに、サーバとクライアントは、同じ計算機で動かしても構いません。自マシンを指定する場合は、

  • ホスト名: localhost
  • IP address: 127.0.0.1

を利用しても大丈夫です。

いちいち複数のマシンに入って仕事したくなければ、通信相手を localhost にして、 プログラムを二つ立ち上げれば大丈夫です。 Eclipse 上でもプログラムの複数実行したり、複数コンソールを開くことができます。 IntelliJ の場合も、タブで選択できるはず。 鎌田の配布しているプログラムでは、クライアントは、基本 localhost で動いているサーバにアクセスするようにしてあります。

** 注意事項 ** 皆さんが自宅などでプログラムを起動する場合、firewall が、 「皆さんの起動したプログラムに、外部マシンからのアクセスを許可するか」聞いてくるかもしれません。 普通に、自マシンのなかでサーバ&クライアントを起動して実験するだけなら、** アクセスを許可する必要はありません。**