ConnectionTimeout 与 SocketTimeout

Posted

技术标签:

【中文标题】ConnectionTimeout 与 SocketTimeout【英文标题】:ConnectionTimeout versus SocketTimeout 【发布时间】:2011-11-13 16:51:00 【问题描述】:

我正在使用的库有问题。可能是图书馆,也可能是我用错了!

基本上,当我这样做时(超时以毫秒为单位)

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

没有产生超时异常并且工作正常,但是,当我执行以下操作时,

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

我得到一个套接字异常。

那么,我的问题是为什么我不能模拟连接异常?我是否误解了套接字和连接超时之间的区别?该库是here(尚未正式发布)。

【问题讨论】:

【参考方案1】:

连接超时仅在启动 TCP 连接时发生。如果远程机器没有应答,通常会发生这种情况。这意味着服务器已关闭,您使用了错误的 IP/DNS 名称、错误的端口或与服务器的网络连接已关闭。

套接字超时专门用于监控连续传入的数据流。如果数据流在指定的超时时间内被中断,则连接被视为停止/断开。当然,这只适用于一直接收数据的连接。

通过将套接字超时设置为 1,这将要求每毫秒接收一次新数据(假设您明智地读取数据块并且块足够大)!

如果只有传入的流停止超过一毫秒,您将遇到超时。

【讨论】:

如果服务器没有关闭但很忙,你会得到连接超时吗?或者那会是套接字超时吗? 这要看——如果在服务器超载之前已经建立了TCP连接你会得到一个socket异常——否则你会得到一个连接异常,表明TCP连接无法建立。跨度> 考虑到特别是旧移动网络的高延迟,连接超时必须设置为几秒(例如 10 秒或更好的 10000 毫秒)。我只会在您不使用多个连接时设置套接字超时,因为 HTTP 可以在请求后重新使用连接。 这是否意味着如果您设置套接字超时(例如 1 分钟),那么连接将在 1 分钟不活动后被终止,而如果没有设置超时,它通常会被重新使用? @Robert 如果服务器太忙,您不一定会收到连接异常。它依赖于平台,在服务器平台上。套接字读取超时不会终止连接。它只会导致 SocketTimeoutException。连接是否仍然可用是应用程序必须做出的决定。当然,API 并没有说您不能在套接字上尝试更多的 I/O。如果您使用多个连接,您关于不使用超时的声明开始没有意义。这里有太多错误信息。【参考方案2】:

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

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

【讨论】:

好的。 1. 那么我们是否可以说 SocketTimeout 仅在 Connection 已建立时才会出现? 2. 如果在收到 3 个数据包后 5 分钟内没有数据流怎么办?收到第 3 个数据包后会不会出现 SocketTimeout 异常? @SaurabhPatil 1. 是的。请参阅Wikipedia's Technical Overview of the HTTP protocol 进行确认。 2. 消息结束后,不再需要数据,因此不会发生套接字超时。有关该主题,请参阅 this answer。 我希望他们将“socket timeout”命名为“idle timeout”。 如果套接字超时时间为 1 秒,响应由 3 个 IP 数据包组成,其中每个响应数据包需要 0.8 秒到达,第一个和第二个数据包之间有 0.3 的间隙秒。那么总响应时间还是2.7秒,但是会有socket超时。

以上是关于ConnectionTimeout 与 SocketTimeout的主要内容,如果未能解决你的问题,请参考以下文章

linux socke编程实例:一个简单的echo服务器程序

SqlCommand.CommandTimeout 和 SqlConnection.ConnectionTimeout 有啥区别?

1.tcp协议 三次握手建链接 四次挥手断开链接 tcp协议的状态 syn洪水攻击与半连接池 互联网协议详解 3. socket介绍 4. 基于socke

网络编程基础day08:socke编程入门

SqlCommand 超时,CommandTimeout 和 ConnectionTimeout 都 = 0

[网络通讯]socke流程解析