2013-09-01 37 views
0

我試圖重現服務器負載過重時的情況,應該有一些連接處於狀態,SYN_SENT通過netcat進行可視化。爲什麼客戶端連接在連接未被接受時顯示爲已建立

我已經創建了一個服務器套接字並從netcat打開了十個連接;我認爲他們會在netstat中顯示爲SYN_SENT,但是隨後是tcpdump,它看起來像內核發送syn-ack,並且客戶端用ack響應並且tcp握手完成,並且它們都是ESTABLISHED。

import java.io.IOException; 
import java.net.ServerSocket; 

public class Server { 

    public static void main(String[] args) throws IOException, InterruptedException { 
     ServerSocket ss = new ServerSocket(9999); 
     Thread.currentThread().join(); 
    } 
} 

所以serversocket.accept並不能起到連接建立的任何角色(決定syn.ack是否要發送),而等待的OS /內核分配爲套接字的IO處理?這種行爲在不同操作系統中是否一致

回答

1

因爲連接建立。調用accept()不是這個的先決條件。系統接受傳入連接並將它們排入積壓隊列。調用accept()只是從隊列中刪除一個項目,在它爲空時被阻塞。

+0

accept()調用將積壓作爲參數。該輸入決定允許的未決TCP連接的最大數量。所以,如果你正在處理大量的連接,那麼請確保你指定一個大的積壓限制來接受()調用。請注意,底層操作系統也可以有自己的限制。例如,Linux有它自己的最大連接限制(我認爲是256),所以如果你指定的積壓超過256,那麼Linux不會採取這種做法,而是使用最大限制256. –

+0

@ManojPandey * listen ()*調用將積壓作爲參數。該平臺可以改變您指定的,上下的,並且無法發現它是否如此,或者有效價值是什麼。在我看來,這應該是對這個問題的答案,而不是對這個答案的評論。 – EJP

+0

嗯,我首先喜歡你的答案(因此,upvoted它!),所以我認爲增加積壓的細節將是一個很好的一個額外的信息給你的答案!我同意,listen()提供的最大限制可能令人驚訝,並且作爲程序員,特別是在編寫連接密集型應用程序時,需要注意這一點。 –

0

SYN_SENT存在於網絡堆棧的較低級別,而不是您在此處使用的級別。使用網絡數據包製作工具來欺騙您所需的連接部件,您可能會獲得更好的結果。

相關問題