First of all, is there any problem with using both UDP and TCP on the same server?
Secondly, can I use the same port number?
First of all, is there any problem with using both UDP and TCP on the same server?
Secondly, can I use the same port number?
Yes, you can use the same port number for both TCP and UDP. Many protocols already do this, for example DNS works on udp/53 and tcp/53.
Technically the port pools for each protocol are completely independent, but for higher level protocols that can use either TCP or UDP it's convention that they default to the same port number.
When writing your server, bear in mind that the sequence of events for a TCP socket is much harder than for a UDP socket, since as well as the normal socket
and bind
calls you also have to listen
and accept
.
Furthermore that accept
call will return a new socket and it's that socket that you'll then have to also poll for receive events. Your server should be prepared to continue accept
ing connections on the original socket whilst simultaneously servicing multiple clients each of which will be triggering receive events on their own sockets.
Firstly,there is no problem using both tcp and udp on the server.
Secondly,we can have both UDP and TCP requests on same port ,because each request is identified by a quintuple contained by source IP ,Destination IP, Source Port, Destination Port, PROTOCOL(as protocol can be TCP or UDP).
Quick nc
experiment showing that you can use the same port for TCP/UDP simultaneously
Tested on Ubuntu 23.10, nc
from the netcat-openbsd package, based on my other answer: https://mcmap.net/q/45836/-http-test-server-accepting-get-post-requests we can launch a simple server that listens forever on TCP port 8000 with:
nc -kdl 8000
From man nc
we know that the -u
flag uses UDP instead of TCP, let's try and launch another listener at the same time with -u
from another shell:
nc -kdlu 8000
And now, we can send messages to either TCP or UDP, and the correct listener will always get the message, for TCP:
echo asdf | nc localhost 8000
and for UDP:
echo asdf | nc -u localhost 8000
and the corresponding listener then prints asdf
to stdout.
Another way to check that both are actually listening on the same port number but on different domains is:
sudo netstat -tupan | grep 8000
which gives:
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 214312/nc
udp 0 0 0.0.0.0:8000 0.0.0.0:* 227612/nc
There is however a complicating factor that I only learned about when writing this answer, if we launch another two listeners with and without -u
:
nc -kdl 8000
nc -kdlu 8000
then this version of nc
does not complain. This is because as we can see with strace
, bind
is done with SO_REUSEPORT
, related threads:
So now that we have four nc
running, netstat
gives:
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 237988/nc
tcp 0 0 0.0.0.0:8000 0.0.0.0:* LISTEN 214312/nc
udp 0 0 0.0.0.0:8000 0.0.0.0:* 237673/nc
udp 0 0 0.0.0.0:8000 0.0.0.0:* 227612/nc
and when we send the requests, the TCP and the UDP requests are randomly routed to either one of the two of the listeners of the corresponding type.
© 2022 - 2024 — McMap. All rights reserved.