我有一个问题,我觉得我几乎已经解决了,但我被困在最后一段"。 我已经在这几天工作了,虽然有突破,但感觉我 我仍然是一个可行的解决方案 - 由于一些盲点。
我有一个嵌入式移动固件应用程序(我无法直接编辑),但是遇到了麻烦 通过TCP / IP / UMTS / GSM重新连接到我们的服务器。固件仅使用AT命令来启动和 通过调制解调器控制连接。我们产品的原始版本已经 在生产中工作了大约10年,然而这是一个新的"硬件的版本是 经历间歇性问题。
有许多变数,但我排除了除了一个之外的所有变量:调制解调器芯片。
当然,我无休止地阅读了Telit文档(特别是" Easy IP"和 AT命令和软件参考)但看不出太多广告的差异 两种产品之间。 HE910是Glynn的物理包装,但我不相信 这影响了它的行为。
问题:
我们的固件应用程序通过特定端口/地址连接到我们的服务器。服务器 启动固件必须响应的出站应用程序协议。 (真的 固件是"服务器"但这并不重要。)它非常轻巧简单, 每个命令/响应的字节数为10。
当固件由于事件重新连接而出现问题时,"在#34;之上现有的 套接字连接。固件始终遵循相同的过程:拆卸,配置, 连接 - 无论是否存在现有连接(这是由于 模糊性"连接"在TCP和3G上,最好是"尝试发送数据",或 重新连接以确保连接)。正如我所说,我无法在F / W中改变这种行为。
连接步骤为:
(您可能会问为什么每次连接都会完成配置步骤2,3,4:因为 它们可以通过我们的应用程序协议更新。但通常设置是不变的。)
我们遇到的问题有时是设备连接但无法通信。 这些联系似乎已经被困住了#34; - 有时几个字节通过,有时整整 命令/响应周期,但通常没有。在连接上通常是10个命令 服务,如果它们失败,服务器就会断开连接。
到目前为止我发现了什么:
我使用协议分析器来确定出错的地方:它是因为TCP AT#SH的FIN进程与下一个连接的TCP SYN握手重叠 以AT#SD发起。这似乎是由于延迟的最终FIN-ACK数据包到达 迟到 - 在下一个连接开始之后。
在下面的曲目中你可以看到第8799帧迟到,作为对8788的ACK,但它来了 在下一次SYN-ACK握手中间失序!
在这种情况发生后,调制解调器基本上就会被打破"。所有后续连接 遇到有效载荷丢包,有很多ReTransmits,双方都重新发送 有效负载数据包就好像它们没有收到有效负载ACK一样。
在步骤1(AT#SH)之后,F / W暂停1秒。我们因问题添加了这个 我们第一次安装HE910时重新连接,(我知道它是一个kludge,但它更多 在我们的服务器状态中容纳数据库延迟而不是TCP / IP。但似乎 这1s延迟甚至不会影响TPC流量,您可以从下面的曲线中看到。 ATSH"导致"框架8786在17:16:51.585,ATSD"导致"第8792帧的SYN 在17:16:51.595,但他们之间只有10毫秒。我研究了固件,可以 确认1s延迟代码看起来正确,并在终端中观看固件 - 有IS 这些步骤的调试输出之间有1秒的延迟 - 但TCP讲的是另一个故事。
我可以以有限的方式在固件中发送AT命令 - 每五个命令只有一个命令 秒,这显然会使手动测试偏向好又慢。如果我发送+++,AT#SH期间 连接A,然后触发连接事件,设备将成功连接。 这很有趣,因为连接的第1步无论如何都要执行AT#SH。 所以我可以得出以下两点之一:要么我们需要发送一个AT#SH"早期" (即 在连接AT#SD之前等待更长时间,或发送其中两个(不太可能)。
据我所知,这是应用程序中常见问题的一个方面。甚至在维基百科中 在TCP / IP上,它提到了应用程序破坏OSI模型和下降的风险 如果用于应用程序级会话终止,TCP拆卸握手的错误。 我喜欢添加一个好的"再见"我们的应用程序协议,但不是 中期可行的选择...我想得到我们的两个调制解调器' TCP堆栈已对齐。
服务器在同一IP /端口上为传入连接打开一个新套接字 组合。 Node和VB都从侦听父节点创建新的套接字资源 端口,所以我很确定在服务器端没有任何东西正在被重用" (这是一种怀疑)。 不幸的是,我对调制解调器的TCP堆栈的看法有限,仅使用AT#SI和SO 它提供了基本的和看似非实时的信息。例如当插座关闭时 服务器端,AT#SO仍然显示调制解调器本地的IP /端口,就像它没有收到 FIN拆解。
通过全新启动,设备可以重新连接"成功约四次,直到 " jam"发生。对于4 + -1连接,这是非常可靠的。它也可以重置" 等了几个小时。所以,(对不起)感觉就像调制解调器一样慌乱。 (同样,我确实怀疑我们的电信公司是"限制"我们的连接,但跨电信测试是 太相似了。在生产中考虑我们有数以千计的这些设备 其中一个可以触发此行为。它在统计上不太可能 "通知"其他数百个连接中的四个连接?)
最后一种行为是当连接被“堵塞”时#34;即不传播 数据,服务器在30-60秒后收到RST(节点中的ECONNRESET,只是VB中的错误)。 (只有当我们禁用更快的应用程序级别连接终止时,才会这样做 很久没被注意到了)。在此重置之后,AT#SO仍然将其显示为已连接 (使用IP),所以一开始我觉得有些3G / AP /网关丢失连接 在中间,但没有告诉客户。但是由于问题的一致性 跨越电信公司和网络,我现在发现这很难相信,只想到AT 回复不是最新的"与现实。
这种典型的TCP跟踪显示(到目前为止,我的解释可能不正确)
微量
Frame TIME REL TIME SOURCE DEST SEQ ACK FLAGS WINDOW PAYLOAD BYTES
8003 17:15:55.9409634 703.7329764 CLIENT_IP SERVER_IP 0 0 (0x0) ......S. 65000 0 Flags=......S., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432024, Ack=0, Win=65000 ( ) = 65000 vb6.exe
8004 17:15:55.9410316 0.0000682 SERVER_IP CLIENT_IP 0 1 ...A..S. 8192 0 Flags=...A..S., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387462, Ack=316432025, Win=8192 ( Scale factor not supported ) = 8192 vb6.exe
8016 17:15:58.5707216 2.6296900 CLIENT_IP SERVER_IP 1 1 ...A.... 65000 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432025, Ack=319387463, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8037 17:15:58.8632583 0.2925367 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=13, Seq=319387463 - 319387476, Ack=316432025, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8039 17:15:59.0105830 0.1473247 CLIENT_IP SERVER_IP 1 14 ...A.... 65000 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432025, Ack=319387476, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8041 17:15:59.1006112 0.0900282 CLIENT_IP SERVER_IP 1 - 7 14 ...AP... 65000 6 Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=6, Seq=316432025 - 316432031, Ack=319387476, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8068 17:15:59.2997681 0.1991569 SERVER_IP CLIENT_IP 14 7 ...A.... 64994 0 Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387476, Ack=316432031, Win=64994 (scale factor 0x0) = 64994 vb6.exe
8071 17:15:59.3590861 0.0593180 SERVER_IP CLIENT_IP 14 - 19 7 ...AP... 64994 5 Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=5, Seq=319387476 - 319387481, Ack=316432031, Win=64994 (scale factor 0x0) = 64994 vb6.exe
8076 17:15:59.5106103 0.1515242 CLIENT_IP SERVER_IP 7 19 ...A.... 65000 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432031, Ack=319387481, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8078 17:15:59.6005478 0.0899375 CLIENT_IP SERVER_IP 7 - 28 19 ...AP... 65000 21 Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=21, Seq=316432031 - 316432052, Ack=319387481, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8100 17:15:59.7989459 0.1983981 SERVER_IP CLIENT_IP 19 28 ...A.... 64973 0 Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387481, Ack=316432052, Win=64973 (scale factor 0x0) = 64973 vb6.exe
8110 17:15:59.9164691 0.1175232 SERVER_IP CLIENT_IP 19 - 37 28 ...AP... 64973 18 Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=18, Seq=319387481 - 319387499, Ack=316432052, Win=64973 (scale factor 0x0) = 64973 vb6.exe
8114 17:16:00.0005725 0.0841034 CLIENT_IP SERVER_IP 28 37 ...A.... 65000 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432052, Ack=319387499, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8120 17:16:00.2005077 0.1999352 CLIENT_IP SERVER_IP 28 - 34 37 ...AP... 65000 6 Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=6, Seq=316432052 - 316432058, Ack=319387499, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8127 17:16:00.2509607 0.0504530 SERVER_IP CLIENT_IP 37 - 42 34 ...AP... 64967 5 Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=5, Seq=319387499 - 319387504, Ack=316432058, Win=64967 (scale factor 0x0) = 64967 vb6.exe
8131 17:16:00.5004721 0.2495114 CLIENT_IP SERVER_IP 34 42 ...A.... 65000 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432058, Ack=319387504, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8132 17:16:00.5004721 0.0000000 CLIENT_IP SERVER_IP 34 - 43 42 ...AP... 65000 9 Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=9, Seq=316432058 - 316432067, Ack=319387504, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8160 17:16:00.6603237 0.1598516 SERVER_IP CLIENT_IP 42 - 49 43 ...AP... 64958 7 Flags=...AP..., SrcPort=50008, DstPort=17790, PayloadLen=7, Seq=319387504 - 319387511, Ack=316432067, Win=64958 (scale factor 0x0) = 64958 vb6.exe
8162 17:16:00.7505392 0.0902155 CLIENT_IP SERVER_IP 43 49 ...A.... 65000 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432067, Ack=319387511, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8168 17:16:00.9005226 0.1499834 CLIENT_IP SERVER_IP 43 - 55 49 ...AP... 65000 12 Flags=...AP..., SrcPort=17790, DstPort=50008, PayloadLen=12, Seq=316432067 - 316432079, Ack=319387511, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8197 17:16:01.1093181 0.2087955 SERVER_IP CLIENT_IP 49 55 ...A.... 64946 0 Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387511, Ack=316432079, Win=64946 (scale factor 0x0) = 64946 vb6.exe
8786 17:16:51.5853712 50.4760531 CLIENT_IP SERVER_IP 55 49 ...A...F 65000 0 Flags=...A...F, SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432079, Ack=319387511, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8787 17:16:51.5854172 0.0000460 SERVER_IP CLIENT_IP 49 56 ...A.... 64946 0 Flags=...A...., SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387511, Ack=316432080, Win=64946 (scale factor 0x0) = 64946 vb6.exe
8788 17:16:51.5860033 0.0005861 SERVER_IP CLIENT_IP 49 56 ...A...F 64946 0 Flags=...A...F, SrcPort=50008, DstPort=17790, PayloadLen=0, Seq=319387511, Ack=316432080, Win=64946 (scale factor 0x0) = 64946 vb6.exe
8792 17:16:51.5954781 0.0094748 CLIENT_IP SERVER_IP 0 0 (0x0) ......S. 65000 0 Flags=......S., SrcPort=39522, DstPort=50008, PayloadLen=0, Seq=1817440308, Ack=0, Win=65000 ( ) = 65000 vb6.exe
8793 17:16:51.5955252 0.0000471 SERVER_IP CLIENT_IP 0 1 ...A..S. 8192 0 Flags=...A..S., SrcPort=50008, DstPort=39522, PayloadLen=0, Seq=4287314964, Ack=1817440309, Win=8192 ( Scale factor not supported ) = 8192 vb6.exe
8799 17:16:51.7152606 0.1197354 CLIENT_IP SERVER_IP 56 50 ...A.... 64999 0 Flags=...A...., SrcPort=17790, DstPort=50008, PayloadLen=0, Seq=316432080, Ack=319387512, Win=64999 (scale factor 0x0) = 64999 vb6.exe
8801 17:16:51.7351969 0.0199363 CLIENT_IP SERVER_IP 1 1 ...A.... 65000 0 Flags=...A...., SrcPort=39522, DstPort=50008, PayloadLen=0, Seq=1817440309, Ack=4287314965, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8821 17:16:52.0333514 0.2981545 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8846 17:16:52.4579548 0.4246034 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8855 17:16:53.3003681 0.8424133 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8875 17:16:54.9852348 1.6848667 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8890 17:16:56.6729734 1.6877386 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8909 17:16:58.3734032 1.7004298 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8921 17:17:01.7429692 3.3695660 SERVER_IP CLIENT_IP 1 - 14 1 ...AP... 65000 13 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=13, Seq=4287314965 - 4287314978, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
8978 17:17:08.4665817 6.7236125 SERVER_IP CLIENT_IP 1 - 27 1 ...AP... 65000 26 [ReTransmit #8821]Flags=...AP..., SrcPort=50008, DstPort=39522, PayloadLen=26, Seq=4287314965 - 4287314991, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
9016 17:17:12.2738575 3.8072758 SERVER_IP CLIENT_IP 27 1 ...A...F 65000 0 Flags=...A...F, SrcPort=50008, DstPort=39522, PayloadLen=0, Seq=4287314991, Ack=1817440309, Win=65000 (scale factor 0x0) = 65000 vb6.exe
观察(具有有限的TCP知识)
最后 - 我的问题。
我如何,纯粹使用AT命令,可靠地拆除TCP / IP套接字并建立 新套接字上的新连接到同一个端口/ IP,没有延迟拆卸的可能性 数据包不按顺序到达。
或者更具体地说,我怎样才能使HE910调制解调器像UC864一样成功。
答案 0 :(得分:1)
为了回答我自己的问题,我设法解决了这个问题,但未必回答基本问题。
我设法在拆卸和重新连接之间添加2s延迟添加到固件(替换所描述的1s延迟),因为这是一个简单的更改。
这完全解决了这种行为,使我能够对20多次重新连接的时间进行进一步的分析。
事实证明,HE-910调制解调器具有两个网络延迟级别的周期性循环。它每隔几分钟交替出现900毫秒和1200毫秒。这意味着前几个连接(我可以每30秒执行一次)将在代码中延迟1秒,但是当它达到1.2秒延迟时,FIN-ACK数据包会溢出到下一个连接中。
此图显示"距离"当ATSH命令和ATSD命令之间存在2s延迟时,在FIN / ACK序列和下一个SYN / ACK握手之间的时间间隔。它显然具有周期性变化,偶尔会在1s暂停的边缘进行。
事实证明,我以前的1s延迟时间只是工作。一年前进行更长时间的测试就可以证明这一点。
因此虽然2s延迟只是一个更长的时间,但似乎有足够的空间来保证安全。我正在进行进一步的基准测试,看看我们是否有可能接近2s延迟。
这可能是"延迟确认"一些TCP / IP堆栈的功能,但1.2s似乎非常长。调制解调器没有控制TCP_NODELAY选项的命令,因此我无法对其进行测试。
似乎AT#SH命令是异步的,因为在拆卸甚至启动之前返回OK。否则,初始FIN将始终偏移1s或2s,而在上图中,FIN和ACK都延迟了0.8ms加上它们之间的时间。
我还将使用2s固件对UC864进行基准测试,以获得相同的图表,这将有助于更深入了解其根本原因。
答案 1 :(得分:0)
这个问题实际上是Telit HE910固件v12.00.04中的一个错误。
Glyn说他们有信心升级会修复这个问题,而且更改日志中有很多看起来相关的错误修正。升级到v12.00.06后,所有问题都消失了。