ネットワークプログラミング

ネットワークプログラミング

ネットワークプログラミングの概要

ネットワーク

異なる場所に位置し、それぞれ独立した機能を持つ複数のコンピュータと外部機器を通信回線で接続し、ネットワークオペレーティングシステム、ネットワーク管理ソフトウェアおよびネットワーク通信プロトコルの管理・調整により、リソース共有と情報伝達を実現するコンピュータシステムです。
極域

ネットワークプログラミング

異なるコンピュータ上で動作するプログラム同士がデータを交換できるようにするための技術です。

ネットワークモデル

OSI(Open Systems Interconnection)参考モデル

1. 物理層

物理デバイス標準を定義します。たとえば、ネットワークケーブルのインターフェース、光ファイバーの接続方式、各種伝送媒体の速度などです。この層の主な機能はビットストリームの伝送です(1と0を電流の強さに変換して伝送し、受信側では再び1と0に変換します。これはデジタルとアナログの変換とも呼ばれます)。この層のデータはビットと呼ばれます。

2. データリンク層

物理層から受け取ったデータをMACアドレス(ネットワークカードのアドレス)でラップまたはアンラップします。この層のデータはフレームと呼ばれます。この層で動作するデバイスはスイッチで、データはスイッチを通じて転送されます。

3. ネットワーク層

下位層から受信したデータをIPアドレス(例:192.168.0.1)でラップまたはアンラップします。この層で動作するデバイスはルータで、この層のデータはパケットと呼ばれます。

4. トランスポート層

データの伝送プロトコルとポート番号(例:WWWのポート80)を定義します。TCP(伝送制御プロトコル、効率は低いが信頼性が高い、大容量データの伝送に使用)、UDP(ユーザーデータグラムプロトコル、TCPとは逆の特徴を持ち、信頼性が高くないが軽量なデータ伝送に使用、QQのチャットデータはこれを使用して送信されます)。下位層から受け取ったデータをセグメントに分割して送信し、受信側で再構成します。この層のデータはセグメントと呼ばれます。

5. セッション層

トランスポート層(ポート番号:送信ポートと受信ポート)を通じてデータ伝送経路を確立します。システム間のセッションの開始または受信要求を処理します(デバイス同士はIPアドレス、MACアドレス、またはホスト名で認識する必要があります)。

6. 表現層

受信したデータの解釈、暗号化と復号化、圧縮と展開を行います(コンピュータが認識できる形式を人間が認識できる形式に変換します。例:画像や音声など)。

7. 応用層

端末アプリケーションに関わる層です。たとえばFTP(ファイルダウンロード)、WEB(ブラウザ)、QQ(画面に表示されるアプリケーション)などが含まれます。

TCP/IP参考モデル

ネットワーク通信の三要素

1.IPアドレス:InetAddress

ネットワーク上のデバイスを識別するもので、記憶しづらく、ホスト名で代用できます。

A: IPアドレスとはインターネットに接続された各ホストに割り当てられる32ビットのアドレスです。TCP/IPの規定により、IPアドレスは2進数で表記され、32ビット=4バイトです。例えば「00001010000000000000000000000001」という長いアドレスは人間には扱いにくいです。便宜上、10進数表記で「.」で区切って表記します。つまり上記のアドレスは「10.0.0.1」となります。この表記法は「ドット区切り10進数表現」と呼ばれ、1と0より覚えやすいです。

B: IPアドレスの構成
IPアドレス = ネットワーク番号 + ホスト番号

AクラスIPアドレス: 最初の1つ目の番号がネットワーク番号、残りの3つがホスト番号
BクラスIPアドレス: 最初の2つの番号がネットワーク番号、残りの2つがホスト番号
CクラスIPアドレス: 最初の3つの番号がネットワーク番号、最後の1つがホスト番号

特殊アドレス:
127.0.0.1 ループバックアドレス、ローカルネットワークの確認に使用できます。ping 127.0.0.1

DOSコマンド ipconfig: ローカルIPアドレスの確認
CentOS7:ip addr
CentOS6:   ifconfig

xxx.xxx.xxx.0 ネットワークアドレス
xxx.xxx.xxx.255 ブロードキャストアドレス

Aクラス	1.0.0.1---127.255.255.254	(1)10.X.X.Xはプライベートアドレス(インターネット上では使用せず、LAN内で使用されるアドレス)
					(2)127.X.X.Xは予約アドレス、ループテストに使用
Bクラス	128.0.0.1---191.255.255.254	172.16.0.0---172.31.255.255はプライベートアドレス。169.254.X.Xは予約アドレス。
Cクラス	192.0.0.1---223.255.255.254	192.168.X.Xはプライベートアドレス
Dクラス	224.0.0.1---239.255.255.254	
Eクラス	240.0.0.1---247.255.255.254	

InetAddressクラス

import java.net.InetAddress;

/*
    InetAddress: IPアドレスを表すJavaのクラス
 */
public class InetAddressExample {
    public static void main(String[] args) throws Exception {
        // static InetAddress getLocalHost()
        // ローカルホストのIPアドレスを返します。
        InetAddress address1 = InetAddress.getLocalHost();
        System.out.println(address1);

        // String getHostName()
        // このIPアドレスのホスト名を取得します。
        String hostName = address1.getHostName();
        // String getHostAddress()
        // このIPアドレスのアドレスを取得します。
        String ipAddress = address1.getHostAddress();
        System.out.println("ホスト名: " + hostName + ", IPアドレス: " + ipAddress);
    }
}

2. ポート番号

プロセスを論理的に識別するために使用します。異なるプロセスを識別するために使用されます。

3. 通信プロトコル

通信のルールです。
一般的なプロトコル:TCP、UDP

UDPプロトコル

データソースと送信先をデータグラムとしてカプセル化し、接続を確立する必要はありません。各データグラムのサイズは64KBまでに制限されます。接続がないため、信頼性のないプロトコルです。接続を確立しないため、高速です。

UDP通信
DatagramSocketとDatagramPacket
送信側と受信側のソケットを構築します。
データパケットを作成します。
ソケットの送信・受信メソッドを使用します。
ソケットを閉じます。
送信側と受信側は独立したプログラムです。

送信側の手順
1: UDPソケットサービスを構築します
2: 送信するデータをデータグラムにカプセル化します
3: UDPソケットサービスを使ってデータグラムを送信します
4: リソースを解放します

送信側コード
受信側の手順
1: UDPソケットサービスを構築します
2: receiveメソッドでデータを受信します
3: 受信したデータをデータグラムオブジェクトに格納します
4: データグラムオブジェクトの機能を使用して受信データを解析します
5: リソースを解放します

受信側コード

TCPプロトコル

接続を確立し、データ伝送のチャネルを形成します。接続中に大量のデータを転送できます。3回のハンドシェイクにより接続が確立され、信頼性のあるプロトコルです。接続が必要なため、効率は多少低下します。

TCP通信
SocketとServerSocket
クライアントとサーバーを構築します。
接続確立後、SocketのIOストリームを使用してデータを送受信します。
Socketを閉じます。
クライアントとサーバーはそれぞれ独立したアプリケーションです。

クライアントの手順
1: クライアントのSocketサービスを構築し、接続先サーバーを指定します
2: 接続が確立されれば、データ転送チャネルが確立されます。このチャネルでIOを使用してデータの読み書きが可能です。このチャネルはSocketストリームと呼ばれ、読み取りストリームと書き込みストリームを持っています
3: Socketオブジェクトのメソッドでこれらのストリームを取得します
4: ストリームを使用してデータを送受信します
5: データ送信完了後、リソースを解放します

クライアントコード
サーバー側の手順
1: サーバー側のSocketサービスを構築し、ポート番号を指定します
2: サーバー側では直接ストリーム操作は行わず、acceptメソッドでクライアントオブジェクトを取得し、そのストリームを使ってクライアントと通信します
3: クライアントからストリームオブジェクトを取得してデータの読み書きを行います
4: サービス終了後、クライアントを閉じ、サーバーを閉じます。ただし、通常はサーバーを閉じず、クライアントのみを閉じます。サーバーは常にサービスを提供するためです

サーバー側コード
TCP通信での問題点
クライアントがサーバーに接続すると、両方とも待機状態になり、データの送受信が行われません。
例による分析:
	readメソッドまたはreadLineメソッドはブロックモードです。
解決策:
	終了マークを自作する
	shutdownInput、shutdownOutputメソッドを使用する

Socket

Socket(ソケット):
ネットワーク上の一意のIPアドレスとポート番号の組み合わせによって識別されるものです。
Socketの仕組み:
通信の両端にはSocketがあります。
ネットワーク通信とは、Socket同士の通信です。
データは2つのSocket間のIOを通じて送られます。

Socketの仕組み図解

タグ: Java ネットワーク socket TCP udp

10月22日 11:17 投稿