web-dev-qa-db-ja.com

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

リスニングソケットを作成すると、記述子(たとえば、ルート記述子)が返され、この記述子をアドレスにバインドします。新しいクライアント接続が利用可能になると、ルート記述子が通知し、その新しい接続を受け入れて、クライアントごとに一意の記述子(たとえばクライアント記述子)を受け取ります。今後は、その記述子を使用してそのクライアントと通信できるようになります。クライアント情報は、クライアント記述子によって示される別の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

[3] https://en.wikipedia.org/wiki/OSI_model

[4] https://en.wikipedia.org/wiki/Netstat

2
Ned64

listenを実行するときは、ポートがよく知られている必要があるため、ポートを指定します。この端には、IP(または複数)とポートがあります。

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

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

0
ctrl-alt-delor