【问题标题】:Why aren't ServerSocket connections rejected when backlog is full?为什么当 backlog 已满时 ServerSocket 连接不被拒绝?
【发布时间】:2016-01-16 08:18:16
【问题描述】:

无私的好奇...

在 Java 中,我在一个套接字上侦听,积压为 1:

ServerSocket ss = new ServerSocket(4000, 1);

我在 shell 中运行

netcat localhost 4000

很多次 - 到目前为止 5 次。

连接永远不会被拒绝。 netcat 的每个实例都会等待,直到我的 ServerSocket 被销毁。

积压长度为 1 - 这意味着它应该只让一个传入连接排队,然后拒绝,不是吗? (((我不知道队列是否包括第一个 - 现在不重要。))

我知道我可以通过关闭 ServerSocket 来完成这项工作(然后在我准备好时打开另一个),但是......它不应该工作吗?

我理解错了吗?

【问题讨论】:

  • 此行为取决于平台。当积压填满时,Windows 会发出 RST,这会导致“连接被拒绝”。 Unix、Linux 只是丢弃 SYN 数据包。
  • 如果您在 linux 上运行,请阅读veithen.github.io/2014/01/01/…。如果您在其上发送内容,netcat 可能会在几分钟后超时,否则它会认为连接已建立。 (或尝试echo 1 > /proc/sys/net/ipv4/tcp_abort_on_overflow
  • 谢谢。如果这是一个答案,我会接受其中一个:-)

标签: java serversocket


【解决方案1】:

正如我写的here,上面引用的,

此行为取决于平台。当积压填满时,Windows 会发出 RST,这会导致“连接被拒绝”。 Unix、Linux 只是丢弃 SYN 数据包。

NB Backlog 长度不是 1。平台可以上下调整。在早期的 BSD 版本中,历史上最小的最小积压长度为 5。现在在某些平台上是五十甚至五百。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 2017-01-16
    • 2017-08-08
    • 2015-12-21
    • 2018-12-02
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多