TCP, 65535'ten fazla bağlantı noktası sağlayabilir mi?


50

Bir Linux sistemini 65.535 porttan daha fazlasını sağlayacak şekilde ayarlamak mümkün müdür? Amaç, belirli bir sistemi dinleyen 65 binden fazla servise sahip olmak olacaktır.

Açıkça kullanılan portlar var, bu sebeplerden dolayı bu mümkün değil, bu yüzden bunun gibi bir şeyi yaparken TCP'nin kısıtlayıcı olduğunu anlamaya çalışırken teorik bir alıştırma olarak düşünün.


11
Bu soru için motivasyon nedir? Neden bu kadar çok kadının dinlemesini istiyorsun?
Warren Young,

1
Ayrıca, birçok işlemi başlatmak için zor zamanlar geçireceksiniz. (Daemon başına bir işlem demek istediğinizi varsayıyorum.)
Warren Young

13
Resmen bir kerede 65 çift pantolon giymenizi kısıtlayan hiçbir şey olmamasına rağmen, denemek pratik bir aptallık olurdu. Bana aynı anda 10.000 TCP portunu verimli bir şekilde işleyen bir makine gösterebilirseniz, bu ilginç bir soyut soru olabilir.
msn

13
Bu Q'nun niteliği tamamen teoriktir, TCP'nin ve bağlantı noktalarının sınırlarını anlamaktan başka bir amaç yoktur.
slm

1
Ancak, onu 64k + daemon işlemlerinin gerektirdiği RAM alanını içeren çeşitli pratik konulara bağlayacak şekilde ifade ettiniz . Şu anda veya sonraki on yıl boyunca sahip olabileceğiniz herhangi bir makinede, dinleyici sınırına ulaşmadan önce RAM'in bitmesi beklenir. Yalnızca TCP dinleyicileri hakkında konuşma sorusunu değiştirirseniz , ödemeler hakkında konuşmayı tamamen dışarıda bırakarak bu sorun ortadan kalkar. Örneğin, her bir iş parçacıklı olay odaklı arka plana bin soket atayarak yığın alanını amorti edebilirsiniz.
Warren Young,

Yanıtlar:


84

TCP için RFC'ye bakınız: RFC 793 - İletim Kontrol Protokolü , TCP başlığının kaynak / hedef port alanı için 16 bit ile sınırlı olmasından dolayı cevabın hayır gibi görünüyor.

    ss # 1

IPv6 bir şeyleri iyileştirir mi?

Hayır. IPv6 bize daha büyük bir IP adres alanı, 32 bit ve 128 bit'e karşılık verecek olsa da, port numaraları için 16 bitlik TCP paket sınırlamasını iyileştirme girişiminde bulunmaz. İlginç bir şekilde IPv6 için RFC: İnternet Protokolü, Sürüm 6 (IPv6) Şartnamesi , genişletilmesi gereken IP alanı.

TCP, IPv6 üzerinden çalıştığında, sağlama toplamını hesaplamak için kullanılan yöntem, RFC 2460'a göre değişir :

IP başlığındaki adresleri sağlama toplamı hesaplamasına içeren herhangi bir taşıma veya diğer üst katman protokolü, 32 bit IPv4 adresleri yerine 128 bit IPv6 adreslerini içerecek şekilde IPv6 üzerinden kullanılmak üzere değiştirilmelidir.

                 ss # 2

Peki nasıl daha fazla port alabilirsin?

Bir yaklaşım daha fazla arayüz kullanarak ek IP adresleri istiflemek olacaktır. Sisteminizde birden fazla NIC varsa, bu daha kolaydır, ancak yalnızca tek bir NIC ile bile, gerekirse daha fazla IP tahsis etmek için sanal arabirimlerden (aka. Takma adlar ) yararlanılabilir.

NOT:iproute2 IP adreslerini tek bir arabirimde (yani eth0) istiflemek için kullanabileceğiniz takma adlar verilmiştir .

Örnek

$ sudo ip link set eth0 up
$ sudo ip addr add 192.0.2.1/24 dev eth0
$ sudo ip addr add 192.0.2.2/24 dev eth0
$ ip addr show dev eth0
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc
      pfifo_fast state DOWN qlen 1000
    link/ether 00:d0:b7:2d:ce:cf brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.1/24 brd 192.0.2.255 scope global eth1
    inet 192.0.2.2/24 scope global secondary eth1

Kaynak: iproute2: ifconfig sonrası yaşam

Referanslar


3
Yalnızca hedef portu kullanarak 65.536+ numaradan birini seçmek mümkün olmazdı, ancak eğer biri sınırsız hafızaya ve bant genişliğine sahipse, gelen her portta her TCP adresiyle 32.000'den fazla bağlantıya sahip olabilirdi.
Supercat

7

Bir Linux sistemini 65.535 porttan daha fazlasını sağlayacak şekilde ayarlamak mümkün müdür?

Hayır!

Amaç, belirli bir sistemi dinleyen 65 binden fazla servise sahip olmak olacaktır.

O zaman ihtiyacın var:

  • iptablestrafik içeriğine yönlendiren bir yapılandırma veya

  • tek bir porttan gelen bağlantıları kabul edecek ve "arkasındaki" uygun servise yönlendirecek bir "servis broker servisi" veya "çoklayıcı servis". Standart protokollerin değiştirilmemiş olarak geçmesini istiyorsanız, bu çoklayıcı hizmetinde bir IDS veya katman 7 güvenlik duvarının analiz edeceği şekilde protokol koklama / tanıma uygulamanız gerekebilir; Protokollerin büyük çoğunluğu ile tamamen mümkün.

İkinci öğeye göre, gerçekten isterseniz, bu hizmeti 2 ^ 16 "bağlantı noktasını" aşacak şekilde tasarlayabilirsiniz. Performansın, çalışan 2 ^ 16 + dinleyicinin yüküne kıyasla minimum düzeyde olacağından eminim.

Linux'daki servisler, dosya sistemindeki unix soketlerini dinleyebilir, bu nedenle "multiplexor hizmetiniz" harici bir bağlantı noktası <-> iç unix soketinin dahili eşlemesini koruyabilir. Herhangi bir modern dosya sistemindeki inode bitmeden büyük olasılıkla bir çekirdek işlem sınırına (32Kbayt işlemler?) Girersiniz.


Bunu reddettim çünkü bunun mümkün olmadığını söylüyorsunuz, daha sonra çok kafa karıştırıcı bir yol olsa da birden fazla IP kullanarak ve yük dengelemeyi nasıl yapacağınızı açıklamaya devam edin.
Suprjami

2
Tek bir sistemde 64K'dan fazla bağlantı noktası mümkün değildir. 64K'dan fazla dinleyici muhtemelen mümkündür, ancak gelen bağlantıları doğru gerçek "arka uç" dinleyicilere "ayıran" proxy veya ön uç dinleyicilere sahip olmanız gerekir. Örneğin, bir dahili NAT gibi delice bir şeyi birden fazla dahili IP adresine yapabilirsiniz.
LawrenceC

2
Yanlış. İnsanlar tek bir sistemde yarım milyon eşzamanlı bağlantı kurmayı başardılar. Evet, birden fazla IP ve yük dengeleyici (aynı sistemde olması gerekmez) gereklidir, ancak tek bir sistem 64k porttan daha fazlasını ve hatta doğru yapıldığında 64k dinleyicileri açabilir.
Suprjami

2

Sırf iyi bir cevap olmadığı için içeri girmek istedim.

Bunu yapmanın bir yolu, bağlantı noktası uzantısını belirten bir IP seçeneği eklemektir. Seçenek, IP başlığının isteğe bağlı kısmına uyacak şekilde tasarlanmalı ve bilinmeyen atlamalarla atlanmalıdır.

Kaynağı, hedefi veya her iki port numarasını da genişletmek için bu seçeneği kullanırsınız.

Sınırlamalar, sadece seçeneği yine de ekleyerek mevcut yazılımda otomatik olarak çalışmayacak, ne şekilde uygulanırsa kullanılsın, mevcut yazılım ve güvenlik duvarları paketi görmezden gelecek veya her zamanki gibi işlemden geçirecekler. kaynak ve hedef port alanlarındaki değeri kullanarak.

Kısacası, tekrar kullanmak kolay değildir ve tek bir yeniden kullanılabilir dinleyici ve paketin taşıma kapasitesinde yer alan veriler kullanılarak daha iyi yapılabilir.

Yazılımda bağlantı noktasının yeniden kullanılmasına daha kolay izin verebilirsiniz; bu, sunucunun bağlantı noktalarını birden çok istemci bağlantısı için yeniden kullanarak bu sınırlamanın üstesinden gelmeye yardımcı olabilir.

Örneğin Rtsp, SessionId başlığını, isteğin hangi bağlantı için verildiğini belirlemek için IP paketinin yükündeki çeşitli diğer başlıklar ile birlikte kullanabilir ve buna göre davranarak örneğin mesajın gönderildiği soketin soketinkiyle aynı olmaması durumunda hareket edebilir. Daha sonra oturumun karşılık geldiği uzak adres, bir oturumun işleme için yeni sokette güncellenmesine izin verebilir, mesajı reddedebilir veya uygulamaya bağlı olarak çeşitli diğer eylemler gerçekleştirebilir.

Bir Http sunucusu da bunu veya başka bir sunucuyu yapabilir.

Bağlantı noktalarının yeniden kullanılmasına izin verirken hatırlanması gereken en önemli şey, kaynak IP adresini de dikkate almanız gerektiğidir.


-2

Evet yapabilirsin !

Çevrimiçi ortamda çalışan> 25.000.000 deamonu olan, örneğin Edgehill şifreleme sunucusundan önce yapıldı.


9
OP'nizin bunu nasıl başarabileceğine dair bazı kılavuzlar içerecek şekilde cevabınızı genişleterek, cevabınızı veya ilgili açıklamayı destekleyen belgeleri de düşünün.
HalosGhost

Bu açıklamaya referans verebilir misiniz? Hızlı arama, bunun ne olursa olsun birçok makineye dağıtıldığına inanmamı sağlıyor.
Thomas Guyot-Sionnest
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.