2009-12-21 21 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堆棧隨機選擇一個。

相關問題