ServerSocket是否接受任意端口上的返回套接字? [英] Does ServerSocket accept return socket on arbitrary port?

查看:206
本文介绍了ServerSocket是否接受任意端口上的返回套接字?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在java中看到了很多类似于这个问题的答案:假设你在端口5000上有一个带有serversocket的服务器。客户端A和客户端B将连接到我们的服务器。

I've seen many answers similar to this one in regards to serversockets in java: "Let's say you have a server with a serversocket on port 5000. Client A and Client B will be connecting to our server.

客户端A在端口5000上向服务器发出请求。客户端A端的端口由操作系统选择。通常,操作系统选择下一个可用的端口。此搜索的起点是先前使用的端口号+ 1(例如,如果操作系统最近发生在我们的端口45546上,操作系统将尝试45547)。

Client A sends out a request to the Server on port 5000. The port on Client A's side is chosen by the Operating System. Usually, the OS picks the next port that is available. The starting point for this search is the previously-used port number + 1 (so for instance if the OS happened to us port 45546 recently, the OS would then try 45547).

假设没有连接问题,服务器接收客户端A在端口5000上连接的请求。服务器然后打开它自己的下一个可用端口,并将其发送到客户端。这里,客户端A连接到新端口,并且服务器现在再次提供端口5000。

Assuming there are no connection problems, the Server receives Client A's request to connect on port 5000. The Server then opens up its own next available port, and sends that to the client. Here, Client A connects to the new port, and the server now has port 5000 available again."

我在stackoverflow上的多个问题中看到过这样的答案,关于如何使用不同的端口返回accept()的套接字而不是ServerSocket正在侦听的端口。我总是认为TCP由四方信息识别:

I've seen answers like this in multiple questions on stackoverflow about how a different port is used in the returned socket of the accept() than the port that the ServerSocket is listening on. I was always under the impression that TCP is identified by the quartet of information:

客户端IP:客户端端口和服务器IP:服务器端口 - >协议(用于区分TCP)来自UDP)

Client IP : Client Port and Server IP : Server Port ->protocol too (to distinguish TCP from UDP)

那么为什么accept()需要返回绑定到不同端口的套​​接字?在每个标头中发送的四重信息是否能够区分来自不同机器的多个连接到同一服务器端口,而不需要在服务器计算机上使用不同的端口进行通信?

So why would the accept() need to return a socket bound to a different port? Doesn't the quartet of information sent in every header distinguish multiple connections to the same server port from different machines enough where it would not need to use different ports on the server machine for communication?

推荐答案

TCP数据包标题的信息是正确的。它包含:

You are correct in the TCP packet header's information. It contains:

Client IP | Client Port | Server IP | Server Port | Protocol

或者更合适(因为当您考虑双向传输时,客户端/服务器会变得混乱) :

Or, more appropriately (since client/server become confusing when you think about bi-directional transfer):

Source IP | Source Port | Destination IP | Destination Port | Protocol

到同一服务器端口的多个连接将来自不同的端口客户端。例如:

Multiple connections to the same server port will come from different ports on the client. An example may be:

0.0.0.0:45000 -> 1.1.1.1:80
0.0.0.0:45001 -> 1.1.1.1:80

客户端端口的差异足以消除两个套接字的歧义,因此两个独立的连接。服务器不需要在另一个端口上打开另一个套接字。它确实从 accept 方法接收套接字,但它被分配到同一个端口,现在是一条返回新接受的客户端的路由。

The difference in client ports is enough to disambiguate the two sockets, and thus have two separate connections. There is no need for the server to open another socket on another port. It does receive a socket from the accept method, but it's assigned to the same port and is now a route back to the newly accepted client.

FTP,在另一方面,也有一个模型,其中所述服务器将打开一个新的非特权端口(> 1023)并发送回客户端的客户端连接到(这被称为被动FTP)。这是为了解决客户端位于防火墙后面并且无法接受来自服务器的传入数据连接的问题。但是,在典型的HTTP服务器(或任何其他标准套接字实现)中并非如此。它的功能分层在FTP之上。

FTP, on the other hand, does have a model where the server will open a new unprivileged port (> 1023) and send that back to the client for the client to connect to (this is referred to as "Passive FTP"). This is to resolve issues where the client is behind a firewall and can't accept incoming data connections from the server. However, this is not the case in a typical HTTP server (or any other standard socket implementation). It's functionality that is layered on top of FTP.

这篇关于ServerSocket是否接受任意端口上的返回套接字?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆