embedded - 谁在搞乱这个 TCP 连接?

标签 embedded tcp

我负责一些嵌入式软件,这些软件必须与客户的专有 TCP 接口(interface)(也是嵌入式,但运行在众所周知且备受推崇的 RTOS 下)一起工作,但它无法通过三向握手,即使HTTP 接口(interface)等都工作正常,我可以使用自定义协议(protocol)与我的 PC 上运行的程序进行通信。

看WireShark抓包,他这边先发SYN,我发SYN-ACK,他马上发RST,看来问题出在他这边了。我的分析正确吗?

这是一个典型的三包问题示例,MAC ID 是匿名的(真实的 MAC ID 是有效的)。很抱歉粘贴原始十六进制,如果有人对如何放置 WireShark 捕获有更好的想法,我当然可以接受。

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  

最佳答案

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

如果他的客户端正确发送了一个SYN,你可以回复一个SYN+ACK
看起来您的 SYN+ACK 格式不正确
(但是,我还没有发现任何问题),或者,
正如您怀疑的那样,他的 TCP 堆栈没有正确接受 SYN+ACK
但是,如果这些是标准实现,那是不太可能的。

那么,您还能做什么?

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

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

    • 这将检查您的实现情况(如果 3-way 完成则很好)。
  • 如果这两个都没有问题,我们就需要怀疑网络路径

    • 例如,是否有一些防火墙不允许通信并主动向您发送 RST?

关于embedded - 谁在搞乱这个 TCP 连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1064512/

相关文章:

c - 移位是否取决于字节序?

c - #define PA6 (*((volatile unsigned long *) 0x40004200))

VB.net TCPListner 窗口服务

linux - 我如何在 Perl 中接受多个 TCP 连接?

linux - 不遵守 TCP 保持事件参数

sockets - Haskell 'timeout' 函数在应用于 'connect' 时不起作用

c - tcpi_rcv_mss 是什么意思?

c - 内联和栈帧控制

c - 如何分配一个变量指针来访问msp430上的硬件寄存器?

c - 为什么#error 指令在这里没有给出预期的结果?