【问题标题】:Socket Backlog behaviour套接字积压行为
【发布时间】:2013-12-19 14:29:57
【问题描述】:

如果 Serversocket 在其积压中充满了请求并且正在执行长时间运行的工作,那么套接字行为将是什么。 当我尝试这个时,从 Windows telnet 可以,它可以连接。但在 unix 上,它会得到 “连接被拒绝”。 我的应用程序是用 java 编写的,并在 IBM jvm 上运行。 顺便说一句,我们的应用程序没有响应来自 unix 的 telnet。 不响应意味着它正在写 “tyring...” 并挂起,而不是拒绝或连接。任何人都可以为这种行为辩护吗? 谢谢。

【问题讨论】:

    标签: java sockets serversocket backlog


    【解决方案1】:

    如果套接字处于 LISTEN 状态,您不应收到“连接被拒绝”。在您用完积压设置提供的插槽之前,您的连接请求应该得到确认(但不会再发生任何事情)。当您达到由listen 系统调用设置的积压限制时,“正在尝试...”是正常行为(服务器丢弃数据包直到侦听积压插槽可用,客户端重新传输 SYN 数据包直到发生连接超时或服务器确认连接请求)。

    【讨论】:

    • 首先感谢您的回答。当我尝试这个时,套接字不在接受(例如,它在接受下面的断点上)(积压达到限制)我接受了连接拒绝。当我使用 netstat 查看时,我看到我的端口处于侦听模式。我永远无法在我的机器上生成“正在尝试..”案例,这是我之前在生产中遇到问题时看到的。
    • 它不需要“接受”。要开始接收连接,只需要bindlisten。然后,每个传入的连接都会被操作系统接受,并在 backlog 参数允许的情况下排队。当应用程序到达accept 时,它会从队列中获取那些已经接受的连接,一次一个。
    • 此行为取决于平台。当积压填满时,Windows 会发出 RST,这会导致“连接被拒绝”。 Unix、Linux 只是丢弃 SYN 数据包。
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 2012-09-02
    • 2013-10-13
    • 1970-01-01
    • 2020-07-22
    • 1970-01-01
    相关资源
    最近更新 更多