长话短说:在 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 2
Panasonic 将要收听的消息。 - 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?