図2.2について幾つかお尋ねします (「なぜつながるのか」p.100)

戸根勤 さま

前回に引き続き,お世話になります.
初歩的な質問で恐縮ですが,図2.2(p.100)について,いくつかお教えくださいますようお願いいたします.

(1) 6行目
ローカルアドレスの部分が,10.10.1.16:139 となっています.
ポート番号が139番ですので,自ホストもサーバ(Windowsファイルサーバ)として待ち受け状態になっていると理解してよろしいでしょうか?

(2) 7行目と8行目
ローカルアドレスに,同じポート番号1031が現われています.
この2行は同じコネクションなのでしょうか?
2行同じポート番号が現れるのは,Windowsファイルサーバと通信するときの仕組みに由来するものと考えていいでしょうか?

(3) 11行目
ローカルアドレスの部分が,別のIPアドレス,192.0.2.229:139 となっています.
このローカルホストは,LANアダプタを2枚装備していると考えていいでしょうか?

(4) 3行目,4行目,5行目
いずれも待ち受け状態(LISTNIG)になっているので,サーバとして要求待ちで待機している状態のように見えます.
一方,ポート番号は,1024以上(それぞれ1025,1040,5000)なので,クライアントのポート番号と思います.
矛盾するような感じですが,どう理解すればいいのでしょうか?

細かい話で恐縮ですが,よろしくお願いいたします.

名前: 
匿名希望
日時: 
13/07/16 17:17

コメント

匿名希望さん,こんにちわ。

> (1) 6行目

そうですね。
まあ,正確に言うと,NetBIOSセッションサービスの待ち受け状態っていうことです。
でも,Windowsファイルサーバ以外にNetBIOSを使うアプリケーションも少ないでしょうから,
ファイルサーバという理解で良いと思います。

> (2) 7行目と8行目

7行目は待ち受け状態のソケットで,
8行目が通信中のソケットですね。
サーバ側の動作は第6章394ページ辺りから解説があります。
まず,そちらを見てください。

> (3) 11行目

この画面を取ったのは随分前のことなので,
2枚なのか3枚なのか忘れてしまいましたが,
192.0.2.229っていうIPアドレスを割り当てたインタフェースが存在するんでしょうね。
1枚のインタフェースに複数のIPアドレスを割り当てる方法もありますけど,
この画面はそれじゃないと思います。

> (4) 3行目,4行目,5行目

1024以下はサーバで,1025以上はクライアントっていう色分けは正確じゃないと思います。
昔,1024以下のポート番号はサーバ用として使おう,という考え方があり,
OSによっては,1024以下のポート番号を使うには特権が必要です。
だから1024以下はサーバ用というような話になるのですが,
これはOS実装者の考え方であって,TCPの仕様そのものの話じゃないはずです。
今,RFC793の中を検索してみましたけど,(読んだわけじゃありません (汗))
1024も1025もヒットしませんから,仕様書には1024以下が云々っていう話は書いてないと思います。

要するに,仕様上はサーバ用とかクライアント用という色分けはなく,
Listenさえすればコネクションを待ち受ける状態になるってことです。
この辺も実際にプログラム作って動かしてみると,よーく分かると思います。

戸根 勤 さま

ご回答,ありがとうございました.
細かいけれど,数多くの疑問点が解けました.
特に,1024以上のポート番号に関しては,目からうろこが取れた感じです.

1点だけ確認させてください.
例えば,ポート番号5000番のソケットを作って,LISTENで待ち受け状態になっているとき,外部から接続要求をする際に,この5000番は,Webの80番と同じように,相手側は知っているという理解でよろしいでしょうか?

お時間のある時にでも,お教えください.
まずは,ありがとうございます.

> この5000番は,Webの80番と同じように,相手側は知っている...

TCPを直接たたいてプログラミングするとき,
クライアント側は,サーバ側で待ち受けているポート番号を指定して,
接続動作を行うようプログラミングしますから,
サーバ側のポート番号を知らないとサーバに接続できません。
なので,クライアント側がポート番号を知っているはず,
ということになりますね。

そのため,広く世間で使われるアプリケーションについては,
皆がポート番号を分かる状態にするため,ポート番号は公開されています。
下記を見ればそれが分かります。

http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

社内アプリケーションなどの場合は,広く世間に公開する必要は無いので,
身内の人に分かるようにしておけばよいでしょう。

いずれにしても,TCPプロトコルが作られた頃は,
サーバ側とクライアント側の両者がサーバ側のポート番号を知っているはず,
という前提が設けられたんだと思います。
というか,そんなに深く考えていなかったのかもしれません。
今と違って,インターネットは研究者の仲間内のネットワークでしたから。

ただ,後になって,
ポート番号を自動的に調べる仕組みが出てきましたから,
そういった仕組みを使う場合は,
クライアント側はポート番号を知らなくてもかまいません。
まあ,その辺はTCPの話から外れて,
ネットワークプログラミングの話題になっちゃいますね。

ご回答ありがとうございます.
くどいような念押しの質問にもかかわらず,丁寧にお教えくださいまして,ありがとうございました.
助かります.

お礼と言ってはなんですが,一か所誤植のようなものがありましたので,ご報告申し上げます.

97ページ,脚注2
ICMP「3.2.3ルータのパケット中継動作」の中で登場します
とありますが,
「2.5.11サーバからの応答パケットをIPからTCPに渡す」
ではないかと思います.
手元の版は,第2版11刷りです.
もしお役にたちましたら幸いです.

また,よろしくお願いいたします.

あらま,間違ってますね。
細かいところに眼が行き届いておらず,すみません。
ご指摘ありがとうございます。