TCP 客户端可以使用相同的端口连接不同的远程 TCP 服务器吗?

TCP 客户端可以使用相同的端口连接不同的远程 TCP 服务器吗?

我想知道 TCP 客户端是否可以使用相同的端口连接到不同的远程 TCP 服务器?

在网络编程中,有两个函数:sendtosend。当我们使用时,send我们不需要指定目的地。这似乎意味着连接的 tcp 套接字只能与一个 (src ip, src port, dst ip, dst port) 4 元组相关。

我可以做类似的事情吗:

 sockfd=socket(AF_INET,SOCK_STREAM,0);

 bzero(&cliaddr,sizeof(cliaddr));
 cliaddr.sin_family = AF_INET;
 cliaddr.sin_addr.s_addr=inet_addr(local_ip);
 cliaddr.sin_port=htons(32000);

 bind(listenfd,(struct sockaddr *)&cliaddr,sizeof(cliaddr));
 connect(sockfd, (struct sockaddr *)&servaddr1, sizeof(servaddr1));
 connect(sockfd, (struct sockaddr *)&servaddr2, sizeof(servaddr2));

 sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr1, socklen);
 sendto(sockfd, buf, len, 0, (struct sockaddr *)&servaddr2, socklen);

例如,http 代理是否可能用尽端口并必须重用端口?

答案1

要回答这个问题,我们可能需要区分 TCP(与 API 无关的协议)和 BSD 套接字(最著名和最广泛采用的 API,应用程序通过它来访问其操作系统的 TCP 堆栈的功能)。

正如您已经注意到的,TCP 协议将每个 4 元组(源 IP、源端口、目标 IP、目标端口)视为一个单独的连接。更改该 4 元组中的任意一项,它就是一个完全独立的连接。因此,是的,TCP 协议可以处理来自单个源 IP 地址和源端口的多个连接。

是否有一种简单的方法可以从古老的 BSD Sockets API 访问该功能可能是另一个问题。

答案2

据我所知,他们可以。

取决于应用程序(在此示例中,假设使用端口 80 的 http)连接会重复使用 1024 以上的端口。0 到 1024 的所有端口都保留用于某些特定用途。任何高于 1024 的端口都可以供任何应用程序使用。

因此,在加载网页时,您从 HTTP(端口 80)请求开始,但随后所有传入的连接、文件和图像都会同时请求,您的本地 PC 将选择一个随机未使用的端口,以连接到端口 80 上的 Web 服务器。

grc.com security 现在对 TCP 及其工作原理进行了很好的解释:https://www.grc.com/sn/past/2011.htm-- TCP 第 1 部分 – 建立连接

我相信其他专家会有他们自己的解释方法,但这是我目前能找到的方法。

有趣的是,有一个网站叫http://www.askmisterwizard.com/创作了关于安全现在剧集,他们还有 2 个关于互联网工作原理的插图视频,可能对学习有帮助(如果你觉得播客内容太冗长,而且缺乏插图的话)

希望这可以帮助。

相关内容