TCP / IP数据包如何到达特定的服务器套接字?

时间:2009-12-21 06:02:04

标签: windows tcp winsock

据我所知,当TCP客户端连接到服务器时,它会自动使用未使用的本地端口,除非明确指定。在服务器端,我们有一个侦听套接字,只要接受新连接,就会创建一个新的套接字。

但是所有服务器套接字都使用相同的本地端口(我用netstat检查过)。我的问题是当所有服务器端套接字通过相同的IP地址和本地端口进行通信时,从客户端发送的数据包如何到达服务器上的特定套接字?

下面是一个telnet快照,显示我的tcp / ip echo服务器使用相同的地址和端口进行2个不同的连接。

alt text

3 个答案:

答案 0 :(得分:9)

当您从客户端连接到服务器时,服务器上的TCP知道客户端的地址和端口。每个单独的连接由4元组(client_ip,client_port,server_ip,server_port)标识和区分。

在您的netstat显示中,本地地址远程(外部)地址的组合唯一标识连接。两个突出显示的连接的外部地址是不同的。

答案 1 :(得分:1)

这基本上是入站和出站连接之间的区别。

在入站连接上,服务器套接字将绑定并侦听给定的ip:端口。传入连接在具有相同ip:port的新套接字上被接受,因为它们是从侦听服务器套接字接受的。

使用netstat时,您应该看到服务器套接字的ip:端口处于Listening状态(对于TCP连接),而多个ip:端口处于Established状态,用于新套接字上接受的传入连接。

出站连接仅允许使用未绑定的端口。您可以手动指定它们,或者通过tcp / ip堆栈随机选择一个。 (例外情况是使用 SO_REUSEADDR ,它允许您绑定到仍处于 TIME_WAIT 状态的绑定端口)

答案 2 :(得分:-2)

在服务器上,只有一个开放端口就意味着您正在运行单个站点。