长话短说:在 Linux 中,如何确保收到某个 TCP 数据包的 ACK 消息?
全文:
我正在调试 Asterisk/OpenH323 <-> Panasonic IP-GW16 问题。
H323 连接涉及两个会话:H225.0 和 H245。这些只是两个 TCP 会话,通过它们传输一些数据。
我们称它们Session 1为(对于 H225.0)和Session 2(对于 H245)。
Session 1具有众所周知的 TCP 端口号 1720,而端口号Session 2是在运行时选择的。
控制流程如下:
- Panasonic 调用 Asterisk:它打开
Session 1(TCP/1720) 到 Asterisk 并发送一个 SETUP 消息Session 1,其中包含port 2Panasonic 将要收听的消息。 - Asterisk 向 Panasonic 发送 CALL PROCEEDING 消息
Session 1 - 松下开始收听
port 2 - Panasonic 通过 发送 TCP ACK
Session 1。 - Asterisk
Session 2在port 2.
第 2 步和第 3 步的顺序很重要:Panasonic 不会收听,port 2除非它在 上收到 CALL PROCEEDING 消息step 2。
但是在 OpenH323 代码中,step 2只有step 5几行。
这就是连接sometimes在调试模式下quite never工作并在发布时工作的原因。
在数据包转储中可以清楚地看到。我做了一系列的实验,在52个案例中,有52个,如果step 5在前面step 4,连接失败;如果没有,则连接成功。
除了 ACK 中的 ACK 之外,没有从 Panasonic 发送的其他消息step 4,而且似乎 Asterisk 知道port 2被监听的唯一方法是接收该 ACK。
当然我可以实现定时等待,但我想要一个更清洁的解决方案。
所以问题又来了:在通过 TCP 连接发送消息后step 2,我如何知道是否收到了包含该消息的数据包的 ACK?