2015-01-08 7 views
-1

Java에서 "p2p와 같은"네트워크를 만들 수있는 솔루션이 생겼습니다. 웹 서버를 연결 용 브리지로 사용합니다. 각 클라이언트는 내 PHP 서버에서 내 IP 데이터베이스를 통해 통신 할 수있는 자바 서버와 자바 클라이언트를 가지고 있습니다. 내 문제는 그것이 IPv6에서만 작동하고 모든 사용자가 IPv6 주소를 가지고있는 것은 아니라는 사실입니다. v4에서 IPv6 주소를 계산하고 NAT 라우터 뒤에서 연결하더라도 다른 클라이언트가 연결할 수 있도록 내 데이터베이스에 저장할 수 있습니까?Java PHP 응용 프로그램에서 IPv4를 IPv6로 계산하거나 가져옵니다.

연구의 오랜 기간이 지난 지금도 ipv6 주소를 처리 할 수 ​​있지만 라우터에 연결할 때마다 내 IPv6 주소가 변경된다는 것을 알아 냈습니다! 첫 번째 4 블록은 항상 동일하지만 내 ipv6의 마지막 4 블록은 절박합니다. 나는 바른 길을 찾거나 불가능하다고 생각하니? 그것의 불가능한 경우 (나는 그렇게 생각하지 않는다) 어떻게 http://ipv6.whatismyv6.com/ 그것을합니까?

답변

1

귀하의 질문에 약간의 맥락이 없습니다. 정확히 무엇을 요구하고 있는지 명확하지 않습니다. 그러나 나는 당신의 질문을 해석하는 방법에 따라 세 가지 제안을합니다.

클라이언트가 연결되는 IPv4와 IPv6 모두를 통해 연결할 수있는 서버가 있습니다. 클라이언트에게 서로의 IPv6 주소를 알리고 싶습니다. 그러나 IPv4를 통해 연결된 클라이언트의 경우 클라이언트에 IPv6 주소가없는 경우가 있습니다. IPv4와 IPv6을 모두 가지고있는 사용자는 IPv6을 사용하여 서버에 연결해야합니다.

이 경우 프로토콜에서 IPv6 주소 만 통신 할 수 있지만 피어에 대해 제공해야하는 유일한 IP 주소는 IPv4 주소이므로 ::ffff:0:0/96 접두사를 사용하면됩니다. 클라이언트의 IPv4 주소가 192.0.2.3 인 경우 다른 클라이언트에게 주소가 ::ffff:192.0.2.3임을 알릴 수 있습니다. 다른 클라이언트가 ::ffff:192.0.2.3에 연결을 시도하면 실제로 해당 IP 주소에 IPv4로 연결됩니다.

물론 이것은 NAT가 도입 한 문제를 해결하지 못합니다.

IPv4를 사용하여 서버에 연결된 클라이언트는 기본 IPv6 주소가 없기 때문에 클라이언트가 자동 터널을 가질 수 있습니다. 예를 들어 일부 시스템에서는 공개 IPv4 주소는 있지만 IPv6 주소가없는 경우 자동으로 6to4 주소를 할당합니다. IPv4 주소가 192.0.2.3 인 경우 6to4 주소를 생성하는 일반적인 방법은 2002:192.0.2.3::192.0.2.3과 거의 비슷합니다 (IPv4 주소를 IPv6 주소 표기법에 삽입하는 것이 마지막 32 비트에만 허용되기 때문에이 방법은 완전히 유효한 표기법이 아닙니다.) 표기법은 2002:c000:203::192.0.2.3).

그러나 IPv4 주소에서 호스트에 대한 IPv6 주소를 유도하는이 방법은 공용 IPv4 주소가있는 호스트에서만 작동합니다. 모든 호스트가 자동으로 6to4를 구성하는 것은 아니므로 대부분의 상황에서 작동하지 않습니다.

IPv6 전용 응용 프로그램이 있고 응용 프로그램에 직접 터널링을 포함시켜 기본 IPv6 주소가없는 클라이언트에 대한 지원을 추가하려는 경우 Teredo가 가장 적합한 프로토콜이라고 생각합니다. Teredo는 UDP를 통해 IPv6을 터널링하여 작동하므로 특별한 권한이 필요없이 응용 프로그램에 포함될 수 있다는 이점이 있습니다. 대부분의 OS는 모든 응용 프로그램이 UDP 포트를 열도록 허용합니다.

응용 프로그램이 일반적으로 클라이언트간에 IPv6을 통해 UDP 패킷을 보내는 경우 해당 UDPv6 패킷을 Teredo 패킷에 포함시켜 Teredo 패킷을 구성하는 것은 매우 간단합니다. 두 개의 고정 크기 헤더에 접두사를 추가하고 체크섬을 계산하면됩니다. 클라이언트가 일반적으로 IPv6 over TCP를 사용하여 통신하는 경우이 접근 방법은 훨씬 어려워집니다.UDP 포트에 바인딩하고이를 통해 자체 Teredo 구현을 사용하면 OS 내에서 TCP 구현을 사용하지 않으므로 응용 프로그램이 자체 TCP 구현을 포함해야합니다. 그럴 필요가없는 디자인을 목표로하는 것이 좋습니다.

응용 프로그램이 UDP 포트에 바인딩된다고 가정하고 보낸 사람과받는 사람 모두 네이티브 IPv6이있는 경우 UDP 패킷을 보내면 다른 방법으로는 어떤 의미입니까?

응용 프로그램이 세 가지 모드 중 하나에서 작동 할 것입니다 :

  • 의 IPv6 만. 네이티브 IPv6 주소 및 공용 IPv4 주소가없는 인스턴스에서 사용됩니다. 전 세계가 IPv6이라고 가정하고 IPv6 주소가없는 클라이언트와 통신하기 위해 타사 Teredo 릴레이에 의존합니다.
  • Teredo 릴레이 모드. 네이티브 IPv6 주소 및 공용 IPv4 주소가있는 인스턴스에서 사용됩니다. 이러한 인스턴스에는 공용 IPv4 주소가 있기 때문에 기본 IPv6이없는 클라이언트가 UDP 포트에 연결할 수 있습니다. 이렇게하면 타사 Teredo 릴레이에 대한 의존성을 피할 수 있습니다.
  • Teredo 클라이언트 모드. 네이티브 IPv6 주소가없는 인스턴스에 사용됩니다.

별도의 NAT 게이트웨이 뒤에있는 두 개의 IPv4 전용 호스트 간의 모든 직접 통신은 NAT 홀 펀칭의 일부 형태에 의존해야합니다. Teredo는 다양한 종류의 NAT 구멍 펀칭을 허용하므로 응용 프로그램에서 NAT 구멍 펀칭이 필요하면 Teredo 프로토콜을 사용할 수도 있습니다. 이는 동시에 약간의 IPv6 전환 메커니즘을 제공하기 때문입니다.

위의 모든 것을 수행하는 라이브러리를 가리키고 싶지만, 불행히도, 나는 모른다.