如何理解java socket与connection timeout?

Java

1 前言

一个问题,一篇文章,一出故事。
笔者最近收到开发的通知,说生产环境的程序链接不上MongoDB,以Java的程序报如下错误提示,

#...
Caused by: java.net.SocketException: Connection timed out (Read failed)
#...

通过整理文章了解到,以下“timeout”有区别,

#...
Caused by: java.net.SocketTimeoutException: Connection timed out
Caused by: java.net.ConnectException: Operation timed out (Connection timed out)
#...

以上区别,笔者为了读者容易理解,提前把文章的核心做一个总结,
– “SocketTimeout”错误发生于OSI第7层,即应用层
– “Connection timed”错误发生于OSI第3、4层,即网络层与传输层
– “Socket”基于“Connection”之上工作
– “socket timeout”错误出现应该首先考虑软件定义的套接字超时阈值问题
– “Connection timed”错误出现应该首先考虑连接主机、端口、协议定义问题或网络故障

2 最佳实践

2.1 套接字

– 套接字即网络套接字的简称(Network Socket)
– 套接字是计算机网络的网络节点内的软件结构,充当通过网络发送或接受数据的端点
– 套接字的结构和属性由网络体系结构的应用程序编程接口(API)定义
– 套接字仅在节点中运行的应用程序进程的生命周期内创建
– 套接字地址(传输协议、IP地址、端口)从外部标识给其他主机
注:由以上可知套接字是工作在OSI的第7层

2.2 套接字超时

2.2.1 套接字超时的介绍

– “socket timeout”是从套接字连接到连接断开的规定时间量
– “socket timeout”专门用于监视连接传入的数据流
– “socket timeout”如数据流在指定时间内中断,则连接被视为停止/断开(适用于始终接收数据的连接)

2.2.2 套接字超时的作用

– “socket timeout”用于防止套接字在等待另一端连接时由于长期保持打开状态而遭受恶意攻击
– “socket timeout”用于检测API(OSI第7层,即应用层)的链接中断

2.2.3 套接字超时的使用方法

– “socket timeout”需要在客户端或服务器端定义Timeout值

2.2.4 套接字超时的分类

– Timeout可分为“connect timeout”、“read timeout”、“write timeout”
– “read timeout”与“write timeout”基于建立连接(connect)之后执行(7层基于3、4层的网络连接)

2.3 连接超时

2.3.1 连接超时介绍

– “Connection timed”是指必须在规定时间范围内与指定的服务器建立连接,否则抛出异常
– “Connection timed”仅在启动TCP连接时发生,此提示意味着远程主机没有回应
– “Connection timed”意味服务已关闭或使用错误的IP、DNS名称、端口或与服务器网路连接断开

2.3.2 连接超时作用

– 检测TCP/IP(OSI第3、4层)的链接中断

2.4 超时与TCP三次握手


– Client发送SYN,Server收到后回复SYN_ACK
– Client再次回复ACK,此时Client完成“connect()”调用并进入ESTAB状态
– 如因网络或它因致SYN_ACK接收失败,则重试SYN(由内核参数net.ipv4.tcp_syn_retries控制次数)
– 如Client重试发送SYN达到极限值后SYN_ACK仍无法收到,则“connect()”抛出“connection timed”
– 如Client重试发送SYN期间,Client的“sock timeout”达到等待最大值“connect()”抛出“timeout”
如果你不熟悉内核参数“net.ipv4.tcp_syn_retries”,请参阅以下知识点,
– 该内核参数即应用程序执行“connect()”时对端不返回“SYN_ACK”的重试次数
– 该内核参数的默认值为“6”
– 该内核参数每次建立连接的等待时间为0s,2s,4s,8s,16s,32s,64s,依此类推(即2的N-1次幂)
– 该内核参数重试6次按上面计算为126秒

参阅文档
====================
https://www.easytechjunkie.com/what-is-a-socket-timeout.htm
https://stackoverflow.com/questions/20142746/what-is-connect-timeout-in-sql-server-connection-string
https://blog.csdn.net/weixin_35639230/article/details/116039928
https://stackoverflow.com/questions/7360520/connectiontimeout-versus-sockettimeout?answertab=active#tab-top
https://segmentfault.com/a/1190000022152466
https://ms2008.github.io/2017/04/14/tcp-timeout/

没有评论

发表回复

Java
如何修复Java证书不信任错误?

1 前言 一个问题,一篇文章,一出故事。 笔者最近更换服务器的证书后,有的程序连接更换证书后的服务器 …

Java
如何安装Windows openJDK?

1 前言 一个问题,一篇文章,一出故事。 最近从新安装Windows系统,于是需要从新安装openJ …

Java
如何压缩或解压war包?

1 前言 一个问题,一篇文章,一出故事。 笔者需要在Linux平台压缩或解压war包,于是整理此文。 …