我想知道 TCP 客户端是否可以使用相同的端口连接到不同的远程 TCP 服务器?
在网络编程中,有两个函数:sendto
和send
。当我们使用时,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 个关于互联网工作原理的插图视频,可能对学习有帮助(如果你觉得播客内容太冗长,而且缺乏插图的话)
希望这可以帮助。