调用服务时的连接超时与读取超时有什么区别?

5
我正在尝试使用REST Template从Spring MVC应用程序调用REST API。在这样做时,我们必须设置超时值(连接超时和读取超时),并将其保存在YML文件中。
超时时间从YML中读取,并在初始化REST模板时设置。
例如,如果我的情况是: 连接超时= 5秒,读取超时= 3秒
我的问题是什么时候会发生读取超时?
考虑最坏的情况(连接在第5秒建立,意味着在第8秒发生读取超时[在第3秒接收响应]?)
这两个超时是否相互依赖?
我搜索了同样的问题,但没有得到答案,因为我得到的信息是连接超时是用于建立连接的,而读取将在从连接中读取时发生,但不清楚读取超时值是否包括连接超时值。
这可能是一个基本问题,但我很困惑,所以任何关于此事的指导/提示都将有所帮助。
谢谢!

编辑:我已经阅读了 "Spring rest template readTimeOut",它说:时钟从请求第一次命中该套接字开始计时,并在以下情况之一到达时停止:请求完成或达到读取超时但是我理解,在建立连接时也会对套接字进行命中。这是否意味着读取超时也包括连接超时?


可能是 Spring RestTemplate readTimeout 的重复问题。 - Mustafa
@Mustafa谢谢你,Mustafa!我已经阅读了相关内容,它说计数器将在我们触发套接字后开始。这是否意味着它会在“连接建立”之后?我理解,在创建连接时也会有连接请求。 - Kedar Joshi
是的,据我所知,连接超时适用于打开连接,读取超时适用于连接建立后。 - Mustafa
@KedarJoshi 是的,你不能在一个还没有连接的套接字上调用read()。第一次read()必须在连接建立后进行。在大多数情况下,客户端在调用read()之前先向套接字写入数据。 - Antti Rytsölä
1个回答

1
他们是彼此独立的。 假设 httpUrlConntection.setConnectTimeout(10000); httpUrlConntection.setReadTimeout(10000); 所以在 TCP 握手之前我们有 10 秒的时间。一旦读取被触发,我们有 10 秒的时间来读取数据包。如果响应没有完全传输,就会抛出异常。 为了概念上的理解: 套接字连接超时和读取超时有什么区别?

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