Czy gniazda TCP i UDP mogą używać tego samego portu?

104

Po pierwsze, czy jest jakiś problem z używaniem zarówno UDP, jak i TCP na tym samym serwerze?

Po drugie, czy mogę użyć tego samego numeru portu?

user800799
źródło

Odpowiedzi:

110

Tak, możesz użyć tego samego numeru portu dla protokołu TCP i UDP. Wiele protokołów już to robi, na przykład DNS działa na udp / 53 i tcp / 53.

Z technicznego punktu widzenia pule portów dla każdego protokołu są całkowicie niezależne, ale w przypadku protokołów wyższego poziomu, które mogą używać protokołu TCP lub UDP, obowiązuje konwencja, że ​​domyślnie mają one ten sam numer portu .

Pisząc swój serwer, pamiętaj, że sekwencja zdarzeń dla gniazda TCP jest znacznie trudniejsza niż dla gniazda UDP, ponieważ oprócz normalnych socketi bindwywołań musisz również listeni accept.

Co więcej, to acceptwywołanie zwróci nowe gniazdo i to właśnie to gniazdo będziesz musiał również odpytać o zdarzenia odbierania. Twój serwer powinien być przygotowany do kontynuowania acceptpołączeń w oryginalnym gnieździe, jednocześnie obsługując wielu klientów, z których każdy będzie wyzwalał zdarzenia odbierania na swoich własnych gniazdach.

Alnitak
źródło
2
@Eric Fortis RFC 1700 jest pełen przykładów, nie wymieniajmy ich wszystkich, dobrze? ;-)
Markiz Lorne
2
@Eric Fortist, dlaczego właściwie „wszyscy wiedzą” o numerach portów NetBIOS?
Markiz Lorne
4
Opublikuj to jako pytanie, abyś mógł udzielić mi odpowiedzi
Eric Fortis,
6
Coś, czego ta odpowiedź nie wyjaśnia: semantyka „portu” jest specyficzna dla każdego protokołu (ale niektóre mogą nie mieć tej semantyki) poziomu transportu (poziom 4 modelu OSI). Zatem TCP ma własne porty, które są interpretowane przez stos TCP; UDP ma własne porty, które są interpretowane przez stos UDP. Czyli mówiąc, porty nie są współdzielone między UDP i TCP; po prostu zdarza się, że oba protokoły mają tę samą definicję „portów” i dla uproszczenia używamy tej samej wartości portu dla wielu połączeń różnych typów do tej samej usługi.
moala
2
@EricFortis Ponieważ takie pytanie nie interesowałoby mnie ani nikogo innego, podobnie jak Twoje powody, dla których uznasz je za interesujące, a także Twoje zastrzeżenia co do przytoczenia jedynego RFC, który jest tutaj, dokładnie w celu, o którym rozmawiamy.
Markiz Lorne
8

Po pierwsze, nie ma problemu z używaniem zarówno tcp, jak i udp na serwerze.

Po drugie, możemy mieć zarówno żądania UDP, jak i TCP na tym samym porcie, ponieważ każde żądanie jest identyfikowane pięciokrotnie przez źródłowy adres IP, docelowy adres IP, źródłowy port, docelowy port, PROTOKÓŁ (protokół może być TCP lub UDP).

aMooly
źródło
3
Powód, dla którego podajesz, jest często podawany, ale tak naprawdę jest bez znaczenia. Nie ma czegoś takiego jak połączenie UDP i nie ma kontekstu, w którym połączenia są brane pod uwagę niezależnie od powiązanego protokołu. Faktem jest, że porty są osobno artefaktami TCP i UDP i dlatego nie ma możliwości ich pomylenia.
Markiz Lorne
Dziękuję za wskazanie mojej winy. Dobrze, że nie ma połączenia przez UDP.
aMooly