TCP hole-punching


TCPスロットに1:1接続が必要な場合に,TCP穿孔ライブラリを開発した.研究で知ったことを整理したい.
ご存じのように、ローカルネットワーク内のpeer間の接続は非常に簡単です.しかし、接続するピアが外部ネットワークにあり、すべてのIPがNATによって改ざんされている場合、どのように接続すればよいのでしょうか.

1.相互間のIPブラウズ—STUN(RFC 5780)


もちろん、TCPに接続するには、まず相手のIPを知る必要があります.
もし私たちがNATの後ろの環境だとしたら、私と相手のIPアドレスを知る必要がありますが、どのように知っていますか?
NATの後ろの相手のIPも調べる方法があります.(正確には、相手が使っているNATを見つけた公認IPです.)
STUNサーバを利用して...
지금부터 이야기하는 내용은 A와 B가 동시에 진행한다.
STUNの役割はA,Bの公認IPを知らせることである.
例えば、Aが発見動作でSTUNサーバにパブリックIPを通知する要求を発行すると、STUNサーバは、リターンパケットにMapped−Address(AのパブリックIP)を含む.
これでA,Bは自分が使っている公認IPを知ることができます.
現在、A、Bは、中継サーバなどの他のサービスを使用して、互いの共通IPや専用IPなどを交換し、相手のアドレスに接続しようとすることができるようになった.
- 주의 -
앞으로 사용하는 소켓의 source 주소는 Discovery때 사용한 ip, port와 B로 접속할때 사용하는 ip, port가 같아야한다.
NAT의 IP주소 매핑 패턴 때문인데..
이 NAT 매핑 패턴때문에 서로의 IP를 알더라도 접속이 불가능할 수 있다.
Discoveryでテスト1,2,3を行い、私が使用しているNATのIPマッピングパターンを知る方法があるが、実際にTCPはNATのマッピングパターンを知っていても接続できないパターンを可能にすることはできない.
このため、NATモードを省略することができ、交換された共通IPでの無知識接続を試みると接続できなくなる可能性がある.

2.接続を試みる


接続試行中にも方法があります.
TCP接続を行うと、通常server/client方式で接続されます.
現在、A、Bは同時に接続しようとしているので、誰がサーバで、誰がクライアントなのかは確定していません.中継で交換は可能ですが.
いくつかの簡単な方法がありますが、試してみます.

1)


tcpconnectのメソッドを使用すると、listen状態のソケットに接続する必要はありません.
tcpを同時に開く方法があります.
2つのソケットが一定期間接続しようとすると、接続が確立されます.

2)


Discovery操作の使用中に使用されるソースアドレスリスニングソケット.
いずれにしても、上記の手順でconnectを試してみます.それを開くだけでいいです.
接続試行は、相手の専用IPリストまたは公認IPリストに同時に接続しようとします.接続に成功したコンセントに複数のコンセントが表示されます...
複数のコンセントの中で一番接続が早いコンセントを簡単に選びました.
WebRTCの場合、接続候補者に優先順位がある可能性があるので、優先順位で試行します.