代码之家  ›  专栏  ›  技术社区  ›  Jay

TCP-当接受失败时,对等端如何知道?

tcp
  •  2
  • Jay  · 技术社区  · 14 年前

    据我所知,一旦我们用绑定套接字完成了“listen”调用,客户端启动的所有TCP连接都将开始成功,但是,当调用accept时,accept调用可能会失败(由于内存或文件描述符不可用而超出限制等)的可能性很大。

    我在Solaris中运行了一些简单的测试。

    服务器: 1。使用ulimit命令将文件描述符的最大数量减少到8个

    1. 将backlog设置为listen 8。

    2. 听一听。

    3. 在一个循环中呼叫accept 8次,然后进入睡眠状态

    客户:

    1. 连接8个接头。

    2. 去睡觉

    测试结果:

    在客户端,所有连接都通过。 在服务器端,只接受4次通过,4次失败。(这是合理的,考虑到3个文件描述符是标准的,一个用于侦听,然后只有4个连接的空间)。但是,netstat显示所有8个已建立的连接。

    tcp dump,显示所有8个连接的3路握手已成功。服务器什么时候通知客户机上的4个连接失败?(也就是说,它什么时候会向他们发送一个FIN?)

    我还注意到了另一个行为,一旦服务器进入睡眠状态,然后如果我通过ctrl+c终止进程,那么我会发现这4个失败的连接正在发送fin。

    我对这种行为有点困惑。任何帮助都非常感谢。

    1 回复  |  直到 14 年前
        1
  •  2
  •   casablanca    14 年前

    根据您的描述,我猜想操作系统确实建立了所有8个连接,并且将缓冲客户机发送的任何数据(最大到窗口大小)。一旦您的服务器释放了一些FDS并能够接受挂起的连接,您就应该能够读取在此之前发送的任何内容。这也解释了当进程被终止时,为什么连接被终止。

    简而言之:连接确实存在,但是您的程序不能使用它们,因为它没有空闲的FDS。