1

私は、2つのデバイスとのP2P通信を必要とするモバイルプロジェクトを行っています。
そして、私は問題に直面しました。(スマートフォンにパブリックIPが設定されていることはまれです)

私はいくつかの答えを見つけました。「UDPホールパンチング」です。

私は「UDPホールパンチング」について100%概念的に理解していて、いくつかのコードを書いていると思います。しかし、それは機能しません。

これが私の状況です。

Device A connected NAT(A) for Wi-Fi.  
Device B connected NAT(B) for Wi-Fi.  
NAT(A) and NAT(B) is different one.  

Relay Server S bind socket and waiting for devices. (S is WebServer but Network Status is good.)  

At the first, A and B send dummy packet to S. Then S save UniqueID(to tell A and B), Public IP, Port.  

And S send information to each device A and B.   

Like this:  
 - IP Address and Port Number about A. -> send to B  
 - IP Address and Port Number about B. -> send to A  

Now A and B send UDP packet to other device based on information(IP Address and Port Number) from S.  
(15 per second. using same socket that used server-device session)  

しかし、それは機能していません。(実際には断続的に動作します。おそらく10回に1回ですか?そしてなぜ成功と失敗のかわかりません。小さな共通の関係はありません。)

NATタイプの問題ではないと思います。私は韓国をテストしましたが、韓国の90%NATは対称錐ではありません。

4

1 に答える 1

1
  1. NATの実装によっては、まったく機能しない場合があります。NATホールパンチングには、特別な形式のNAT実装が必要です。a)NATがUDPトラフィックを認識する場合、送信者のポート番号をランダムなポート番号に変更する(送信者のIPを次に、パブリックIPアドレス)をリダイレクトし、一定期間、そのポートで着信するUDPトラフィックをNATの背後にあるホストにリダイレクトします(ポート番号を元に戻し、レシーバーIPを変更します)。それが機能する場所です。b)別の可能性は、NATが特別なホストからその開いたポートへのトラフィックのみをNATの背後にあるホストにリダイレクトすることです。それはそれが機能しないところです。c)着信トラフィックルールのタイムアウトを「更新」するものは標準化されていません。タイムアウトは、着信トラフィックによって延長される可能性があります。

  2. また、一部の実装では、UDP状態が非常に迅速に期限切れになるようです(場合によっては100ミリ秒以内)。つまり、キープアライブパケットをサーバー「S」に送信し続ける必要があります。または、少なくとも100ミリ秒より短い期間(たとえば、50ミリ秒または20ミリ秒に1回)でUDPパケットを送信する必要があります。

于 2013-02-01T08:47:10.280 に答える