2016-08-09 26 views
0

NATの後ろにクライアントソケットがあり、そのプロセスで使用されているローカルポート番号を取得したいとします。PythonソケットNATポートアドレス

私の質問を説明するために、ここに簡単な例があります。次のコードを使用して

(client_socket, address) = self.welcome_socket.accept() 

私は(NATの背後に)クライアントからの接続:

welcome_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
welcome_socket.bind(("", 1500)) 
welcome_socket.listen(5) 

私は、着信接続をリッスン:

のは、私は次のコードを使用してサーバーを作成しましょう:

sock = socket.create_connection(("server_address", 1500)) 

ここで私は少し混乱しています。

私がサーバ側に持っているアドレスには、クライアントが接続しているWiFiネットワークのパブリックアドレス(私が期待している)と、NATの理解に基づいたポート番号が実際のポートとは異なるはずですクライアントが使用する番号で、アドレス変換に使用されます。

ただし、クライアントでgetsockname()関数を使用した場合、サーバーから与えられたものと同じポート番号が返されます。

コードの例に戻ります。サーバー上で

:クライアントで

client_socket.getpeername() 
>>> ('WiFi_address', 4551) 

:だから

sock.getsockname() 
>>> ('local_address', 4551) 

、両方のポート番号は、クライアントがNATの背後にあるにもかかわらず、同じです。これはどうですか? NATの仕組みを誤解していますか?または、クライアントソケットがバインドされている物理アドレスを取得する別のコマンドがありますか?

洞察力があれば幸いです。

答えて

1

ルーターがポートアドレス変換(またはone-to-many NAT)を使用している可能性があります。 wikiリンクはさらに、元の送信元ポートを保存しようとする試みを

としています。この送信元ポート がすでに使用されている場合、PATは適切なポートグループ0-511,512-1023、または 1024-65535の先頭から で始まる使用可能な最初のポート番号を割り当てます。使用可能なポートがもうなくなり、さらに1つの外部IPアドレスよりも がある場合、PATは次のIP アドレスに移動して、元の送信元ポートを再度割り当てます。この プロセスは、利用可能なポートと外部IP アドレスが不足するまで続きます。

これは、サーバー上でポート4551が表示される理由です。

This linkは、NATとPATの違いを明確にするのに役立ちます)