簡単に言うと、Linux では、特定の TCP パケットに対して ACK メッセージが確実に受信されるようにするにはどうすればよいですか?
全文:
Asterisk/OpenH323 <-> Panasonic IP-GW16 の問題をデバッグしています。
H323 接続には、H225.0 と H245 の 2 つのセッションが含まれます。これらは、いくつかのデータが送信される 2 つの TCP セッションです。
Session 1
それらを(H225.0の場合)および(H245の場合)と呼びましょうSession 2
。
Session 1
には既知の TCP ポート番号 1720 があり、Session 2
実行時にポートが選択されます。
制御フローは次のようになります。
- Panasonic は、Asterisk を呼び出します。これは、(TCP/1720) で Asterisk を開き、パナソニックがリッスンするを含む
Session 1
を介して SETUP メッセージを送信します。Session 1
port 2
- アスタリスクは Panasonic に CALL PROCEEDING メッセージを送信します。
Session 1
- パナソニックがリスニングを開始
port 2
- Panasonic は で TCP ACK を送信します
Session 1
。 Session 2
アスタリスクは で TCPを開きますport 2
。
ステップ 2 と 3 の順序が重要ですport 2
。Panasonic は、 で CALL PROCEEDING メッセージを受信しない限り、 をリッスンしませんstep 2
。
しかし、OpenH323 コードでstep 2
は、step 5
わずか数行しか離れていません。
そのため、接続sometimes
はデバッグ モードでquite never
機能し、リリースで機能します。
これは、パケット ダンプで明確に確認できます。一連の実験を行ったところ、52 件中 52 件で、step 5
前に進むstep 4
と接続に失敗しました。そうでない場合、接続は成功します。
の ACK を除いて、Panasonic から送信された他のメッセージはありませんstep 4
。Asterisk が聞いていることを知る唯一の方法port 2
は、その ACK を受信することです。
もちろん、時限待機を実装することもできますが、よりクリーンなソリューションが必要です。
もう一度質問します。 で TCP 接続を介してメッセージを送信した後、メッセージをstep 2
含むパケットに対して ACK が受信されたかどうかをどのように知ることができますか?