我对一些networking理论有所误解,因为我在网上找不到一个明确的答案(大多数资料是理论和理论等,没有简明的例子),我在这里问。
假设我有一台IP 10.10.10.10的服务器监听端口80和两个IP 20.20.20.20和IP 30.30.30.30客户端,当两个客户端连接到端口80上的服务器时,会发生什么情况?
可以…
A.服务器接受两个客户端在端口80上的连接,并创build两个sokets:
server IP: 10.10.10.10 server port: 80 client IP: 20.20.20.20 client port: whatever port client 1 used to connect
和
server IP: 10.10.10.10 server port: 80 client IP: 30.30.30.30 client port: whatever port client 2 used to connect
那么当新的数据包从客户端到达端口80时,它们将根据客户端IP和端口被分派到相应的套接字?
要么…
B.服务器只接受端口80上的连接,并在客户端连接时分配其他端口与客户端进行通信? 所以现在我们仍然创build了两个套接字,但是像这样:
server IP: 10.10.10.10 server port: random free port client IP: 20.20.20.20 client port: whatever port client 1 used to connect
和
server IP: 10.10.10.10 server port: another random free port client IP: 30.30.30.30 client port: whatever port client 2 used to connect
而端口80仍然可以自由接受其他连接?
那是哪个呢?
我很抱歉,如果这个问题听起来很愚蠢或新鲜,但我发现在网上提到,他们不能都是真实的。 我认为其他人也有同样的困惑,这里一个清晰而简洁的答案可能是非常有帮助的。
套接字由(源IP,源端口,目的IP,目的端口)组合唯一标识,所以你的A场景是正确的。
如果B是这样,请花点时间仔细考虑一下分歧。 如果目标端口不断变化,防火墙几乎是不可能的 – 服务器和networking设备之间需要进行持续的通信,服务器会通知防火墙接受stream量的位置。 出于这个原因和其他许多人,这将是噩梦。
这比你想象的要容易得多。
服务器监听端口80,它从20.xx获得一个包,所以知道20.xx想要这样做,然后发送回20.xx. 然后30.xx来到80端口,直接回应30.xx。
就是这样,没有什么更复杂的了。
这有点像在电话中,你可以听到两个不同的人在说话,你可以听到你的妻子问你什么时候回来,你可以用“五个亲爱的”回答,你可以听到你的孩子为你尖叫拿回冰淇淋,说'不要上床' – 全部倒在一条线上。 认真的,这是关于我能想到的最好的比喻对不起:)