リスニング ソケットを作成すると、記述子 (ルート記述子など) が返され、この記述子がアドレスにバインドされます。新しいクライアント接続が利用可能になると、ルート記述子から通知が届き、その新しい接続を受け入れて、各クライアントの一意の記述子 (クライアント記述子など) を受け取ります。これ以降、その記述子を使用してクライアントと通信できます。クライアント情報は、クライアント記述子によって指定される別の inode に格納されます。このため、Linux はそれぞれのクライアント データをそれぞれの記述子に配信できました。
上記が正しい場合 (私の理解が間違っている場合はご指摘ください)、疑問が生じます。inode に保存されるクライアント情報とは何ですか? Linux ではクライアントはどのようにして一意に識別されるのですか?
答え1
TCP/IP および UDP/IP プロトコルは、ローカルおよびリモートの IP アドレスとポート [1] によって定義される「セッション」を認識します。たとえば、TCP/IP パッケージには、送信元およびターゲットの IP アドレスとポート [2] が含まれます。複数の接続が開いているサーバーまたはクライアント (たとえば、Firefox) は、OSI [3] セッション層でアドレスとポートによって区別されます。
ウェブブラウザを使用しながらシェルを開いてルートとして実行してください
netstat -tulpan
現在のアクティブな接続を確認するには[4]を使用します。
出力例:
# netstat -tulpan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1966/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1902/cupsd
tcp 0 0 192.168.1.16:57374 172.217.23.165:443 ESTABLISHED 4730/firefox-bin
tcp 0 0 192.168.1.16:55478 104.26.11.30:443 ESTABLISHED 4730/firefox-bin
udp 0 0 127.0.0.1:53 0.0.0.0:* 1996/named
これらの行は、Firefox が異なるローカル ポートを使用して「ESTABLISHED」接続を行っていることを示しているため、Firefox はどのパケットがどの要求に対する応答であるかを認識できます。
LISTEN 状態の他の行は、sshd
(Secure Shell Server)、cupsd
(printer daemon)、named
(Bind name server) など、サーバー プロセスとして実行されているローカル プログラムです。これらは着信接続を受け入れます。
さらに詳しく知るための参考資料:
[1]https://en.wikipedia.org/wiki/Port_(コンピュータネットワーク)
[2]https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure同様にhttps://en.wikipedia.org/wiki/IPv4_header#ヘッダー
答え2
を実行するときはlisten
、ポートは既知のものである必要があるため、ポートを指定します。この端末には IP (または複数の IP) とポートがあります。
を実行するときは、connect
リモート サーバーの IP とポートを指定しますlisten
。ローカル IP は OS によって決定され、ポートが割り当てられます (任意の番号を指定できます)。
これにより、接続は識別され( (remote IP, remote port), (local IP, local port) )
、任意の 1 つの IP アドレスから各リモート ポートへの接続の上限が 64K に設定されます。