从ethreal数据包捕获中,我看到以下对我来说很奇怪的行为:
Client --> Server [SYN]
Server --> Client [SYN, ACK]
Client --> Server [ACK]
Server --> Client [FIN, ACK]
Client --> Server [ACK]
Client --> Server [TCP Segment of a reassembled PDU] (I don't know what this means)
Server --> Client [RST]
关于为什么会发生这种情况的任何想法?
此外,服务器端口是6000.这会导致任何问题吗?
我的另一个疑问:
编辑: 经过一些分析,我发现如果文件描述符的数量超过限制,则服务器发送FIN。但是,在这种情况下,文件描述符似乎没有超出限制。对于其他情况会发生什么?
答案 0 :(得分:9)
经过深入分析,发现以下问题是:
当客户端尝试TCP连接时,即使服务器当前没有调用accept,连接也会通过。如果服务器调用了“listen”函数,它将继续接受连接,直到达到积压限制。
但是,如果应用程序进程超出了它可以使用的最大文件描述符的限制,那么当服务器调用接受时,它会意识到没有可用于为套接字分配的文件描述符并且无法接受调用和TCP连接向另一方发送FIN。
我只是在这里发布这个发现。我仍然把接受的答案留给了哈比的那个答案。
感谢所有回答这个问题的人。
答案 1 :(得分:4)
FIN通常意味着套接字上的另一端叫shutdown(..)
。
答案 2 :(得分:1)
我猜测inetd
或类似的守护程序正在接受连接,然后尝试fork
和exec
另一个程序来处理连接,并且{ {1}}失败(由于资源耗尽)或fork
失败(由于文件不存在,权限错误等原因)。
答案 3 :(得分:1)
可能是TCP wrappers。如果服务器进程是使用libwrap支持构建的,它将接受连接,检查/etc/hosts.allow
和/etc/hosts.deny
,然后在策略拒绝时立即关闭连接。
很容易看出服务器是否使用了libwrap:
> ldd /usr/sbin/sshd | grep libwrap
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1562d44000)
答案 4 :(得分:0)
似乎服务器在接受连接后很快就会调用shutdown
。
答案 5 :(得分:0)