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


10

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

私はJavaで少しテストしましたが、これまでのところ可能であるようです。

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

更新:これが私のJavaコードです。これは機能しているようで、netstat -t はポート9990からの2つのアクティブな発信接続(1から9997、1から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 

「適切に設計されたシステムの上限について質問している場合、ほぼ間違いなくDoing It Wrong™です
Chris S

回答:


16

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


2
ありがとう、それは私の質問の理論的な部分に完全に答えます!私はすべてのTCP実装を試さなければならないだろうと思います。
lxgr

5

これは実際には最大値であり、通常は低くなります。たとえば、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であることを示しています。


1

Iainの回答(上記)に加えて、カーネルによる発信接続に許可されるポートは10,000のみである可能性があります。理論的には、アダプターのIPアドレスごとに少なくとも1セットのXX、XXXポートに制限されます。127.1はローカルネットワーク上にあるため、外部からは利用できません。そのため、他のIPアドレス(外部ごとに、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.

これを機能させるには、このスレッドへの回答を読む必要があります


0

はい。これは本当です。

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

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

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


問題は、リスニングアプリケーションの数の上限についてではなく、指摘したように、一意のポート番号の数によって制限されるのではなく、一度に動作するソケットの数についてでした。多くの場合、Webサーバーには数十のソケットがあり、それらすべてが1つのポート80または443にアドレス指定されています。ホスト上の多くのサーバーがそれを行った場合、開いているソケットの数が2 ^ 32を超えられない理由はありません。
Brandon Rhodes

0

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


3
これは、この古い質問にすでに投稿されている回答に新しいものをどのように追加するのですか?
クリスS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.