套接字积压行为

Posted

技术标签:

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

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

以上是关于套接字积压行为的主要内容,如果未能解决你的问题,请参考以下文章

确定TCP listen()队列中当前的积压连接数

c语言套接字编程中的listen()队列长度?

读取时的套接字行为

从套接字读取时出现意外行为

@Transactional 上的 MySQL 套接字超时行为

windows下在非阻塞TCP套接字上使用SO_SNDBUF的奇怪行为