回答
該應用程序使用bind()
函數綁定到本地IP地址和端口。在建立連接時,遠程IP地址和端口由連接的另一端決定。
在內核中,在建立tcp連接時,套接字根據包括本地地址,本地端口,遠程地址和遠程端口在內的數據放入散列表中。當傳入的TCP段到達時,這些值將從頭中提取出來,並用於在哈希表中查找相應的套接字。在Linux中,該查找發生在函數inet_lookup_established()
中。一個類似的功能,inet_lookup_listener()
被用來從一個不同的哈希表中爲一個新連接查找一個監聽套接字;在這種情況下,不使用遠程IP地址和端口。
非常感謝。這對我很有幫助。還有一些問題: 1.如此哈希表屬於TCP層 2.在使用inet_lookup_established()獲取套接字後,如何將數據包轉發給套接字所屬的線程。 3.如果套接字沒有及時讀取入站數據包,套接字緩衝區是否會溢出以及內核如何在發生溢出時處理它。 謝謝! – Alfred 2010-07-26 05:39:24
1.在Linux中,它是IPv4或IPv6層。 2.數據發送到內核中的套接字接收緩衝區;有關詳細信息,請參閱'tcp_data_queue()'的源代碼。然後在調用'recv()'或類似的函數時將數據傳送給應用程序。 3.發送者只能在接收窗口發送數據,所以它必須放慢速度,讀取速度不夠快,接收緩衝區不能溢出。有關詳細信息,請參閱RFC 793。 – mark4o 2010-07-26 15:38:34
可能會進行一些更正,不確定:(對於2.6.32-358,CentOS爲true):__inet_lookup_listener()和inet_lookup_established都使用SAME哈希表(調用tcp_hashinfo)進行查找。 – 2015-01-09 16:10:40
- 1. 如何將(Clojure)Aleph TCP服務器綁定到TCP v4端口?
- 2. tcp服務器未綁定到特定端口
- 3. 問題與SaltStack Docker-py端口綁定tcp和udp到相同的端口
- 4. 綁定UDP端口
- 5. Python端口綁定
- 6. 關於TCP/IP端口綁定的問題
- 7. 如何在fedora下啓動docker守護進程,使其綁定到tcp端口
- 8. Erlang的TCP端口
- 9. 如何通過TCP端口託管WCF?
- 10. 如何重用撥打的TCP端口
- 11. Boost:我們如何爲TCP服務器指定「任何端口」?
- 12. WCF TCP綁定
- 13. C#TCP/IP自定義IP和端口
- 14. 如何確定Windows進程在C#中使用的tcp端口
- 15. 如何自定義默認的tcp端口號(80)
- 16. 互聯網協議端口vs TCP端口vs UDP端口
- 17. Kaa TCP端口和服務
- 18. 偵聽多個TCP端口
- 19. 用於TCP端口的mktemp
- 20. 誰使用TCP端口?
- 21. TCP端口競爭狀態?
- 22. Mininet tcp的src端口
- 23. MATLAB監聽TCP/IP端口
- 24. WindowsCE 5.0安全TCP端口
- 25. 將QTcpSocket綁定到特定端口
- 26. 如何將原始套接字綁定到特定的端口?
- 27. 如何在C#中綁定webclient對象上的特定端口
- 28. 如何將Web服務綁定到特定的glassfish端口?
- 29. WCF沒有綁定到TCP端口(通過netstat -a進行檢查)
- 30. 我可以將多臺服務器綁定到同一個TCP端口嗎?
不是編程問題。嘗試:http://serverfault.com/ – gpmcadam 2010-07-25 22:21:43
+1:不適用於serverfault.com。關於數據在應用程序級別通過內核和套接字的途徑的問題。 – sashang 2010-07-26 06:14:39