web-dev-qa-db-ja.com

TCP送信元ポートはホストごとに一意である必要がありますか?

TCP接続はタプル(ソースIP、ソースポート、宛先IP、宛先ポート)によって識別されます。理論的には、Host1からクライアントを持つことができるはずです。 port1はserver1:port1に接続すると同時に、Host1:port1からserver2:port1への別のクライアント(Host1で実行中)に接続します。

私はJavaで少しテストしましたが、今のところそれは可能だと思われます。

ただし、送信元ポートがホストアドレスに対して一意である必要があることを何度も読みました。これは、基本的に、最大65536の同時送信のハード制限があることを意味しますTCP接続。それは本当だ?

更新:これが私のJava=コードです。これは機能するようです。netstat-tは、ポート9990からのアクティブな発信接続を明確に示していますtwo 9998)。少なくとも最近のLinuxでは、それは可能だと思われますか?

Socket s1 = new Socket();
s1.setReuseAddress(true);
SocketAddress saremote = new InetSocketAddress("localhost",9999);
SocketAddress salocal = new InetSocketAddress("localhost",9990);
s1.bind(salocal);
s1.connect(saremote);


Socket s2 = new Socket();
s2.setReuseAddress(true);
SocketAddress saremote2 = new InetSocketAddress("localhost",9998);
SocketAddress salocal2 = new InetSocketAddress("localhost",9990);
s2.bind(salocal2);
s2.connect(saremote2);

そしてnetstat -t出力(切り捨て):

tcp6       0      0 localhost:9990          localhost:9998          CONNECTED 
tcp6       0      0 localhost:9990          localhost:9999          CONNECTED 
10
lxgr

TCP=要件ではありません。TCPに関する限り、送信元IP、送信元ポート、宛先IP、宛先ポートの組み合わせのみがただし、実際には、ほとんどのTCP APIは、送信元IPアドレスが異なる場合を除き、同じ送信元ポートで複数の接続を作成する方法を提供していません。

16
David Schwartz

これは実際には最大値で、通常は低くなります。たとえば、Linuxはnet.ipv4.ip_local_portカーネルパラメータは、アウトバウンド接続に使用されるポートを定義します。これは通常のようなものです

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Sysctlで利用可能な数を増やすことができます。

sysctl -w net.ipv4.ip_local_port_range="10000 64000"

または、同じ情報で/etc/sysctl.confを編集できます

net.ipv4.ip_local_port_range = 10000 65535

私が見つけたすべての例は、最小値も1024であることを示しています。

5
user9517

Iainの回答(上記)に加えて、カーネルによる発信接続に許可されるポートは10,000のみである可能性があります。理論的には、アダプターのIPアドレスごとに少なくとも1セットのXX、XXXポートに制限されます。 127.1は外部ネットワークでは利用できず、ローカルネットワーク上にあるため、for eachother IP address(external)65Kポート範囲内に送信ポートのセットがあります。

したがって、発信制限は本当に:

  With 1 IP Address: XX,XXX (or 2 x XX,XXX on internal network)
  With 2 IP addresses: 2 x XX,XXX (or 3 x XX,XXX on internal network)
  With 3 IP addresses: 3 x XX,XXX (or 4 x XX,XXX on internal network)
  etc.

これを機能させるには、 this thread に対する回答を読む必要があります。

1
djangofan

システムは、オープンTCP接続の数に制限がある場合がありますが、通常、使用されるポート番号に関して制限はありません。ただし、適切なTCP実装は、同じソケットのペアを2回使用することを防止します(ソケット= IPアドレス+ポート)。ただし、ポートはプロセスに割り当てられ、接続を盗むのを防ぎます。通常の方法は、リスニングポートまたは送信用の空きポートを要求することです。これにより、発信ソケットの重複、したがって接続の重複が防止されます。この方法を使用できない場合、アプリケーション自体が接続の重複を防止する必要があります。

0
Papou

はい。これは本当です。

ポートはバインドし、アプリをネットワークに接続します。

TCPおよび65535で接続された65553を超えるアプリケーションを同じホスト上のUDPで接続することはできません。オペレーティングシステムは通常、ポートを管理し、ネットワークに接続する各アプリに1つ割り当てます。

ネットワークパッケージが到着したときに同じポートに2つのアプリケーションがリストされている場合、コンピューターはどのアプリがデータを配信するのかを知ることができませんでした。例として、同じポートにバインドされた同じ上にメッセンジャーとSkypeがある場合、メッセンジャーメッセージはスカイプに表示され、逆も同様です:)

0
Ricardo Polo