Embedded 世卫组织';是什么弄乱了TCP连接?

Embedded 世卫组织';是什么弄乱了TCP连接?,embedded,tcp,Embedded,Tcp,我负责一些嵌入式软件,这些软件必须与客户的专有TCP接口(也是嵌入式的,但运行在一个众所周知和公认的RTOS下)一起工作,但它不能通过三方握手,即使HTTP接口等都可以正常工作,我可以使用自定义协议与PC上运行的程序进行通信 查看WireShark捕获的内容,他的一方通过发送SYN来启动,我发送SYN-ACK,然后他立即发送RST,所以看起来问题就在他这边。我的分析正确吗 下面是一个典型的三包问题示例,MAC ID是匿名的(真正的MAC ID是有效的)。很抱歉粘贴原始十六进制,如果有人对如何捕捉

我负责一些嵌入式软件,这些软件必须与客户的专有TCP接口(也是嵌入式的,但运行在一个众所周知和公认的RTOS下)一起工作,但它不能通过三方握手,即使HTTP接口等都可以正常工作,我可以使用自定义协议与PC上运行的程序进行通信

查看WireShark捕获的内容,他的一方通过发送SYN来启动,我发送SYN-ACK,然后他立即发送RST,所以看起来问题就在他这边。我的分析正确吗

下面是一个典型的三包问题示例,MAC ID是匿名的(真正的MAC ID是有效的)。很抱歉粘贴原始十六进制,如果有人对如何捕捉线鲨有更好的想法,我当然愿意接受

63  2009-06-29 13:07:49.685057  10.13.91.2  10.13.92.3  TCP 1024 > 49151 [SYN] Seq=0 Win=8192 Len=0 MSS=1460 WS=0 TSV=194 TSER=0

0000   f1 f1 f1 00 03 09 ab ab ab 60 10 89 08 00 45 00  
0010   00 3c 00 68 40 00 40 06 6f 35 0a 0d 5b 02 0a 0d  
0020   5c 03 04 00 bf ff 7d b3 81 44 00 00 00 00 a0 02  
0030   20 00 9c 2f 00 00 02 04 05 b4 01 03 03 00 01 01  
0040   08 0a 00 00 00 c2 00 00 00 00  

64  2009-06-29 13:07:49.685375  10.13.92.3  10.13.91.2  TCP 49151 > 1024 [SYN, ACK] Seq=0 Ack=1 Win=1460 Len=0

0000   ab ab ab 60 10 89 f1 f1 f1 00 03 09 08 00 45 00  
0010   00 28 00 02 00 00 64 06 8b af 0a 0d 5c 03 0a 0d  
0020   5b 02 bf ff 04 00 d4 ff ff ff 7d b3 81 45 50 12  
0030   05 b4 47 07 00 00 00 00 00 00 00 00  

65  2009-06-29 13:07:49.685549  10.13.91.2  10.13.92.3  TCP 1024 > 49151 [RST] Seq=1 Win=0 Len=0

0000   f1 f1 f1 00 03 09 ab ab ab 60 10 89 08 00 45 00  
0010   00 28 00 6a 00 00 40 06 af 47 0a 0d 5b 02 0a 0d  
0020   5c 03 04 00 bf ff 7d b3 81 45 00 00 00 00 50 04  
0030   00 00 21 c9 00 00 00 00 00 00 00 00  

首先,这些不是有效的MAC地址;高阶字节&0x1表示它是多播MAC。首先,这些都不是有效的MAC地址;高阶字节&0x1表示它是多播MAC。请参见

如果您没有使用定制tcp堆栈或原始套接字之类的花哨东西,我会怀疑“专有tcp接口”

这对那个客户有用吗?
它能与其他客户端一起工作吗?

如果您没有使用定制tcp堆栈或原始套接字等奇特的东西,我会怀疑“专有tcp接口”

这对那个客户有用吗?
它与其他客户端一起工作吗?

如果双方都使用标准RTOS实现,则TCP堆栈不太可能出现问题。或者,你是说TCP是本地实现的吗

如果他的客户正确地发送了
SYN
,并且您可以用
SYN+ACK
回复,
似乎您的
SYN+ACK
格式不正确
(但是,我还看不出有什么不对),或者,
正如您所怀疑的,他的TCP堆栈没有正确地接受
SYN+ACK

然而,如果这些是标准实现,那就不太可能了

那么,你还能做什么呢

  • 因为我们正在检查的是TCP握手,所以您可以让他连接到您端正在监听所需端口的任何其他机器

    • 这将检查他的实现(如果三向完成,这将很好)
  • 您可以使用从另一台本地计算机连接到端口的
    TELNET
    检查TCP堆栈

    • 这将检查您的实现(如果三向完成,则良好)
  • 如果这两种情况都正常,我们需要怀疑网络路径

    • 例如,是否存在不允许通信并主动向您发送RST的防火墙

如果双方都使用标准RTOS实现,则TCP堆栈不太可能出现问题。或者,你是说TCP是本地实现的吗

如果他的客户正确地发送了
SYN
,并且您可以用
SYN+ACK
回复,
似乎您的
SYN+ACK
格式不正确
(但是,我还看不出有什么不对),或者,
正如您所怀疑的,他的TCP堆栈没有正确地接受
SYN+ACK

然而,如果这些是标准实现,那就不太可能了

那么,你还能做什么呢

  • 因为我们正在检查的是TCP握手,所以您可以让他连接到您端正在监听所需端口的任何其他机器

    • 这将检查他的实现(如果三向完成,这将很好)
  • 您可以使用从另一台本地计算机连接到端口的
    TELNET
    检查TCP堆栈

    • 这将检查您的实现(如果三向完成,则良好)
  • 如果这两种情况都正常,我们需要怀疑网络路径

    • 例如,是否存在不允许通信并主动向您发送RST的防火墙

我怀疑sskuce在嵌入式环境中擦洗了Mac电脑,我认为他可能是任意选择了“随机”Mac电脑,这给他带来了问题。至少,这是在这里发生的,并导致了一个规则,即组成的Mac中的高阶字节应为0:)呜呜,我确实忘记了提到我已经清理了Mac。双方都有自己的OUI,所以我不想让他们被识别。我怀疑sskuce在嵌入式环境中擦洗了Mac。我认为有可能是他任意选择了“随机”Mac导致了他的问题。至少,这是在这里发生的,并导致了一个规则,即组成的Mac中的高阶字节应为0:)呜呜,我确实忘记了提到我已经清理了Mac。双方都有自己的OUI,所以我不想让他们被识别。我正在运行一个运行良好的web服务器,至少在我尝试过的所有浏览器上,以及一些直接与端口80通信的.NET程序上。我正在运行一个运行良好的web服务器,至少在我尝试过的所有浏览器上,还有一些直接与端口80通信的.NET程序。我这边是一个没有RTO的“裸机”设备,但我们使用的是一个开源TCP堆栈,已经有一段时间了,就像我说的,它可以与其他机器和其他协议一起工作,只是不能与具有此协议的机器一起工作。我刚刚用telnet连接到我的设备,它工作了。网络中不应该有任何东西干扰我们——他和我之间的唯一区别是一台Windows PC,它有两个桥接的NIC,因此我们可以使用它来嗅探流量,这不会给我们带来任何其他设备的问题。我将考虑编写一个基于PC的协议实现供他测试。如果TCP三方握手对他不起作用,他离协议测试还很远。你应该在他个人电脑上的预期协议端口上运行TELNET服务器。或者,从某个地方提取一个TCP ECHO服务器样本,并将其装配在P