回答
該應用程序使用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. Openshift綁定TCP端口
- 2. 如何將(Clojure)Aleph TCP服務器綁定到TCP v4端口?
- 3. 如何打開TCP端口
- 4. tcp服務器未綁定到特定端口
- 5. boost :: asio :: ip :: tcp :: socket - 如何綁定到特定的本地端口
- 6. 問題與SaltStack Docker-py端口綁定tcp和udp到相同的端口
- 7. 綁定UDP端口
- 8. Python端口綁定
- 9. 關於TCP/IP端口綁定的問題
- 10. 如何在fedora下啓動docker守護進程,使其綁定到tcp端口
- 11. 着讀TCP端口
- 12. Erlang的TCP端口
- 13. 如何使用PHP偵聽TCP端口?
- 14. 如何通過TCP端口託管WCF?
- 15. 如何選擇TCP/IP端口號?
- 16. 如何重用撥打的TCP端口
- 17. 如何禁用MongoDB TCP端口?
- 18. TCP和UDP端口如何具有相同的端口號?
- 19. Boost:我們如何爲TCP服務器指定「任何端口」?
- 20. TCP客戶端無法使用框架綁定到端口0 4.6.1
- 21. WCF TCP綁定
- 22. C#TCP/IP自定義IP和端口
- 23. 特定端口的TCP連接列表
- 24. macos上的端口綁定
- 25. Docker更改端口綁定
- 26. 泊塢端口綁定
- 27. 錯誤:(E107)將接口綁定到端口失敗:接口已綁定到端口:端口'MC8051_ALU()。AM.port_27'(sc_in)
- 28. UDP如何在服務器端用綁定端口recvfrom不同的端口
- 29. 如何確定Windows進程在C#中使用的tcp端口
- 30. 如何自定義默認的tcp端口號(80)
不是編程問題。嘗試:http://serverfault.com/ – gpmcadam 2010-07-25 22:21:43
+1:不適用於serverfault.com。關於數據在應用程序級別通過內核和套接字的途徑的問題。 – sashang 2010-07-26 06:14:39