2015-10-17 44 views
3

無利害關係的好奇心......當積壓已滿時,爲什麼ServerSocket連接不被拒絕?

在Java中我聽一個插座上,以1積壓:

ServerSocket ss = new ServerSocket(4000, 1); 

在彈我跑

netcat localhost 4000 

很多次 - 5爲止。

連接永遠不會被拒絕。 netcat的每個實例都會等待,直到我的ServerSocket被銷燬。

Backlog長度爲1 - 這意味着它應該只允許一個傳入連接排隊,然後拒絕,不是嗎? ((我不知道隊列中是否包含第一個 - 現在不重要))

我知道我可以通過關閉ServerSocket(然後在準備好時打開另一個)來完成這項工作,但...不應該它工作嗎?

我誤解了嗎?

+1

http://stackoverflow.com/a/20353156/3166303 – leeor

+1

此行爲是依賴於平臺的。當積壓填滿時,Windows會發出RST,導致「連接被拒絕」。 Unix,Linux只丟棄SYN數據包。 – leeor

+0

如果您正在linux上運行,請閱讀http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html。如果你發送了一些東西,netcat可能在幾分鐘後超時,否則它會認爲連接已經建立。 (或者試試'echo 1>/proc/sys/net/ipv4/tcp_abort_on_overflow') – nos

回答

1

正如我寫here,上面引述,

此行爲是與平臺相關的。當積壓填滿時,Windows會發出RST,導致「連接被拒絕」。 Unix,Linux只丟棄SYN數據包。

NB堆積長度不是1.平臺可以調整它的向上或向下。 BSD早期版本中,歷史上最小的最小積壓時間爲5次。現在在一些平臺上已經有五十個甚至五百個了。