TCP协议是一种基于连接的通信方式,它通过一个被称为三次握手的过程来建立连接。然而,在实际的连接建立过程中,存在对方可能无法及时响应的情况。在这种情况下,发起连接的一方会进行重试,如果经过多次重试后仍然没有收到响应,就会触发超时机制,最终导致连接失败。为了应对这种情况,socket的connect方法提供了设置连接超时时间的功能,用户可以根据需要调整超时时间,默认情况下,系统也会提供一个默认的超时时间。基于这些背景,我们提出以下几个问题:
- 默认的连接超时时间具体是多少?
- 如果将超时时间设置为0,会发生什么情况?
- 如果将超时时间设置得非常大,比如5分钟,套接字会持续尝试连接吗?
要解答这些问题,需要深入探究,而官方文档中并没有直接给出答案。因此,我们将通过实验来寻找这些问题的答案。
在这个实验中,我们将使用TCP套接字尝试连接一个不存在的IP地址,这样连接必然会失败。整个实验过程中,我们将尝试连接5次,每次尝试连接时都使用不同的超时时间设置。具体来说,第一次尝试使用默认的超时时间,第二次尝试将超时时间设置为0,第三次尝试将超时时间设置为3秒,第四次尝试将超时时间设置为30秒,第五次尝试将超时时间设置为300秒。为了更好地分析实际耗费的时间,我们会在每次连接前后记录当前的时间。
实验的运行结果截图如下所示:
接下来,我们将详细介绍如何创建这个应用。
步骤1:创建一个Empty Ability项目。
步骤2:在module.json5配置文件中添加必要的权限声明:
“requestPermissions”: [
{
“name”: “ohos.permission.INTERNET”
},
{
“name”: “ohos.permission.GET_WIFI_INFO”

}
]
这里我们添加了访问互联网和获取WiFi信息的权限。
步骤3:在Index.ets文件中添加以下代码:
步骤4:编译并运行这个应用,可以使用模拟器或者真机进行测试。
步骤5:配置服务端的IP地址和端口,确保设置一个不存在的地址,然后依次点击“连接测试”按钮,执行后的截图如下所示:
截图的最后一部分是连接日志信息:
从输出的日志中,我们可以得出以下结论:
1. 默认的超时时间为5秒。
2. 当超时时间设置为0时,系统实际上会按照5秒来计算超时时间。
3. 当设置3秒或30秒的超时时间时,实际的超时时间就是3秒或30秒。
4. 当设置大于65秒的超时时间时,实际的超时时间大约为65秒。
对于最后一点,65秒的超时时间可能有些难以理解。这里我们可以进行如下分析:TCP连接在重试时会遵循等待时间翻倍的规则。也就是说,如果连接失败,第一次等待1秒后重试,再次失败则等待2秒,然后依次是4秒、8秒、16秒、32秒。Linux系统默认会重试5次,即1+2+4+8+16+32=63秒,再加上其他一些消耗的时间,因此实际的最大超时时间大约为65秒。
通过这些实验和分析,我们是否对鸿蒙系统下TCP连接的超时时间有了更深入的了解呢?
(本文作者原创,未经明确授权禁止转载)
本文的源码地址:
本系列源码的地址:
