2009-12-21 34 views
2

我明白,当TCP客户端连接到服务器时,除非明确指定,否则它会自动使用未使用的本地端口。在服务器端,我们有一个监听套接字,在接受新连接时创建一个新的套接字。TCP/IP数据包如何到达特定服务器套接字?

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

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

alt text http://i47.tinypic.com/34o6jrr.png

回答

-2

在服务器上,只有一个开放的端口只是意味着你正在运行一个单一的网站。

+3

请问这个说法回答这个问题(一个例外使用SO_REUSEADDR,它允许你绑定到绑定端口仍处于TIME_WAIT 状态时会)? – Hemant 2009-12-21 06:11:57

+0

你对“网站”的定义是什么? – 2009-12-21 10:27:20

9

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

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

1

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

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

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

出站连接只允许使用未绑定的端口。您可以手动指定它们,或者通过tcp/ip堆栈随机选择一个。

相关问题