我一直使用 Scapy 向我的 Cisco 桌面电话发送 SCCP 或 Skinny 数据包。但是我不断收到这些 TCP 重传错误,我认为这是 Cisco 电话无法响应的原因。我有一个程序可以成功命令电话拨号。例如,“10.10.50.12”处的程序发送了四个数据包,并从电话(“10.30.37.78”)获得两个 ACK。见下文:
但是,当我使用 Python 并使用 Scapy 发送命令时:
这四个数据包已发送,甚至被 Wireshark 识别为特定消息,但是我收到了 TCP 重传错误,并且没有从手机收到 ACK。
奇怪的是,“SetLampMessage”没有什么特别之处,所以它不会出错。这只是因为它是第一个发送的数据包。如果我以不同的方式安排数据包的顺序,那么无论哪个先发送都不会出错。
我尝试比较十六进制输出,这里是 SetLampMessage 的十六进制比较:
程序:
我的Python:
十六进制输出之间的大多数差异与标识和校验和有关。不知何故,我的标识总是等于 0x0001,但我不认为这是问题所在,因为我能够发送纯 TCP 数据包而没有任何错误,即使它们都具有相同的 ID。
我已经在 Google 上搜索过“TCP 重传”错误,似乎大多数错误都是由于没有收到发回的 ACK 造成的,但我不认为这是原因,因为我在每个发送的数据包之间设置了不同的暂停时间来验证我的数据包是否发送得太快。
有识之士是否知道我做了什么导致了这些错误?
答案1
经过一番努力,我发现问题出在我发送的数据包的 TCP 标头中的序列号和确认号上。我发送的这两个值都是“0x0001”。
我特别发现这篇文章对于理解这些价值观如何发挥作用非常有帮助: http://www.firewall.cx/networking-topics/protocols/tcp/134-tcp-seq-ack-numbers.html
为了解决我的问题,我观察了 Cisco 桌面电话和呼叫管理器之间的 Seq 和 Ack 号码。然后,我会预测并计算下一个 Seq 和 Ack 值,然后适当地发送我的数据包。
您可以在上图中看到,以“SetLampMessage”开头的我的“Skinny”消息不再收到 TCP 重传错误。
然而,我的思科电话一直没有响应并且继续讨厌我,但这不是重点。