我在同一台主机上运行服务A和服务B.它们使用TCP环回相互连接。每次发送消息并立即关闭连接时,发送方始终会创建新的TCP连接。由于大多数已关闭的连接都处于TIME_WAIT状态,因此在QPS较高的情况下很快就会耗尽短暂的端口。
我想知道使用unix域套接字是否解决了这个问题。它是否与TCP具有相同的TIME_WAIT状态?
答案 0 :(得分:1)
TIME_WAIT是一种TCP构造,旨在防止由于“半开”连接或远程和本地方之间的连接状态未对齐而导致的问题。请参阅第23页的[3]状态图,p33周围的半开连接。
使用Unix套接字,操作系统完全知道套接字两端的连接状态 - 它只是本地的。 在Unix套接字中没有FIN / FIN-ACK握手,并且不需要TIME_WAIT。
我不确定TIME_WAIT是否与本地TCP连接一起使用。它不一定是因为Unix套接字不需要它,但可能仍然存在于a)避免针对异常的仅本地情况进行优化,以及b)避免“localhost”TCP连接和远程之间的行为偏差连接。
从命令行中快速查看:netstat -anop。你永远不会看到处于TIME_WAIT状态的unix套接字。 :)
是的:Unix域套接字应解决“时间等待加载”问题。如果您的接口只是本地接口,那么Unix套接字的处理开销也会减少 - 在那里可以获得一些轻微的性能提升。一旦连接或监听,从API角度来看,它们的行为与TCP套接字无法区分。
参考文献: