簡體   English   中英

由accept()返回的新連接的套接字是否始終與偵聽套接字綁定到相同的端口?

[英]Is the new connected socket returned by accept() always bound to the same port as the listening socket?

我在計算機上通過創建新連接直到失敗進行了測試。 在我的機器上,新的connect() / accept()請求在大約700個套接字連接(SOCK_STREAM)處失敗*; 分別在客戶端/服務器的環回IP地址上。 但是,到目前為止,accept()返回的套接字文件描述符始終與偵聽套接字綁定到同一端口。

我的問題是-如果對於所有計算機都正確,那么為什么accept()通過創建僅與偵聽套接字綁定到同一端口的連接套接字來限制連接? 如果將新的套接字綁定到隨機端口(例如connect()是否可以大大增加服務器的連接數量?

另外,為什么accept(sock_fd, NULL, NULL)失敗,並顯示“ EFAULT-addr參數不在用戶地址空間的可寫部分中”。 在一次調用中成功進行了近700次迭代之后?

同樣,為什么connect()失敗並顯示“ EFAULT-套接字結構地址在用戶地址空間之外”。 在一次調用中成功進行了近700次迭代之后?

* EFAULT-錯誤的地址(在兩個accept()/ connect()之后)。

偵聽時,所有連接在連接的接受端都將具有相同的端口(這是最初用於建立連接的標識符)。

如果未使用bind()定義,則連接部件的本地端口號可以是任意值。 對於本地主機設備,這些數字可能可以在某些操作系統上非常快速地回收,因為實際上不需要保留TCP的持續狀態。

當要同時具有多個連接時,可能的連接數量受操作系統中每個進程的資源限制。 對於Unix / Linux,此限制可以調整,如果使用select(),則不建議使FD的數量大於默認值,因為FDSET的libc大小通常與每個進程可用的默認文件描述符數量匹配。 解決此問題的一個技巧是創建套接字,派生子代並讓子代調用accept()。 這樣,每個子代都可以有許多連接(apache和squid使用這種模型),從而增加了同一服務器端口上可能的連接總數。

為什么accept()通過創建僅與偵聽套接字綁定到同一端口的連接套接字來限制連接? 如果將新的套接字綁定到隨機端口(例如connect()),是否可以大大增加服務器的連接數量?

它沒有任何限制。 連接的TCP套接字的“地址”應視為四個參數:srcip,srcport,dstip,dstport。 因此,絕對不需要將accept()的套接字綁定到隨機端口。

另外,為什么accept(sock_fd,NULL,NULL)失敗,並顯示“ EFAULT-addr參數不在用戶地址空間的可寫部分中”。 在一次調用中成功進行了近700次迭代之后?

好吧,這是關於操作系統內部的。 任何用戶進程的資源量可能(並且應該)受到限制。 閱讀您的OS開發人員手冊等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM