连接超时和套接字超时的区别

172

我在使用一个库时遇到了问题。可能是因为库本身的问题,也有可能是我在使用上有误!

基本上,当我执行以下操作时(超时时间以毫秒为单位):

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

没有超时异常被触发,它能正常工作。然而,当我执行以下操作时,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

我遇到了一个Socket异常。

所以,我的问题是为什么我不能模拟一个连接异常?我是否误解了套接字和连接超时之间的区别?该库在这里(目前还未正式发布)。

2个回答

288

连接超时仅在启动TCP连接时发生。这通常发生在远程机器没有响应时。如果您收到ConnectException,则可能的原因是:服务器已关闭,您使用了错误的IP / DNS名称,错误的端口或与服务器的网络连接断开。

套接字超时专用于监视连续的传入数据流。如果指定时间内的数据流中断,则认为连接已停滞/中断。当然,这仅适用于始终接收数据且没有长于配置的套接字超时的延迟的连接。

将套接字超时设置为1000将要求每秒接收新数据(假设您以块方式读取数据,并且块足够大)。

如果仅传入流停顿超过一秒钟,则会遇到超时。

这在HTTP服务器处理需要一些时间才能提供HTTP响应数据的复杂请求时尤其重要。如果将套接字超时配置为10000(10秒),但HTTP服务器在收到HTTP请求后需要15秒,则您永远不会收到响应,因为在10秒后,您将收到SocketTimeoutException(在HTTP请求接收到和HTTP响应准备就绪之间未传输任何数据)。


2
如果服务器没有宕机而是太忙,您是否可能遇到连接超时?或者那将是套接字超时? - Robert
11
这取决于TCP连接是否在服务器超载之前建立,如果是,则会收到一个套接字异常;否则,会收到一个连接异常,表示无法建立TCP连接。 - Robert
2
考虑到老旧移动网络的高延迟,连接超时必须设置为几秒钟(例如10秒或更好的10000毫秒)。如果您不使用多个连接,我只会设置套接字超时,因为HTTP可以在请求后重用连接。 - Robert
1
这是否意味着如果设置了套接字超时(例如1分钟),那么在1分钟的不活动后连接将被终止,而如果未设置超时,则通常会被重新使用? - Robert
2
@Robert 如果服务器太忙,你不一定会得到一个连接异常。这取决于服务器平台,因为它是平台相关的。套接字读取超时并不会中断连接,它只会导致一个SocketTimeoutException异常。是否仍然可以使用该连接是应用程序需要决策的问题。API中并没有明确禁止在套接字上尝试更多I/O的规定。你关于使用多个连接时不使用超时的说法根本没有意义。这里存在太多错误信息。 - user207421
显示剩余8条评论

134

连接超时是程序愿意等待建立与另一个进程连接的最长时间。此时你没有获取或者发布任何应用程序数据,只是建立连接本身。

套接字超时是等待单个数据包时的超时时间。常见的误解是,套接字超时是接收完整响应的超时时间。因此,如果你有一个1秒的套接字超时,并且响应由3个IP数据包组成,每个响应数据包耗费0.9秒到达,总响应时间为2.7秒,则不会发生超时。


5
好的。1. 那么我们可以说SocketTimeout只在连接已经建立时才会出现吗? 2. 如果在接收到3个数据包后5分钟内没有数据流动,那么会在第3个数据包被接收后引发SocketTimeout异常吗? - Saurabh Patil
4
  1. 是的。请参考维基百科关于HTTP协议的技术概述,以确认此事。
  2. 一旦消息的结尾被发送,就不再需要进一步的数据,因此套接字超时不会发生。有关此主题,请参见此答案。
- entpnerd
23
我希望他们把“socket timeout”命名为“idle timeout”,这样更易于理解。 - Manish Maheshwari
1
如果您的套接字超时时间为1秒,并且响应由3个IP数据包组成,每个响应数据包需要0.8秒到达,在第1个和第2个数据包之间有0.3秒的间隔。那么总响应时间仍然是2.7秒,但会出现套接字超时。 - Anderson
1
@Abhi 我认为数据可能没有成功发布,你很可能无法确定服务器是否真正处理了你的请求。你只能说网络分区可能发生了。话虽如此,我认为你在这里真正关心的是服务器的幂等性,要求服务器知道是否已经处理过一个请求。对我来说,使服务器具有幂等性可能比根据超时来推断成功或失败更好地解决你的问题。 - undefined
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接