TCP kaynak bağlantı noktasının ana bilgisayar başına benzersiz olması gerekir mi?


10

TCP bağlantısının tuple (kaynak IP, kaynak port, hedef ip, hedef port) tarafından tanımlandığını öğrendim. Teorik olarak, host1: port1'den bir istemcinin server1: port1'e bağlanması ve aynı zamanda host1: port1'den server2: port1'e başka bir istemcinin (host1 üzerinde çalışıyor) olması mümkün olmalıdır.

Java'da biraz test ettim ve şimdiye kadar mümkün görünüyor.

Ancak, kaynak bağlantı noktasının ana bilgisayar adresi için benzersiz olması gerektiğini defalarca okudum, bu da temelde en fazla 65536 eşzamanlı giden TCP bağlantısının zor bir sınırı olduğu anlamına gelir. Bu doğru mu?

Güncelleme: İşte Java kodum. Bu işe yarıyor gibi görünüyor ve netstat -t , 9990 numaralı bağlantı noktasından (bir ila 9997, bir ila 9998) iki etkin, giden bağlantıyı açıkça gösteriyor . En azından modern bir Linux'ta mümkün görünüyor mu?

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);

Ve netstat -t çıktısı (kesilmiş):

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

"İyi tasarlanmış sistemlerin üst sınırlarını soruyorsanız, neredeyse kesinlikle Yanlış Yapıyorsunuz ™ "
Chris S

Yanıtlar:


16

TCP gereksinimi değildir. TCP söz konusu olduğunda, yalnızca kaynak IP, kaynak bağlantı noktası, hedef IP ve hedef bağlantı noktası kombinasyonunun benzersiz olması gerekir. Bununla birlikte, pratikte çoğu TCP API'si, farklı kaynak IP adresleri olmadıkça aynı kaynak bağlantı noktasıyla birden fazla bağlantı oluşturmanın bir yolunu sağlamaz.


2
Teşekkürler, bu sorumun teorik kısmına tamamen cevap veriyor! Her TCP uygulaması için denemek zorundayım sanırım.
lxgr

5

Pratikte genellikle bu daha düşüktür. Örneğin Linux, net.ipv4.ip_local_portgiden bağlantılar için kullanılan bağlantı noktalarını tanımlamak için kernel parametresini kullanır . Bu genellikle

sysctl net.ipv4.ip_local_port_range 32768 to 61000

Sysctl ile mevcut sayıyı artırabilirsiniz.

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

veya /etc/sysctl.conf dosyasını aynı bilgilerle düzenleyebilirsiniz

net.ipv4.ip_local_port_range = 10000 65535

Bulduğum tüm örnekler de minimum değeri 1024 olarak gösteriyor.


1

Iain'nin cevabına ek olarak (yukarıda), çekirdeğiniz tarafından giden bağlantılar için yalnızca 10.000 bağlantı noktasına izin verilebilir, teorik olarak adaptördeki IP adresi başına en az bir XX, XXX bağlantı noktası kümesiyle sınırlısınız. 127.1 beri sonra, yerel ağ üzerinde olmak, dış dünyaya mevcut değildir her biri için diğer IP adresi ( harici ) Eğer 65K noktası aralığında giden bağlantı noktaları bir dizi var.

Yani giden sınır gerçekten:

  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.

Bu işi yapmak için, bu konuya verilen cevabı okumanız gerekir .


0

Evet. Bu doğru.

Bağlantı noktaları ağa bağlanacak uygulamaları içerir.

Aynı ana bilgisayarda TCP ile bağlı 65553 ve UDP ile 65535'den fazla uygulamanız olamaz. İşletim Sistemleri, ağa bağlanan her uygulama için bağlantı noktalarını dinamik olarak dinamik olarak yönetti.

Bir ağ paketi geldiğinde aynı bağlantı noktasını listeleyen iki uygulamanız varsa, bilgisayar hangi uygulamanın verileri dağıtacağını bilemez. Örneğin, aynı bağlantı noktasında aynı bağlantıda Messenger ve Skype varsa, mesajlaşma mesajınız skype ve tam tersi gibi görünecektir :)


Soru, dinleme uygulamalarının sayısının üst sınırıyla ilgili değil - işaret ettiğiniz gibi, benzersiz bağlantı noktası numaralarının sayısıyla sınırlı - ama aynı anda çalışan soket sayısı ile ilgili. Web sunucuları genellikle tek bir bağlantı noktası 80 veya 443'e yönelik düzinelerce sokete sahiptir. Bir ana bilgisayardaki birçok sunucu bunu yaptıysa, açık soket sayısının 2 ^ 32'yi aşmamasının bir nedeni yoktur.
Brandon Rhodes

0

Bir sistemin açık TCP bağlantılarının sayısında bir sınırlama olsa da, normalde kullanılan bağlantı noktası numaralarıyla ilgili bir kısıtlaması yoktur. İyi bir TCP uygulaması aynı soket çiftinin iki kez kullanılmasını önlemelidir. (soket = IP adresi + bağlantı noktası). Bununla birlikte, bağlantı noktası çalma bağlantılarını önlemek için bir işleme atanır ve genel yöntem, bir dinleme bağlantı noktası veya giden bir bağlantı noktası için ücretsiz bir bağlantı noktası istemektir. Bu, yinelenen giden soketleri ve dolayısıyla yinelenen bağlantıları önler. Bu yöntem kullanılmazsa, uygulamanın kendisinin yinelenen bağlantılar oluşturulmasını engellemesi gerekir.


3
Bu nasıl bu eski Soru zaten yayınlanan Yanıtlar yeni bir şey ekliyor ??
Chris S
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.