Yüksek trafikli siteler 65535'ten fazla TCP bağlantısına nasıl hizmet eder?


29

Bir makinenin sahip olabileceği bağlantı noktalarının sayısı konusunda bir sınır varsa ve bir soket yalnızca kullanılmayan bir bağlantı noktası numarasına bağlanabilirse, çok yüksek miktarlarda (en fazla bağlantı noktası numarasından daha fazla) talep eden sunucular bu sorunu nasıl işler? Sadece sistemi dağıtmak, yani birçok makinedeki birçok sunucuyu dağıtmak mı?

Yanıtlar:


55

Bağlantı noktası numaralarını oldukça yanlış anlıyorsunuz: bir sunucu yalnızca bir bağlantı noktasını dinliyor ve bir bağlantı noktasına bağlanan istemcilerden çok sayıda açık yuvaya sahip olabilir.

TCP seviyesinde, eşzamanlı bağlantı (kaynak ip, kaynak bağlantı noktası, hedef ip, hedef bağlantı noktası) her eşzamanlı bağlantı için benzersiz olmalıdır. Bu, tek bir müşterinin bir sunucuya aynı anda 65535'ten fazla bağlantı açamayacağı anlamına gelir. Ancak bir sunucu (teorik olarak) istemci başına aynı anda 65535 sunucuya sunucu sağlayabilir .

Bu yüzden pratikte sunucu, sunucuya yapılan TCP bağlantılarının sayısıyla değil, sadece ne kadar CPU gücü, bellek vb. İstekleri yerine getirmesi gerektiği ile sınırlıdır.


NAT taşıyıcı sınıfının bunu nasıl etkileyeceğini merak ediyorum
TheLQ

@TheLQ CGN olmadan her müşteri aynı sunucuya 65535'ten fazla bağlantı açamaz, hiçbir müşterinin aynı sunucuya neredeyse bu kadar fazla bağlantıya ihtiyacı yoktur. CGN ile her CGN, aynı sunucuya 65535'ten fazla bağlantı açamaz, bu CGN'yi kullanan tüm müşteriler arasında paylaşılması gerekir. CGN'nin aynı anda bir sunucuya 65535 bağlantı ve başka bir sunucuya 65535 bağlantı açıp açamayacağı, farklı CGN uygulamaları arasında değişiklik gösterebilen bir uygulama detayıdır.
kasperd

CGN'ye daha fazla IP adresi eklenerek veya daha fazla CGN dağıtılarak sınır arttırılabilir. Ancak, yalnızca çift yığın dağıtabilirsiniz. O zaman IPv6 destekli sunuculara bağlantılar CGN'den geçmez, bu yüzden değerli port numaralarını kullanmazlar.
kasperd

14

Yanılıyorsunuz - soketin benzersizliği dört faktör tarafından belirleniyor:

  1. yerel IP adresi
  2. yerel liman numarası
  3. uzak IP adresi
  4. uzak bağlantı noktası numarası

Ağ hizmetleri sunarken, 1. ve 2. genellikle statiktir (örn. IP 10.0.0.1, port 80) ancak tek bir istemciden (veya tek bir NAT ağ geçidinden) binlerce bağlantı beklemiyorsanız , Yerel kaynakların tükenmesinden önce olası 3. ve 4. kombinasyonların sınırları.

Bu nedenle, pratikte bir istemci, farklı bir hedef IP adresine bağlantı açmak için bir bağlantı için zaten kullanımda olan bir bağlantı noktasını kullanmayacak olsa da, bağlantı noktası numarası tükenmesi neredeyse herhangi bir uygulama için sizin sorunlarınızdan en az olacaktır - sunucuda ya da müşteri tarafı.

Sorun, çok sayıda açık dış bağlantı bağlantısı olan istemcilere hizmet veren NAT ağ geçitleri (yönlendiriciler) ile çok gerçek bir problemdir (örneğin, torrentler) - burada NAT için uygun olan port havuzunun boşaltılmasından sonra port numarası tükenmesi göreceksiniz. Bu durumda, NAT ağ geçidi herhangi bir ek ilişki kuramaz, böylece müşterileri internetten etkin bir şekilde keser.


2

Sorun, büyük (> 64k) bağlantı sayısının nasıl yönetileceği idi. En yaygın iki yöntem:

  • Daha fazla sunucu eklemek, src / dst adreslerinin sayısını ve port numarası tuples'ini arttırır. Yükü birden çok sunucu arasında paylaşmanın birden çok yolu vardır; DNS turu robin birdir; diğerleri var

  • "Taşıyıcı sınıfı NAT" dağıtın (benim görüşüme göre ustaca ve doğru bir arkadaşım "crummier dereceli NAT" anlamına gelir). Bu aslında bir NAT'ın NAT'ıdır. Bunun uygulamalar için çok kötü etkileri vardır, ancak bazı büyük sağlayıcıların IPv4 alanı ve / veya bağlantı noktası numaraları tükendiğinde yaptıkları ve / veya IPv6'ya taşınmak istemedikleri şeydir.


2
Başlıktan daha fazlasını okursanız, bu sorunun liman tükenmesi ile ilgili olduğunu ve OP'nin nasıl çalıştığı konusunda yanıldığını görürsünüz. Bu cevap tam olarak buna yeni bir şey ekler mi?
MDMarra

2
OP açıkça (ve sadece başlıkta değil) "sunucular nasıl çok yüksek miktarda talepler yaşıyor?" Diye soruyor. Soketlerin nasıl çalıştığı konusundaki karmaşayı bir kenara bırakmak, bu geçerli bir soru.
user8162 26:13

1
Cümlenin ortasında soruyu kesmek için mükemmel bir iş. O cümlenin geri kalanı diyor: (more than the max port number).
MDMarra

2
Belki de OP’nin soket mekaniğini anlamadığını öngördüğüm kısmı kaçırdın. 64k portları aşmanın tartışma için geçerli bir konu olduğu kanısındayım; Katılmıyorum eğer üzgünüm, ama bu soru WAS ve birkaç cevap verdim ki WAS. Bunun nasıl tepki verdiğini sordunuz; Bu nasıl.
user8162 26:13

3
Sorunun yarısı bu. OP'nin nihai cümlesinin desteklediği gibi daha büyük resim sorusu 64k engelinin nasıl çözüleceğidir.
user8162 26:13
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.