gpt4 book ai didi

linux - 在 Linux 中,我如何知道是否收到了某个 TCP 数据包的 ACK?

转载 作者:可可西里 更新时间:2023-11-01 02:45:55 25 4
gpt4 key购买 nike

长话短说:在 Linux 中,如何确保收到某个 TCP 数据包的 ACK 消息?

全文:

我正在调试 Asterisk/OpenH323 <-> Panasonic IP-GW16 问题。

H323 连接涉及两个 session :H225.0 和 H245。这些只是两个 TCP session ,一些数据通过它们传输。

我们称它们为Session 1(对于 H225.0)和Session 2(对于 H245)。

Session 1 具有众所周知的 TCP 端口号 1720,而 Session 2 的端口是在运行时选择的。

控制流程如下:

  1. Panasonic 调用 Asterisk:它打开 Session 1 (TCP/1720) 到 Asterisk 并通过 Session 1 发送 SETUP 消息,其中包含 port 2 松下将收听。
  2. Asterisk 通过 Session 1 向 Panasonic 发送 CALL PROCEEDING 消息
  3. Panasonic 开始监听端口 2
  4. Panasonic 通过 session 1 发送 TCP ACK。
  5. Asterisk 在端口 2 上打开 TCP Session 2

步骤 2 和 3 的顺序很重要:Panasonic 不会监听端口 2,除非它在步骤 2 上收到 CALL PROCEEDING 消息。

但是在OpenH323代码中,step 2step 5只有几行之遥。

这就是为什么连接有时在 Debug模式下工作而从不在发布时工作。

在数据包转储中可以清楚地看到它。我做了一系列实验,在 52 个案例中有 52 个案例,如果 step 5step 4 之前进行,连接失败;否则,连接成功。

除了 step 4 中的 ACK 之外,没有从 Panasonic 发送的其他消息,似乎 Asterisk 可能知道 port 2 被监听的唯一方法是接收那个ACK。

当然我可以实现定时等待,但我想要一个更简洁的解决方案。

所以问题又来了:在第 2 步 中通过 TCP 连接发送消息后,我如何知道是否收到包含该消息的数据包的 ACK?

最佳答案

在这种特定情况下,我会说您会发现您的 tcp_info 结构将包含一个非零 tcp_info.tcpi_unacked。您可以通过 getsockopt(TCP_INFO) 获得它。

注意:界面显然不稳定。

关于linux - 在 Linux 中,我如何知道是否收到了某个 TCP 数据包的 ACK?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/443134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com