私はTCP ホール パンチングテクニックを研究しており、 TCP_hole_punchingという記事からある程度の知識を得ています。しかし、私は以下の部分を理解していません:
Network Drawing
Peer A ←→ Gateway A ← .. Network .. → Gateway B ←→ Peer B
Types of NAT
The availability of the TCP-hole-punching technique depends
on the type ofcomputer port allocation used by the NAT. When
two peers, A and B, instantiate TCP connections by binding
to local ports Pa and Pb, respectively, **they need to know
the remote endpoint NAT port in order to make the connection**.
ここにいくつかの質問があります。誰かが説明を手伝ってくれますか? どんな助けや提案も大歓迎です!!
Q1. NAT1 の背後で実行されているクライアント アプリと、NAT2 の背後で実行されているサーバー アプリがあるとします。彼らはメッセージングとファイル転送通信を行います。パターンは、サーバーがリッスンし、クライアントからの接続を受け入れます。TCP 接続を維持するために、TCP ホール パンチングを使用する必要がありますか?
Q2. TCP ホール パンチング技術は、ピア ツー ピア通信であり、両方の当事者が互いに接続している場合にのみ必要ですか (たとえば、2x CONNECT()、LISTEN()、ACCEPT() など) はありませんか?
Q3. 上記のテキストで、「接続を確立するためにリモート エンドポイントの NAT ポートを知る必要がある」とはどういう意味ですか? リモート エンドポイントの NAT ポートを知る必要があるのはなぜですか?他のマシンのローカル ポートを知る必要があるだけではないのですか?
たとえば、ペアが (ClientA、publicIPA、LocalPortA)、(ClientB、publicIPB、LocalPortB) であるとします。ClientA が TCP 経由で ClientB と通信したい場合は、次のようにします。
clientBAddr.port = LocalPortB;
clientBAddr.ip = inet_addr(publicIPB);
connect(fdA, clientBAddr,...);
NATPortA や NATPortB などの情報を知る必要があるのはなぜですか? clientA と clientB が NATA と NATB を気にしない場合、問題はありますか?