最后更新:2022-07-15 15:23:38 手机定位技术交流文章
对于这种 IM 应用程序,维护应用层网络的最直接的方法是心脏跳动机制。比如主流的IM里有微信、QQ、钉钉、易信等等,代码的实施细节可能有所不同,但理论上, 没有例外.(PS:没错,最初,WeChat和运营商之间的“信件危机”与此有关。

所谓的网络心跳,通常,客户端每分钟向服务器发送数据包(即心跳包)。通知服务器本身,它仍然在线上(心脏跳动包可以同时传输一些必要的数据)。发送心跳包,从通信角度看,这是保持长期的联系,至于这个包的内容,没有特别规定,但在移动IM中,为了节省交通,它们通常是非常小的包装(例如一些第三方IM云以显示心率不是太高,1音节的心脏跳 Pack.
但人们经常问,因为TCP协议本身有一个叫做KeepAlive备份的东西(见:TCP/IP解释第1卷-第23章-TCP的备份时间表),为什么我们必须在应用程序一级实现网络备份/心脏跳动机制?
没错,当你看一个即时消息/IM程序员时,几乎是不可避免的!
TCP KeepAlive的开端
在C/S模式应用程序中,当使用TCP连接时,如果一方处于闲置状态,如果另一方偶发崩溃,如果机器、网络线故障,或者路由器故障,则不能通知另一方的TCP连接已经过期。
那么,连接的另一方不知道另一方的情况,它将永远保持这种联系。作为服务的终结,长期积累会导致许多半开放的连接,导致最终系统资源的消耗和浪费,并且有可能使商业数据被发送到一个无效的数据链级,结果就是发送失败。
因此,每个端必须快速检测故障并减少无效连接操作,从而提供TCP的保持生命保持检测机制。
PS:这个关于TCP的保持生命机制的广泛声明似乎不太令人信服,下一节将详细分析它,并给出具体例子。
从NAT的角度更明确地理解TCP KeepAlive的必要性
讲到TCP的KeepAlive的必要性,多数文章都是像上节这样比较笼统的进行说明,但对于爱刨根问底的开发者来说,这还远远不够。
本节将以路由器的NAT机制这个角度来具体分析TCP协议的造物主们设计KeepAlive机制的必要性。
从NAT原理讲起
狭义上,NAT分为SNAT(原地址转换)和DNAT(目标地址转换),关于DNAT,有兴趣的同学可以自行查阅,这里只讨论SNAT。
我们都知道,路由器的最基本功能是对第三层(网络层)上的IP报文进行转发。实际上,路由器还有很关键的一个功能,这便是NAT。特别是对于ISP对普通用户链路上的路由器,NAT功能尤为重要。
为什么使用NAT?
原因很简单:IPv4地址非常罕见。上网需求庞大,这使得ISP无法为每个来访用户提供独立的公共网络IP,因此通常情况下,ISP将连接用户到LAN,允许多个用户共享相同的公共IP,每个用户接收一个本地网络IP。这个路由器将公共网络连接到本地网络,它被称为门廊。NAT过程在该网络交换路由器上进行.即时通讯聊天软件开发可以添加v:weikeyun24咨询

三层地址转换
局域网内的主机向公网发出的网络层IP报文,将经由网关被转发至公网,而在该转发过程中发生了地址转换。网关将该IP报文中的 源IP地址 从”该主机的内网IP”修改为”网关的公网IP”。
例如:由本地网络主机取得的内部网络IP是,网关的公网IP为210.177.63.2,在由LAN主机发送给公共网络目标主机的IP消息中,源IP字段数据为192.168.1.100,在经过网关时,该字段数据将被修改为210.177.63.2。
为什么要这么做,相信还是不相信,收到此IP消息后,公共网络上的目标主机你需要知道该IP消息的源地址,并向资料来源的地址发送答复,但是如果你不通过NAT,目标主机拿到的来源地址是192.168.1.100,这显然是一个私人地址,不能在公共网络上访问,目标主机不能向正确的源主机发送响应消息。开启了NAT之后,IP报文的来源地址被网关修改为210.177.63.2,这是一个公网地址,目标主机将向此地址发送响应消息(即网络交换路由器的公共网络地址)。
但是请注意:如果这个IP报文的数据段不含传输层协议报文,而是一个pure的网络层packet,来自目标主机的响应报文是不能被网关准确转发到多台局域网主机中的其中一台的。
PS:ICMP报文除外,其报头中有Identifier字段用于标识不同的主机或进程,网关在处理Identifier时类似于下面提到的运输层端口。
传输层端口转换表
在三层地址转换中,我们能够确保本地区域网络中的主机向公共网络发送的IP消息能够顺利到达目标主机。然而,从目标主机返回的IP消息不能准确地发送到指定的LAN主机(我们不能允许网络交换机向所有LAN主机发送IP消息,因为这必然会导致安全和性能问题。
为了解决这个问题,网络交换路由器需要使用传输层端口,通常是TCP或UDP端口,以生成端口转换表。
让我们举个例子说明端口转换器如何工作:
假设局域网主机A192.168.1.100需要与公网上的目标主机B210.199.38.2:80进行一次TCP通信。其中A所在局域网的网关C的公网IP地址为210.177.63.2。
步骤如下:
1)局域网主机A192.168.1.100发出TCP连接请求,A上的TCP端口是分配给系统的53600。该TCP握手包中,包含源地址和端口192.168.1.100:53600,目的地址和端口210.199.38.2:80。
2)网关C将该包的原地址和端口修改为210.177.63.2:63000,其中63000是网关分配的临时端口。
3)C开关将一个记录添加到终端转换表:
4)C开关将修改的TCP包发送到目的地主机B。
5)目的主机B收到后,发送响应TCP包。该响应TCP包含有以下信息:源地址和端口210.199.38.2:80,目的地址和端口210.177.63.2:63000。
6)网关C收到这个来自B的响应包后,随即在端口转换表中查找记录。该记录须符合以下条件:目的主机IP==210.199.38.2,目的主机端口==80,网关端口==63000。
7)网关C搜索到这条记录,记录显示内网主机IP为192.168.1.100,内网主机端口为53600。
8)网关C将该包的目的地址和端口修改为192.168.1.100:53600。
9)网关C随即将该修改后的TCP包转发至192.168.1.100:53600,即局域网主机A。此时运输层数据的一次交换已完成。
在网关C上,由于端口数量有限(0~65535),端口转换表的维护占用系统资源,因此不能无休止地向端口转换表中增加记录。对于过期的记录,网关需要将其删除。
如何确定哪些记录过期?
开关认为一个过时的非主动连接,并且在指定的时间检测到转换表中的非主动连接,并将其丢弃。 在丢弃过程中,开关不通知任何端点的连接。
如果客户申请是由于业务需要,需要与服务端保持长期连接(例如基于TCP的IM聊天应用程序),如果这个连接在特别长的一段时间内没有数据交换,门户将考虑连接过期,并将连接从终端转换表中丢弃。该连接被丢弃时,客户和服务端完全不知道这一点。在连接被丢弃后,客户不会在服务结束时收到数据转移,客户端发送的数据包无法到达服务端.
一个具体的例子来感受一下这个问题的严重性:
在金融应用程序中,客户需要填写大量表格数据,客户建立与服务器的TCP连接后,客户终端用户将花费数分钟甚至数十分钟填入有关表格的信息,最终终端用户填入所需的信息,然后单击“提交”按钮。
结果,此时,因为中间设备已经从连接表中删除了这个TCP连接,它将直接丢弃消息,或者向客户发送ST文,应用故障产生,这将导致所有客户端终端用户的工作需要重新工作,它给用户带来了极大的不便和损失.
本文由 在线网速测试 整理编辑,转载请注明出处。