私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

Windowsのnetstatコマンドの状態

netstatの状態列の値について調べた。
次のJavaプログラムを実行すると、

ServerSocket socket0 = new ServerSocket(80); // (1)
ServerSocket socket1 = new ServerSocket(81, 0); // (2)
ServerSocket socket2 = new ServerSocket(82, 0, InetAddress.getByAddress(new byte[]{0,0,0,0})); // (3)
ServerSocket socket3 = new ServerSocket(83, 0, InetAddress.getByAddress(new byte[]{127,0,0,1})); // (4)

netstatの結果は下記のようになる。

C:\Users\ken>netstat -ano

アクティブな接続

  プロトコル  ローカル アドレス          外部アドレス        状態           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       4304
  TCP    0.0.0.0:81             0.0.0.0:0              LISTENING       4304
  TCP    0.0.0.0:82             0.0.0.0:0              LISTENING       4304
  TCP    127.0.0.1:83           0.0.0.0:0              LISTENING       4304

(1)待受アドレスを指定しない場合は、0.0.0.0となる。つまり、どんなIPアドレスでも自分宛のアドレスならなんでもいい。
(4)待受アドレスを指定した場合は、そのアドレスとなる。つまり、そのアドレスじゃないと受け付けない。今回の場合はループパックアドレス127.0.0.1
「状態」列の値はすべてLISTENINGだけど、まだ通信準備はできていない。
次に、下記のように待機状態にする。

Socket socket = socket0.accept();

この段階でも下記のまま。プログラムは待機状態に入る。

  プロトコル  ローカル アドレス          外部アドレス        状態           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       5920
  TCP    0.0.0.0:81             0.0.0.0:0              LISTENING       5920
  TCP    0.0.0.0:82             0.0.0.0:0              LISTENING       5920
  TCP    127.0.0.1:83           0.0.0.0:0              LISTENING       5920

インターネットブラウザで「http://localhost」にアクセスすると、次のような状態になる。

  プロトコル  ローカル アドレス          外部アドレス        状態           PID
  TCP    0.0.0.0:80             0.0.0.0:0              LISTENING       5920
  TCP    0.0.0.0:81             0.0.0.0:0              LISTENING       5920
  TCP    0.0.0.0:82             0.0.0.0:0              LISTENING       5920
  TCP    127.0.0.1:80           127.0.0.1:49927        ESTABLISHED     5920
  TCP    127.0.0.1:83           0.0.0.0:0              LISTENING       5920

127.0.0.1:80のネットワーク接続が確立する。
その後、次のコードで受信内容を読み込むと、

BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

String line = null;
while((line = br.readLine()) != null){
	System.out.println(line);
}

下記のように表示される。

GET / HTTP/1.1
Host: 127.0.0.1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: Shift_JIS,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

レスポンスがうまいこといかないので、今日はここまで。