TCPプロトコルで送信したデータは、送り先に確実に届いたかを判断する仕組みを含んでいます。
例えば次のような、javaのプログラムでbrが繋がっている相手へ文字列を送信する命令を実行したとします。
br.write("送信データ"); System.out.println("送信が終わりました");
もちろんこの場合、受信側では受信用プログラムが実行していなければなりません。
受信側では、『送信データ』を正しく受け取ったかどうかのやり取りが行われます。
この正しく受け取ったかのやり取りで、エラーがあった場合は、内部で再度送り直す規則になっています。
送り直す場合も、内部的にその回数や経過時間などを記憶し、何回送っても応答が戻らないようなら通信不能と判断し、
実行エラーとします。
トランスポート層(TCPやUDP)送受信は、ポート番号で相手側が実行しているプログラムを識別します。
つまりサーバに限らず、情報の送信にポート番号を利用しているのです。
そのため通信中の一つのソケットでは、送信元と宛先の2つポート番号があります。
送信元のポートをローカルポート、宛先のポートをリモートポートと呼びます。
マシンの中で、使われているソケットの状態を表示するツール『netstatコマンド』があるので、
以下に実行例を示します。
(TCP状態の参考)
これは、前のページで紹介したServer2.javaとCleent2.javaを動かして、
それぞれを接続中の状態(文字列が送受信できている)にして、
アクセサリのコマンドプロンプトで、『netstat -no』と実行させた例です。
1532番のServer2.javaと1288番Cleent2.javaの通信中で、
Cleent2.javaのポートが、4699になってと分かります。
C:\work>netstat -no Active Connections Proto Local Address Foreign Address State PID TCP 192.168.0.3:80 192.168.0.3:4699 ESTABLISHED 1532 TCP 192.168.0.3:4699 192.168.0.3:80 ESTABLISHED 1288
上記で指定しているオプションで、
nがIPアドレスとポートをコロンで区切って表示させる指定で、
oがプログラムの識別番号表示指定でです。
他にaを指定すると、接続待機状態も表示することもできます。
以下は、Server2.javaだけを実行させて、『netstat -ano』と実行させた例です。
C:\work>netstat -ano Active Connections Proto Local Address Foreign Address State PID TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 2100 TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 756 TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4 TCP 127.0.0.1:1025 0.0.0.0:0 LISTENING 1952 TCP 127.0.0.1:10110 0.0.0.0:0 LISTENING 1168 TCP 192.168.0.3:139 0.0.0.0:0 LISTENING 4 UDP 0.0.0.0:445 *:* 4 UDP 0.0.0.0:500 *:* 544 UDP 0.0.0.0:1038 *:* 840 UDP 0.0.0.0:1039 *:* 840 UDP 0.0.0.0:1056 *:* 840 UDP 0.0.0.0:4500 *:* 544 UDP 127.0.0.1:123 *:* 796 UDP 127.0.0.1:1521 *:* 2460 UDP 127.0.0.1:1900 *:* 936 UDP 192.168.0.3:123 *:* 796 UDP 192.168.0.3:137 *:* 4 UDP 192.168.0.3:138 *:* 4 UDP 192.168.0.3:1900 *:* 936
コンピュータの中では、さまざまなものが動いているので、たくさん表示されます。 接続待機状態のソケットのStateは『LISTENING』(これがServer2の待機状態)の表示になり、 アドレスの表示は、『0.0.0.0』になります。 なお、『ESTABLISHED』は接続が確立している状態を示しています。