65536 +1 Połączenie w systemie

35

Istnieje 65536 portów dla każdego systemu w sieci i każde połączenie lub Wyślij / Odbierz użyje jednego z nich.

Moje pytanie brzmi: co się stanie, jeśli będziemy mieć 65536 + 1 połączeń ?!

Wiem, że nie dzieje się to normalnie, ale jestem ciekawy, jak radzą sobie z tym systemy operacyjne.

Omid Golparvar
źródło
12
Połączenie zostanie odrzucone. Ale realistycznie będziesz mieć problemy na długo przed 65535 otwartymi połączeniami.
ChrisInEdmonton,
1
@ChrisInEdmonton Nie. Jeśli jest to połączenie wychodzące, pojawi się błąd powiązania, ponieważ nie można przydzielić portu lokalnego. Jeśli jest to połączenie przychodzące, limit portów nie ma zastosowania.
user207421,
jeśli połączenie jest na zewnątrz, otrzymasz połączenie odrzucone, jeśli jest wychodzące, połączenie przez gniazdo będzie błąd. Nie podam tego jako odpowiedzi, ponieważ nie jestem pewien.
Jorge Aldo,

Odpowiedzi:

61

Należy pamiętać, że system może obsługiwać więcej niż 65536 równoczesnych połączeń, ponieważ oni nie koniecznie każdym użyciu oddzielnego portu.

Połączenie TCP lub przepływ UDP jest definiowany przez 4-krotkę:

(source IP address, source port, destination IP address, destination port)

Więc nawet jeśli masz maszynę serwera WWW z jednym adresem IP i pojedynczym pakietem oprogramowania serwera HTTP nasłuchującego tylko na porcie 80, teoretycznie może obsłużyć 65536 połączeń na każdy adres IP klienta, który się z nim łączy . Więc połączenia 64Ki z adresu IP klienta 1, plus połączenia 64Ki z adresu IP klienta 2 itd.

Tak więc protokoły obsługują, zgodnie z pierwszym przybliżeniem, 2 48 połączeń / przepływów do jednego portu TCP lub UDP na jednym adresie IPv4. Rozważ razem zarówno TCP, jak i UDP, a także przestrzeń adresową IPv4 i kosmicznie / komicznie dużą przestrzeń adresową IPv6, i można zauważyć, że same protokoły prawdopodobnie nigdy nie będą źródłem ograniczenia liczby równoczesnych połączeń hosta może obsługiwać.

Podobnie, w protokołach TCP lub UDP nie ma nic, co powstrzymałoby maszynę klienta przed użyciem jednego portu źródłowego na jednym adresie IP do wykonania wielu połączeń wychodzących z różnymi adresami i portami serwera. Czasami sieciowe interfejsy API danego systemu operacyjnego mogą nie ułatwiać tego, ale ważne jest, aby pamiętać, że powiedzmy, że czcigodny stary interfejs API „[BSD] Sockets” jest tylko jednym interfejsem API dla TCP i UDP. TCP i UDP mogą mieć funkcje, które nie są ujawniane przez tradycyjny interfejs API gniazd.

Tak więc liczba równoczesnych połączeń TCP lub przepływów UDP, które dany host może obsłużyć, jest ograniczona nie tyle przez numery portów, ale przez zasoby systemowe, takie jak miejsce w pamięci RAM i czas procesora potrzebny do śledzenia wszystkich tych połączeń i ich obsługi. Również szczegóły specyficzne dla implementacji systemu operacyjnego mogą narzucić sztuczne ograniczenia. Na przykład w uniksowej filozofii „wszystko jest plikiem” może istnieć deskryptor pliku dla każdego połączenia TCP lub przepływu UDP. Jeśli twoje jądro uniksowe ma ograniczenie liczby deskryptorów plików, które może śledzić, ten limit deskryptorów plików jest sztucznym ograniczeniem liczby równoczesnych połączeń TCP lub przepływów UDP, które jądro może obsłużyć.

Spiff
źródło
2
W tej doskonałej odpowiedzi warto umieścić link do en.wikipedia.org/wiki/C10k_problem .
ChrisInEdmonton,
1
Zaimplementowałem serwer TCP, który może obsługiwać 65 534 połączeń z każdego możliwego adresu IP jednocześnie. Nie robi wiele - po prostu echo przychodzącego tekstu z kilkoma zamianami znaków - ale działa na bardzo małej platformie sprzętowej. Nie wydaje mi się, aby był w pełni zgodny z RFC, ale wydaje się, że działa całkiem dobrze, mimo że nie wie ani nie dba o liczbę połączeń TCP otwartych na większości jego portów.
supercat
2
Jeśli naprawdę potrzebujesz połączyć więcej niż 65536 połączeń między dwoma komputerami, możesz skonfigurować komputery tak, aby korzystały z wielu adresów IP. Każdy adres IP dodany do dwóch komputerów zwiększa kwadratową maksymalną liczbę połączeń (przynajmniej teoretycznie, najprawdopodobniej najpierw napotkasz inne problemy).
Lie Ryan,