Modern bir Linux kutusunun sahip olabileceği teorik maksimum açık TCP bağlantısı sayısı nedir?


236

Donanımdan sonsuz performans varsayarsak, bir Linux kutusu 65536'dan fazla açık TCP bağlantısını destekleyebilir mi?

Geçici bağlantı noktalarının sayısının (<65536), bir yerel IP'den bir uzak IP'deki bir bağlantı noktasına bağlantı sayısını sınırladığını anlıyorum.

Tuple (yerel ip, yerel bağlantı noktası, uzak ip, uzak bağlantı noktası) bir TCP bağlantısını benzersiz olarak tanımlayan şeydir; bu, bu parametrelerden birden fazlası ücretsizse 65K'dan fazla bağlantının desteklenebileceği anlamına gelir. örneğin, birden çok yerel IP'den birden çok uzak ana bilgisayarda tek bir bağlantı noktası numarasına bağlantı.

Sistemde 16 bitlik başka bir sınır var mı? Belki dosya tanımlayıcı sayısı?

Yanıtlar:


350

Tek bir dinleme bağlantı noktası aynı anda birden fazla bağlantıyı kabul edebilir.

Sıklıkla belirtilen bir '64K' sınırı vardır, ancak bu sunucu bağlantı noktası başına istemci başınadır ve açıklığa kavuşturulması gerekir.

Her TCP / IP paketinin adresleme için temel olarak dört alanı vardır; bunlar:

source_ip source_port destination_ip destination_port
< client            > < server                      >

TCP yığının içinde, bu dört alan paketleri bağlantılarla eşleştirmek için bir bileşik anahtar olarak kullanılır (örneğin, dosya tanımlayıcıları).

Bir istemcinin aynı hedefte aynı bağlantı noktasına çok sayıda bağlantısı varsa, bu alanlardan üçü aynı olur - yalnızca source_portfarklı bağlantıları ayırt etmek için değişir. Bağlantı noktaları 16 bitlik sayılardır, bu nedenle belirli bir istemcinin herhangi bir ana bilgisayar bağlantı noktasına maksimum bağlantı sayısı 64K'dır.

Bununla birlikte, birden çok istemcinin her birinin bir sunucunun bağlantı noktasına 64K'ya kadar bağlantısı olabilir ve sunucuda birden çok bağlantı noktası varsa veya bu bağlantılardan herhangi biri birden çok ağ bağlantılıysa, bunu daha da çoğaltabilirsiniz.

Yani asıl sınır dosya tanımlayıcılarıdır. Her bir soket bağlantısına bir dosya tanımlayıcı verilir, bu nedenle sınır gerçekten sistemin izin vermek üzere yapılandırılmış dosya tanımlayıcılarının sayısı ve kaynakların işlenmesini sağlar. Maksimum sınır tipik olarak 300K'nın üzerindedir, ancak örneğin sysctl ile yapılandırılabilir .

Normal kutular için övülen gerçekçi sınırlar, örneğin tek iş parçacıklı Jabber mesajlaşma sunucuları için yaklaşık 80K'dır.


3
(A) SO_REUSEADDR kullanıyorsanız ve (b) farklı hedef IP adreslerini hedeflerseniz teorik olarak 64K'dan fazla giden bağlantınız olabilir. Ancak çekirdek bellek sınırları muhtemelen ilk önce sizi durduracaktır.
Darron

4
Sysctl limiti tüm sistem içindir, değil mi? Ayrıca, bir işlem için maksimum dosya tanımlayıcı sayısını sınırlayan ulimit ile yapılandırılabilir bir sınır vardır. Bu varsayılan olarak 300K, genellikle
1024'ten

1
Hafif bir teknik özellik: İstemci makinede bir yönlendiriciden atanmış birden fazla IP adresi olabilir. Bunların hepsi tek bir MAC'a atanabilir veya makinenin ek IP adresleri için birden fazla fiziksel ağ arabirimi olabilir. OP 1 IP belirtti, ancak başkaları için daha fazla IP adresi ekarte etmemek önemlidir.
Todd

2
@ Güzel açıkladı !! Very helpful ... + 100 upvotes vermek istiyorum ... teşekkür ederim :-)
Tom Taylor

1
Tcp_fin_timeout'un aynı soketi (kaynak, hedef, bağlantı noktası birleşimi) varsayılan olarak 60 saniye daha engellediğini unutmayın; bu, bağlantıların sık sık kesilmesi ve yeniden bağlanması durumunda iki sistem arasındaki gerçekte kullanılabilir tcp bağlantısı sayısını büyük ölçüde azaltır. TIME_WAIT durumunda (her zaman desteklenmez) yuvaların yeniden kullanılmasına (tcp_tw_reuse = 1) izin verilerek veya bu zaman aşımının daha düşük bir değere düşürülmesinde TCP / IP standardının kırılmasıyla (genellikle her durumda iyi çalışır) bu sorun en aza indirilebilir.
fgwaller

17

Bir sunucu çalıştırmayı ve bir makineden kaç bağlantı sunulabileceğine karar vermeye çalışıyorsanız , C10k problemini ve aynı anda çok sayıda istemciye hizmet vermedeki potansiyel sorunları okumak isteyebilirsiniz .


14
C10k 10 yaşında ve artık eğlenceli değil. [Bunu okuyun] C1024K'nın nasıl ele alınabileceğini görmek için.
Chandranshu

@Chandranshu - bunu mu demek istediniz metabrew.com/article/... ?
Mikko Rantalainen

1
@MikkoRantalainen - evet. Şimdi daha iyi kriterler olduğunu düşünüyorum. Phoenix adamları bunu zaten 2 milyon eşzamanlı bağlantıya itti.
Chandranshu

3
@Chandranshu - 12M bağlantılı Dell demosu var: mrotaru.wordpress.com/2013/06/20/…
Mikko

1
Birkaç yıl önce: Intel Atom D2700, 2GB RAM, 1.2M eşzamanlı bağlantılar. Ben test sorunları Windows kutuları ile vardı sadece sorunları vardı; Bunlar, Intel Atom kutusunu DoS denerken düzenli olarak göbek yaptı ...
Klaws

12

Bir ham soket ( SOCK_RAW) kullandıysanız ve kullanıcı ülkesinde TCP'yi yeniden uyguladıysanız, yanıtın bu durumda yalnızca (local address, source port, destination address, destination port)tuples sayısı ile sınırlı olduğunu düşünüyorum (yerel adres başına ~ 2 ^ 64).

Tabii ki tüm bu bağlantıların durumunu korumak için çok fazla bellek gerekir ve bence çekirdek TCP yığınının sizin adınıza üzülmesini ve / veya yanıt vermesini önlemek için bazı iptables kuralları ayarlamanız gerekir.

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.