im即时通讯开发拔掉网线再插上,TCP连接还在吗?

      最后更新:2022-06-15 11:23:12 手机定位技术交流文章

      当谈到TCP协议时,即时通讯/IM领域的开发者不再熟悉。 随着TCP的理解越来越深入,许多已经遇到但没有时间深入探索的TCP技术概念或问题,现在是时候转过身来解决它们。

      一些人认为,如果电线被移除,这意味着物理层被切断,那么物理层之上的传输层也必然被切断,因此原始的TCP连接将不再存在。

      这种逻辑有问题。

      问题是:错误地认为拉出网格的动作会影响传输层,事实上不会影响它!

      事实上,Linux内核的TCP连接是一个称为结构接口的结构,其内容包含信息,如TCP连接的状态。

      因此,当网络线被移除时,操作系统不会改变结构的任何内容,因此TCP连接的状态不会改变。

      连接我的云服务器到Ssh端口,然后通过切断Wi-Fi模拟了网络的切除,然后观察到没有改变的TCP连接状态,或者在ESTABLISHED状态。

      以上实验结果证实了我得出的结论:网络线的除去不影响TCP连接状态。

      然而,答案比较一般,事实上,我们应该从更具体的角度看待这个问题,答案会更加准确。

      这个具体场景就是:

      (一)移除网络线后发生数据传输;

      (二)除去网络后没有数据传输。

      为了解决这两个具体场景,我将更具体地分析它们。

      在数据传输过程中,电线被重新插入

      如果客户端被从网络中删除,服务发送给客户端的数据消息不会收到任何响应。在等待一定时间后,服务触发了TCP协议的超时再传输机制,但数据消息不能再传输。

      如果消息在服务端重新发送,客户已重新接入电线,因为删除网络线不会改变客户端的TCP连接状态,而且仍处于稳定状态,因此,客户端通常可以从服务端口接收数据信息,然后,客户端返回ACK响应消息。

      此时:客户端与服务端之间的TCP连接仍然存在,工作状态不会受到影响,使应用程序层感觉没有发生什么。

      在数据传输过程中,网络线没有被插回

      上面这种情况下,如果在通过服务结束的TCP协议重新传输消息时,客户没有重新接入电线,然后在达到一定阈值后,服务结束时再发送过时消息的数目,内核将确定TCP有问题。然后它通过索克接口告诉应用程序,TCP连接有问题,然后将切断到服务端的TCP连接。

      接下来,如果客户端重新连接,并且如果客户端向服务器发送数据,因为服务器没有与客户端匹配的TCP连接信息,服务器内核将响应RST消息,并且客户端在收到该消息后将释放TCP连接。

      此时:客户端与服务端之间的TCP连接已经被明确切断,原来的连接不存在。

      问以下问题:TCP数据报告实际再传输多少次?

      在了解我们应该做的更好的基础上,让我们问自己:TCP数据报告有多少次被重发?

      在Linux上,提供了一个名为tcp_retries2的配置项目,默认值为15。

      然而,tcp_retries2设置15次,它并不意味着应用程序在15个超时继电器后终止TCP连接,核子也将根据“最大加班”来评判。即时通讯聊天软件应用程序开发可以咨询Ulcomun.

      例如,超时继电器的第一个触发是2秒后,第二个触发是4秒后,第三个触发是8秒后。

      内核根据tcp_retries2中设置的值计算最大超时时间。

      当消息被重新发送而不收到另一方的响应时,重新发送器停止,当满足“最大再发送率”或“最大时限”的条件之一时,然后TCP连接被切断。

      如果在删除网络后没有数据传输,必须检查是否已激活TCP KeepAlive机制。

      1)如果不启用TCP KeepAlive机制:

      当客户端移除网络线并没有一方发送数据后,客户端与服务端之间的TCP连接将继续存在。

      2)如果启用TCP KeepAlive机制:

      在客户端切断网络后,TCP会在一段时间后发送一个KeepAlive检测消息,即使双方都没有发送数据。

      根据KeepAlive检测响应,有两种可能性:

      1)端口正常运行时:当检测消息收到并正常响应时,TCP备份时间将重新设置,等待下一个TCP备份时间到达;

      2)如果端口主机崩溃或端口由于其他原因无法访问:当检测消息发送到端口时,TCP将报告连串的救生检测没有响应发送到端口后,连接已经死亡。

      因此,TCP维护机制可以通过检测TCPKeepAlive机制的信息来确定对方的TCP连接是否活在双方之间没有数据交互的情况下。

      TCP KeepAlive机制的原则如下:

      定义一个时间段,在这个时间段内,如果没有与连接有关的活动,TCP生命保险机制将开始运作,每隔一个时间间隔,发送一个探测报文。侦查报告载有很少的数据,如果多个连续的检测报告没有得到响应,当前的TCP连接被视为已死,系统内核通知上层应用程序的错误信息。

      在Linux内核中,可以为生命周期、生命周期检测数和生命周期间隔设置相应的参数。

      这里是Linux的默认值:

      net.ipv4.tcp_keepalive_time=7200

      net.ipv4.tcp_keepalive_intvl=75

      net.ipv4.tcp_keepalive_probes=9

      解释一下:

      1)tcp_keepalive_time=7200:表示保活时间是 7200 秒(2小时),也就 2 小时内如果没有与连接有关的活动,则会启动保活机制;

      2)tcp_keepalive_intvl=75:每次检测间隔75秒;

      3)tcp_keepalive_probes=9:表示检测9个未答复的响应,认为其他无法访问,从而中断此连接。

      这意味着在Linux系统上,只有在最少2小时、11分钟和15秒后才能检测到“死亡”连接。

      注:应用程序需要通过插座接口设置以使用TCP备份机制SO_KEEPALIVE此选项仅生效,如果它不设置,则不能使用TCP备份机制。

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/27397.html

          热门文章

          文章分类