
ポートの実際の使用方法とその動作については、十分に理解しています。ただし、いくつか質問がありますので、明確にしておきたいと思います。
- サーバーソケットのポートを指定せずにリクエストを送信するとどうなりますか?
- プロセスが特定のポートをリッスンするのではなく、自分の IP アドレスに送信されたすべてのリクエストが同じプロセスによって処理されるようにマシンを設定する方法はありますか? その場合、クライアントはリクエスト内のポートを省略できます。
- 質問 2 を踏まえて、Raspberry Pi などで何らかのサーバーを実行したい場合、IP アドレスを RPi にルーティングして、同じサーバーを使用してすべての着信ネットワーク要求を処理するようにすることはできますか? つまり、ユーザーはポート番号なしで IP アドレスに接続するだけで、サーバーに接続できます。
答え1
リクエストを送信するときに、IP に加えてポート番号も指定する必要があるのはなぜですか?
TCP (および UDP) プロトコルで必要となるため、これはプロトコル仕様の一部です。
サーバーソケットのポートを指定せずにリクエストを送信するとどうなりますか?
ポート番号を指定しないと、API 呼び出しのその部分にはおそらくゼロが入ります。ポート 0 は予約済みポートであり、一部の実装では、ポートがシステムによって動的に割り当てられることを意味するために使用されます。
プロセスが特定のポートをリッスンするのではなく、自分の IP アドレスに送信されるすべてのリクエストが同じプロセスによって処理されるようにマシンを設定する方法はありますか?
TCPやUDPトランスポート層プロトコル、またはそれらに基づいて構築されたアプリケーションレベルのプロトコルを使用する場合はそうではありません。HTTPなど
一部のオペレーティング システムでは、OS の一部として単一のプロセスが存在しますが、そのプロセスは特定のアプリケーションに接続を渡します。
IPアドレスをRPiにルーティングするようにできますか?
ルータを設定して、すべての着信接続要求をrPiにルーティングすることができます。
人々はポート番号なしで IP アドレスに接続するだけで私のサーバーに接続します。
HTTP などの標準プロトコルを使用していません。
Berkely Sockets などの標準 API を使用するのは不可能だと思います。多少の努力で、独自に考案した別の、または新しいトランスポート層プロトコルを使用できると思います。そのような不便さを受け入れるには、かなり確固とした理由が必要です。
答え2
サーバーソケットのポートを指定せずにリクエストを送信するとどうなりますか?
できません。ソケットは定義上、IP + ポートです。ポートが存在する理由は、マシン上の複数のプログラムがトラフィックを送受信できるためであり、ポートは両端のプロセスを区別するために使用されます。
プロセスが特定のポートをリッスンするのではなく、自分の IP アドレスに送信されるすべてのリクエストが同じプロセスによって処理されるようにマシンを設定する方法はありますか?
プロセスで各ポートに 1 つずつ、合計 65535 個のソケットを開くことができます。おそらく自分で作成しなければならないような奇妙な中間プログラムがなければ、これを行うように作成されていない既存のプログラムでこれを行うことはできません。
iptables
Linux では、これを行う構成、または同等の構成を作成できる可能性があります。
Raspberry Pi のようなもので何らかのサーバーを実行したい場合、IP アドレスを RPi にルーティングし、同じサーバーを使用してすべての着信ネットワーク要求を処理するようにすることはできますか?
ほとんどの標準的な住宅用ルーターのデフォルト設定では、ルーターは外部から送信されるトラフィックをすべて無視します。
ほとんどすべてのこのようなルーターでは、ポート転送を行うことができます。ポート転送は、ルーターに、特定のポートの着信トラフィックをルーターの背後にあるプライベート ネットワーク上の特定のシステムに転送するように指示します。
おそらく、ルータに、迷惑な着信トラフィックをルータの背後にあるプライベート ネットワーク上の特定の IP に転送するように指示することもできます。これは DMZ と呼ばれます。
答え3
ポートは、複数のプロセスがサーバー間で通信できるようにするプロトコルにとって不可欠です。これは単なる実用的な考慮事項ではありません。
よく知られているサービスには、DNS=53、HTTP=80、HTTPS=443、SMTP=25、Telnet=23、SSH=22、FTP=20&21 などのポートが割り当てられています。このようなよく知られているサービスでは、サービスに割り当てられたポートで実行されている場合、ポートを指定する必要はありません。割り当てられたポートは、Unix/Linux プラットフォームの /etc/services にリストされています。
- TCP および UDP の場合、ポートがないと接続できません。ヘッダーには、送信元ポートと宛先ポートの両方のフィールドが含まれます。これらのフィールドには、ゼロであっても常に値が存在します。
- インターフェースに到着するすべてのパケットをキャプチャすることが可能です。これは、tcpdump などのツールが動作する仕組みです。
- 1 で述べたように、すべての着信リクエストにはポート番号があります。SOHO ルーターは通常 DMZ をサポートしており、ルーティングされていないすべての着信リクエストを DMZ に割り当てられた IP アドレスに転送します。ほとんどの場合、サービスに必要なポートをサーバー (Raspberry Pi) に転送するだけで済みます。これにより、複数の Raspberry Pi で異なるサービスを実行できるようになります。