マイコンピュータのプライベートIPアドレスは192.168.44.182です。以下を使用してプロセスを開始すると、
nc -l localhost 20000
その後、このプロセスは192.168.44.182に送信された要求を処理しません。
localhost:20000でリッスンするプロセスは、実際に192.168.44.182のLAN IPを持つ物理システムで実行されているため、192.168.44.182の要求をどのように無視するのか疑問に思います。
これらの要求は実際にプロセスで無視されていますか?それとも、これらの要求は127.0.0.1のネットワークインターフェイスにまったく転送されませんか?これはネットワーク層メカニズムですか、それともリンク層メカニズムですか?
ベストアンサー1
リスニングソケットを設定するときにバインドするローカルアドレスを選択できます。これはバインディング(2)システムコールを介して行われます。 (0.0.0.0にバインドすることもできます。これはすべてのローカルアドレスを受信することを意味します。)
netcatにlocalhostを受け取るように指示します。したがって、ソケットアドレスとして127.0.0.1(または同様のもの)を使用してバインディング(2)を呼び出します。したがって、カーネルはリスニングソケットをそのアドレスにのみバインドします。
192.168.44.182:20000 に接続要求が入ると、カーネルはリスニングソケットのリストを調べてソケットを見つけることができません。だからカーネルは接続を拒否しました。
リクエストが 127.0.0.1:20000 に来ると、カーネルはリスニングソケットを探し、accept(2) システムコールは netcat にこれを知らせます。
netcatがすべてのインターフェースを受信できるようにするには、ホスト:を省略するか、nc -l -p 20000
0.0.0.0:を指定しますnc -l 0.0.0.0 -p 20000
。リスニングする特定のIPアドレス(192.168.44.182)を指定することもできますが、これはnc localhost 20000
もちろん拒否されます。
(たとえば、セキュリティ上の理由で同じシステムからの接続のみを許可したい場合は、localhostにバインドすることがよくあります。)