リスニングソケットを作成すると、記述子(たとえば、ルート記述子)が返され、この記述子をアドレスにバインドします。新しいクライアント接続が利用可能になると、ルート記述子が通知し、その新しい接続を受け入れて、クライアントごとに一意の記述子(たとえばクライアント記述子)を受け取ります。今後は、その記述子を使用してそのクライアントと通信できるようになります。クライアント情報は、クライアント記述子によって示される別のiノードに格納されます。このため、Linuxはそれぞれのクライアントデータをそれぞれの記述子に配信することができました。
私が言及した上記が正しい場合(私の理解が間違っている場合は親切に私を訂正してください)、私は疑問を抱きました。 iノードに格納されているクライアント情報は何ですか? Linuxによってクライアントはどのように一意に識別されますか?
TCP/IPおよびUDP/IPプロトコルは、ローカルおよびリモートのIPアドレスとポートによって定義される「セッション」を認識しています[1]。たとえば、TCP/IPパッケージには、送信元とターゲットのIPアドレスとポートが含まれます[2]。複数の接続が開いているサーバーまたはクライアント(Firefoxなど)は、OSI [3]セッション層でアドレスとポートによって区別されます。
Webブラウザを使用しながら、シェルを開いてrootとして実行してください
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がどのパケットがどの要求に対する応答であるかを認識するように、異なるローカルポートを持つFirefoxによる「ESTABLISHED」接続を示しています。
LISTEN状態の他の行は、サーバープロセスとして実行されているローカルプログラムです。これには、sshd
(セキュアシェルサーバー)、cupsd
(プリンターデーモン)、named
(バインドネームサーバー)が含まれます。 。これらは着信接続を受け入れます。
詳細については、以下を参照してください。
[1] https://en.wikipedia.org/wiki/Port_(computer_networking)
[2] https://en.wikipedia.org/wiki/Transmission_Control_Protocol#TCP_segment_structure および https://en.wikipedia.org/wiki/IPv4_header#Header
listen
を実行するときは、ポートがよく知られている必要があるため、ポートを指定します。この端には、IP(または複数)とポートがあります。
connect
を実行するときは、リモートlisten
erのIPとポートを指定します。ローカルIPはOSによって決定され、ポートが割り当てられます(任意の数にすることができます)。
接続は( (remote IP, remote port), (local IP, local port) )
で識別できます。これにより、任意の1つのIPアドレスから各リモートポートへの接続の上限が64Kになります。