共计 1159 个字符,预计需要花费 3 分钟才能阅读完成。
一、TCP
和UDP
可以绑定相同的端口吗?
如果有人问你tcp
和udp
可以同时监听相同的端口吗?那么这个问法也不大准确,正确的问法应该是tcp
和udp
可以同时绑定相同的端口吗?
因为监听
这个动作是在TCP
服务端网络编程里才有的,而udp
服务端网络编程根本没有监听
这个动作的。而它们共有的一个动作是bind
端口。
TCP 网络编程如下,服务端执行 listen() 系统调用就是监听端口的动作。
UDP 网络编程如下,服务端是没有监听这个动作的,只有执行 bind() 系统调用来绑定端口的动作。
我们知道,在数据链路层中,通过 MAC
地址来寻找局域网中的主机。在网际层中,通过 IP
地址来寻找网络中互连的主机或路由器。在传输层中,需要通过端口
进行寻址,来识别同一计算机中同时通信的不同应用程序。
所以,传输层的「端口号」
的作用,是为了区分同一个主机上不同应用程序的数据包。
传输层有两个传输协议分别是 TCP
和 UDP
,在内核中是两个完全独立的软件模块。
当主机收到数据包后,可以在 IP
包头的「协议号」
字段知道该数据包是 TCP/UDP
,所以可以根据这个信息确定送给哪个模块(TCP/UDP)处理,送给 TCP/UDP 模块的报文根据「端口号」确定送给哪个应用程序处理。
因此, TCP/UDP 各自的端口号也相互独立,如 TCP 有一个 80 号端口,UDP 也可以有一个 80 号端口,二者并不冲突。
写份简单的TCP
和UDP
服务端的代码验证一下,都是绑定的8080端口,是可以同时启动起来的
所以,TCP
和UDP
是可以绑定相同端口的!
二、多个TCP服务进程可以绑定同一个端口吗?
还是用上面写的tcp服务端的代码来验证
1.两个TCP服务绑定了相同的ip地址
-
第一个tcp服务器启动
-
第二个tcp服务器启动会报错:address already in use
2.两个TCP服务绑定的ip地址不一样
-
第一个tcp服务器启动在 0.0.0.0:8080
-
第二个tcp服务器启动在 127.0.0.1:8080
可以发现启动在不同的IP地址,但是端口相同是可以的。
所以得出结论:只要IP
+Port
有一个不一样就是可以的
3.重启TCP服务进程时,为什么会有“Address in use”的报错?
然后在实践中,我们可能会经常碰到一个问题,当 TCP 服务进程重启之后,总是碰到“Address in use”的报错信息,TCP 服务进程不能很快地重启,而是要过一会才能重启成功。
这是为什么呢?
当我们重启 TCP 服务进程的时候,意味着通过服务器端发起了关闭连接操作,于是就会经过四次挥手,而对于主动关闭方,会在 TIME_WAIT 这个状态里停留一段时间,这个时间大约为 2MSL。
当 TCP 服务进程重启时,服务端会出现 TIME_WAIT 状态的连接,TIME_WAIT 状态的连接使用的 IP+PORT 仍然被认为是一个有效的 IP+PORT 组合