TCP/IP プロトコルはクライアント間でどのように区別するのでしょうか?

TCP/IP プロトコルはクライアント間でどのように区別するのでしょうか?

リスニング ソケットを作成すると、記述子 (ルート記述子など) が返され、この記述子がアドレスにバインドされます。新しいクライアント接続が利用可能になると、ルート記述子から通知が届き、その新しい接続を受け入れて、各クライアントの一意の記述子 (クライアント記述子など) を受け取ります。これ以降、その記述子を使用してクライアントと通信できます。クライアント情報は、クライアント記述子によって指定される別の 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#ヘッダー

[3]https://en.wikipedia.org/wiki/OSI_モデル

[4]https://en.wikipedia.org/wiki/ネットスタット

答え2

を実行するときはlisten、ポートは既知のものである必要があるため、ポートを指定します。この端末には IP (または複数の IP) とポートがあります。

を実行するときは、connectリモート サーバーの IP とポートを指定しますlisten。ローカル IP は OS によって決定され、ポートが割り当てられます (任意の番号を指定できます)。

これにより、接続は識別され( (remote IP, remote port), (local IP, local port) )、任意の 1 つの IP アドレスから各リモート ポートへの接続の上限が 64K に設定されます。

関連情報