我想知道,多个应用程序如何使用相同的网络端口。 TCP协议1端口中的AFAIK被分配给1个套接字连接。那么,例如,多个互联网浏览器如何同时使用端口80/8080? 我可以将多个套接字绑定到同一个端口吗?我怎么能用C ++做到这一点?
答案 0 :(得分:6)
套接字连接由其本地IP:端口和远程IP:端口的组合唯一标识。多个应用程序可以绑定到同一本地IP:端口,只要它们分别连接到不同的远程IP:端口。
如果本地IP:端口已被绑定进行侦听(bind()
并且listen()
已被调用),则其他套接字仍然可以bind()
到同一本地IP:端口但是仅当使用SO_REUSEADDR
(以及在某些平台上,SO_REUSEPORT
)套接字选项时。否则,bind()
失败并且已经在使用""错误。
当多个客户端套接字connect()
到同一个远程IP:端口时,通常不会指定本地绑定,这允许connect()
对随机可用的本地IP执行隐式bind()
:端口以避免与其他连接冲突。如果显式调用bind()
并成功,则调用connect()
连接到远程IP:已连接到本地IP的端口:端口connect()
将失败。
答案 1 :(得分:1)
TCP端口只能有一个侦听插槽用于连接。当通过accept()
或朋友建立连接时,会生成一个代表此连接的新套接字,而单个原始侦听套接字会继续侦听。
答案 2 :(得分:0)
在TCP中,这是一个有状态协议,连接由元组[source_ip,source_port,dest_ip,dest_port]唯一定义(请参阅上面的Eugen Rieck的评论)。因此,理论上,每个客户端(或NAT后面的客户端集)可以在任何16位端口号上连接到服务器(通常减去0-1023的端口)。
当Web服务器正在侦听端口80(例如)传入HTTP连接时,每次客户端尝试向服务器发送HTTP请求时,客户端都会通过其他客户端端口启动TCP连接。因此,多个应用程序如何使用相同网络端口的答案是在另一端使用不同的端口。