2010-07-25 140 views
0

任何機構都知道如何詳細地與端口綁定的端口號以及端口如何將傳輸層中接收到的數據包轉發到在此端口上讀取的套接字?TCP端口如何綁定

謝謝。

+0

不是編程問題。嘗試:http://serverfault.com/ – gpmcadam 2010-07-25 22:21:43

+0

+1:不適用於serverfault.com。關於數據在應用程序級別通過內核和套接字的途徑的問題。 – sashang 2010-07-26 06:14:39

回答

4

該應用程序使用bind()函數綁定到本地IP地址和端口。在建立連接時,遠程IP地址和端口由連接的另一端決定。

在內核中,在建立tcp連接時,套接字根據包括本地地址,本地端口,遠程地址和遠程端口在內的數據放入散列表中。當傳入的TCP段到達時,這些值將從頭中提取出來,並用於在哈希表中查找相應的套接字。在Linux中,該查找發生在函數inet_lookup_established()中。一個類似的功能,inet_lookup_listener()被用來從一個不同的哈希表中爲一個新連接查找一個監聽套接字;在這種情況下,不使用遠程IP地址和端口。

+0

非常感謝。這對我很有幫助。還有一些問題: 1.如此哈希表屬於TCP層 2.在使用inet_lookup_established()獲取套接字後,如何將數據包轉發給套接字所屬的線程。 3.如果套接字沒有及時讀取入站數據包,套接字緩衝區是否會溢出以及內核如何在發生溢出時處理它。 謝謝! – Alfred 2010-07-26 05:39:24

+0

1.在Linux中,它是IPv4或IPv6層。 2.數據發送到內核中的套接字接收緩衝區;有關詳細信息,請參閱'tcp_data_queue()'的源代碼。然後在調用'recv()'或類似的函數時將數據傳送給應用程序。 3.發送者只能在接收窗口發送數據,所以它必須放慢速度,讀取速度不夠快,接收緩衝區不能溢出。有關詳細信息,請參閱RFC 793。 – mark4o 2010-07-26 15:38:34

+0

可能會進行一些更正,不確定:(對於2.6.32-358,CentOS爲true):__inet_lookup_listener()和inet_lookup_established都使用SAME哈希表(調用tcp_hashinfo)進行查找。 – 2015-01-09 16:10:40