UDPホールパンチング

UDPホールパンチング（英: UDP hole punching）とは、典型的な NAT traversal 技術の1つ。
概要.
UDPホールパンチングによる NAT traversal とは、NAT を使ったプライベートネットワーク内にあるホスト同士がインターネット経由で双方向のUDPコネクションを確立する手法である。NAT には様々なものがあって動作仕様が標準化されていないため、あらゆる NAT で機能するわけではない。
NATの背後にある各ホストは、典型的には STUN や ICE を用いて通信相手との間に存在するNATの公開アドレスを取得する。この過程では、公開のアドレス空間にある第3の既知のサーバに一旦接続することでUDPポートマッピングと相手方のUDP状態を確立し、以後はパケットが違うホストから来ていても NATデバイスが状態を維持するだろうと期待して、直接的な通信に切り換える。通常、UDP状態は数十秒～数分以内に失効してクローズされてしまうので、UDPホールパンチングでは定期的な keep-alive パケットの送出が併用され、これによってNATが持つUDP状態マシンの寿命を延長する。
大企業内でよく使われている対称型NAT（双方向NAT）では、UDPホールパンチングは機能しない。対称型NATでは、既知のSTUNサーバに対するコネクションに関連するNATマッピングは、既知のサーバからの受信にしか使えないよう制限されているので、既知のサーバ側から見えるNATマッピングはエンドポイントにとって役に立たないからである。
より精巧な方法として、双方のホストが互いに複数回ずつ送信を試みる方法がある。制限付きコーンNATでは、他のホストからの最初のパケットはブロックされる。しかしこれによって相手マシンにパケットを送ったという記録がNATデバイスに残り、以後その相手方IPアドレスとポート番号からのパケットはNATを通されるようになる。この技法はP2PソフトウェアやVoIP通話で広く使われており、UDP 上でVPN接続を確立する際にも応用できる。同様の技法をTCPコネクションにも適用する場合があるが、成功率は遥かに低くなる。何故なら、TCPではコネクションのストリームは応用プログラムではなくホスト OS が制御しており、順序番号がランダムに生成されるので、順序番号を検査するような NAT デバイスは、パケットを既存のコネクションに結び付けることが出来ずに破棄してしまうからである。
アルゴリズム.
AとBというホストが、それぞれのプライベートネットワークにあるとする。N1とN2はそれぞれのNATデバイスである。SはグローバルIPアドレスを持つパブリックサーバである。