2016-06-27 4 views
0

私は低レベルのポートを理解しようとしています。私はSFから移動されているし、googleはうまくいけないので、これは低レベルのプログラミング(それでなければならない)として話題になることを願っています。tcpポート番号は何らかの形でメモリへのポインタとして使用されていますか?

ポートは、プログラム/サービスにアクセスするための番号です。私が見ることができる唯一の方法は、ポート番号を使用してプログラム/サービスによって特定の用途に割り当てられたアドレス空間(スタック?)にデータを送信することです。したがって、プログラム/サービスは、そのアドレス空間または「ポート」内の特定のデータ(プロトコル特有)について、「リスニング」することを検討している。これはどこに近いのでしょうか?

+0

ポートは、IPv4アドレスがIPv4のレイヤ3アドレスと同じように、一部のレイヤ4プロトコルのレイヤ4アドレスです。 [RFC 793](https://www.ietf.org/rfc/rfc793.txt)から: "単一のホスト内の多くのプロセスが同時にTCP通信機能を使用できるようにするために、TCPは内部に一連のアドレスまたはポートを提供します各ホストは、インターネット通信層のネットワークアドレスとホストアドレスを連結してソケットを形成します。ソケットのペアは一意的に各接続を識別します。つまり、複数の接続で同時にソケットを使用できます。 " –

+0

@ron maupin yesそのソケットはどのように低レベルでユニークになっていますか?ソケット経由で送信されるデータは、関連するポートを使用していずれかのホスト上の一意のアドレススペースに書き込まれる可能性があります。ポートが割り当てられた最終アプリケーションにのみアクセス可能なアドレス空間。これは論理的で、実装の詳細を知りたいと思っています。 – RamBam

+1

これは一般的なネットワーキングではない問題のOSに依存します。 –

答えて

0

したがって、プログラム/サービスは、そのアドレス空間または「ポート」内の特定のデータ(プロトコル固有)に対して、「リスニング」しています。

いいえ、実際はありません。ここでパズルの最も重要な部分はカーネルです。プログラムが "ポート上のリスナーを開く"とき、実際には、 "私はこのポートでリッスンしたい"と言うカーネルの呼び出しです。カーネルはおそらく何らかのルックアップテーブルでそのことを覚えています。

パケットが到着すると、そのパケットの受信を処理し、解析し、ペイロードを正しい場所にルーティングするのはカーネルの仕事です。この時点で、カーネルはどのプログラムがそのポートに登録されているかを調べ、到着した新しいデータについて通知します。これは複雑なプロセスです。プログラムがスリープ(新しいデータの待機をブロック)されているか、他のコードが実行されている可能性があります。その場合、新しいデータをキューに入れる必要があります。

あなたのユーザー空間プログラムが「リスニング」していないことが主なポイントです。いつ実行するか、起きるかどうかは、カーネルに任されます。元の質問のポート番号は、カーネルが保持するテーブルへの参照になります。

+0

素晴らしい答え、私は今のところ追加の質問があります:ルックアップテーブルのポートに対応する情報は、データがメモリに格納された場所の実際のアドレスですか?割り込みはプログラムを起動するために使用され、現在のプロセスを停止するために使用できます(データはキューに入れられません)。 – RamBam

+0

リアルタイムOSについて質問していますか?あなたはOSなしで実装の詳細を聞いています –

+0

私はあなたが特定のOSに入ることはできません、私はimplementaionがそれらの間でどのくらい異なることができるかを始めていると思います – RamBam

0

あなたは配列インデックスのように考えることができます。それは本当にあなたが細部に入る必要がある限りです。

+0

ポートの配列のインデックス?配列は単にポート番号を参照として格納するために使用されるのか、実際のインデックスであるかプロトコルに関連する事前定義済みのインデックス(実際のデータ用)を持つ別の配列ですか? – RamBam

+0

最後のビット:送信されているデータを含む別の配列のインデックスですか?プロトコルで使用されるさまざまなタイプのデータを分離するために使用される事前定義のキーまたはインデックスがある場合 – RamBam

+0

カーネルは、それをインデックスとして使用して、入ってくるパケットについて誰かが知っている必要があるかどうかを調べます。関数へのポインタの配列があると考えることができ、ポート番号はその配列へのインデックスであり、そのインデックスで関数を呼び出します。 – JonS

関連する問題