2011-06-29 82 views
1

有一個系統調用被稱爲socket();它在監聽服務器上創建一個套接字。 我想了解的是服務器創建IP +端口組合。 讓我們說telnet使用端口23. 現在,當客戶端機器進行連接,然後服務器正在偵聽的端口,然後連接沒有在端口23上,實際上它是在不同的端口上。我的混淆是 服務器端也會發生同樣的事情。 例如,我編寫一個服務器來偵聽端口23,然後在服務器端使用不同的客戶端完成連接,這些連接是如何區分的,因爲它們都將位於同一個端口上。所以,如何在同一端口上進行如此多的連接服務器端口。如果有人使用telnet(23)或ftp(21)或ssh(22),那麼許多人仍然可以登錄到服務器上的同一個服務端口,即不同用戶的ssh連接多於一個,其中ssh是隻在端口22處監聽。那麼,socket究竟做了什麼或者如何創建一個套接字呢?與C網絡編程中的套接字相關的問題

UPDATE

我得到了什麼,通過來自客戶機在連接發起的服務器端的其他東西可以處理的IP +端口組合explained.Depending,我想這大概的信息是由套接字文件描述符使用。我看到的是在我們使用如下

connect(sockfd,(struct sockaddr *)&client_address,size_t); 

我們做struct sockaddr *通過在其具有獨特的IP +端口組合我認爲,當服務器收到這個在接受後來的事情進行客戶端connect()系統調用。 我想進一步知道的是在服務器端的說法

accept(server_sockfd,(struct sockaddr *)&client_address,(size_t *)sizeof (struct sockaddr)); 

是否得到從客戶端進行使用連接() 系統調用傳遞相同的CLIENT_ADDRESS?如果是,那麼用於監聽多個客戶端的同一個服務器的socket_descriptor是不同的。我想知道的是當接受來自客戶端的請求時,服務器端的數據結構是如何維護的。

回答

3

的獨特組合標識的連接是:

  • 源地址和端口
  • 目的地址和端口

在您的例子的目的地址和端口是許多連接相同,但每個都來自源地址和端口的獨特組合。

這裏是我的(21端口)的簡要tcpdump會議通過FTP從我的桌面連接到我的服務器:

22:55:50.160704 IP 172.17.42.19.64619 > 172.17.42.1.21: S 2284409007:2284409007(0) win 8192 <mss 1460,nop,nop,sackOK> 
22:55:50.160735 IP 172.17.42.1.21 > 172.17.42.19.64619: S 1222495721:1222495721(0) ack 2284409008 win 65535 <mss 1460,sackOK,eol> 
22:55:50.160827 IP 172.17.42.19.64619 > 172.17.42.1.21: . ack 1 win 8192 
22:55:50.162991 IP 172.17.42.1.21 > 172.17.42.19.64619: P 1:61(60) ack 1 win 65535 
22:55:50.369860 IP 172.17.42.19.64619 > 172.17.42.1.21: . ack 61 win 8132 
22:55:56.288779 IP 172.17.42.19.64620 > 172.17.42.1.21: S 3841819536:3841819536(0) win 8192 <mss 1460,nop,nop,sackOK> 
22:55:56.288811 IP 172.17.42.1.21 > 172.17.42.19.64620: S 454286057:454286057(0) ack 3841819537 win 65535 <mss 1460,sackOK,eol> 
22:55:56.288923 IP 172.17.42.19.64620 > 172.17.42.1.21: . ack 1 win 8192 
22:55:56.290224 IP 172.17.42.1.21 > 172.17.42.19.64620: P 1:61(60) ack 1 win 65535 
22:55:56.488239 IP 172.17.42.19.64620 > 172.17.42.1.21: . ack 61 win 8132 
22:56:03.301421 IP 172.17.42.19.64619 > 172.17.42.1.21: P 1:12(11) ack 61 win 8132 
22:56:03.306994 IP 172.17.42.1.21 > 172.17.42.19.64619: P 61:94(33) ack 12 win 65535 
22:56:03.510663 IP 172.17.42.19.64619 > 172.17.42.1.21: . ack 94 win 8099 
22:56:06.525348 IP 172.17.42.19.64620 > 172.17.42.1.21: P 1:12(11) ack 61 win 8132 
22:56:06.526332 IP 172.17.42.1.21 > 172.17.42.19.64620: P 61:94(33) ack 12 win 65535 
22:56:06.726857 IP 172.17.42.19.64620 > 172.17.42.1.21: . ack 94 win 8099 

你可以看到初始連接是172.17.42.19.64619 <-> 172.17.42.1.21。端口64619是Windows 7盒子在發出連接時選擇作爲源端口的原因。 S這兩行是SYN數據包來回建立連接。然後我開始下一個連接,Windows只使用下一個可用的端口64620.連接172.17.42.19.64620 <-> 172.17.42.1.21形成了我在頂部列出的項目的新唯一元組。只有客戶的端口不同,但這就夠了。每個到達服務器端口的數據包都可以通過源端口進行區分。到達客戶端的服務器上的端口21的每個數據包可以通過目標端口進行區分。

+0

那麼它如何區分連接? –

+0

@註冊:我添加了一個例子。如果這還不夠,試着解釋你的理解,以便我們知道你在想什麼。 –

+0

非常感謝您的回答,我進一步深入瞭解並更新了問題。 –

-1

我會給你Qt的僞代碼來解釋此事。所有TCP服務器都以相同的方式工作。

您首先創建一個偵聽TCP服務器套接字。當傳入的連接請求到達時,操作系統會創建一個新套接字(您的操作系統使用與監聽套接字不同的端口),並將此新套接字與您的遠程客戶端相關聯。 TCP服務器套接字繼續接受新連接,並通過新創建的套接字恢復與遠程對等方的通信。

tcpServer.listen(LocalHost, PORT); 

connect(&tcpServer, SIGNAL(newConnection()),this, SLOT(NewConnection())); 

//Callback that is called when server accepts a new connection 
void NewConnection() 
{ 

    //Here you will have a new socket for communication with the client 
    //The tcpServer will continue listening to given port 

    QTcpSocket* connection = tcpServer.NextPendingConnection(); 

    //Use your new connection to communicate with the remote client... 

} 

我希望這有助於

+0

如果我寫的東西有問題,請解釋!你至少應該表現出輸入評論的禮貌! –

+0

我沒有投下你的問題,其他人也有,我加+1投了票。更重要的是,我不是一個Qt的人,所以不知道。 –

+0

它不分配新的端口。接受的套接字使用與偵聽套接字相同的端口。 – EJP

3

TCP連接是由4個參數確定:

  • 本地IP
  • 本地端口
  • 遠程IP
  • 遠程端口

因此,即使兩個連接共享相同的本地IP和端口,操作系統也可以區分,因爲遠程IP和/或端口將不同。