2014-04-19 2 views
9

일부 P2P 네트워킹을 실험하려고합니다. 내가 조사한 가장 큰 장애물 중 하나는 입니다. "클라이언트가 NAT/방화벽 뒤에 있다면 어떻게합니까?", 나중에 홀 펀칭에 대해 알아 냈지만 항상 작동하는 것은 아닙니다.

지금까지 내가 이해할, 나는 그것이 실패 할 수 있습니다 이유를 이해하지 않습니다, 이것은 내가 지금까지 알고있는 것입니다 : 위의 그림을 바탕으로 p2p 구멍 펀칭에 대해 열심히 무엇입니까?


enter image description here
, 이것은 이해하는 방법을 얼마나 성공적으로 연결 설립 될 수있다.

  1. 앨리스 (1) 디렉토리 서버에 대한 연결을 생성하여 네트워크 을 결합한다. 이 경우, Alice의 NAT는 공용 IP에서 로컬 IP로 매핑을 만듭니다.
  2. 디렉토리 서버 연결 및 저장을 수신 앨리스의 디렉토리의 공공 ip:port을 수행하는 같은 (2), 네트워크를 결합하고 발행 그의 ip:port 디렉토리에
  3. 앨리스
  4. 과 통신하고 싶어합니다. 그래서 그녀는 Bob의ip:port 디렉토리를 찾습니다. (3)
  5. 앨리스밥의ip:port 그녀가 서버에서 가지고있는 데이터를 전송합니다. (5)는 자신의 지역에 ip:portip:port이다에서 밥도 매핑을 갖는다
  6. 때문에, NAT는 단지 데이터가 자신의 컴퓨터에 Bob의 공용ip:port에 수신 된 전송한다.
  7. 동일하게 작동합니다. 앨리스
    나는 내가 이해하는 바를 설명 할 때 분명히 희망을 갖고 있습니다. 제 질문은 이것에 대해 무엇이 그렇게 어렵거나 신뢰할 수 없는가라는 것입니다. 분명히 뭔가 빠져 있어야합니다. 그게 뭔지 설명해 주시겠습니까?

답변

4

Alice의 NAT 서버에있는 NAT 매핑이 고정 된 시간 후 또는 일정 기간 사용하지 않은 후에 시간 초과됩니다.

두 번째 잠재적 인 문제는 NAT 서버가 Alice의 NAT 매핑이 Alice가 설정 한 TCP 연결 또는 Alice와 "그녀가 연결된 초기 IP 간의 연결"에 대해서만 "양호"하다는 제한을 설정할 수 있다는 것입니다. 즉, Alice & Bob 간의 직접 통신이 차단 될 수 있습니다.)

등등.

NAT 서버의 동작은 관리하는 조직의 구성/정책 결정 방법에 크게 의존합니다. 이러한 결정 중 많은 부분이 특정 P2P 사용 패턴이 안정적으로 작동하지 않을 수도 있습니다.


그럼 홀 펀치에 대한 내 모든 생각은 잘못이다?

아니요. 단지 항상 작동하지 않는다는 것을 의미합니다.

+0

답변 해 주셔서 감사합니다! 한 가지 문제는'Alice의 NAT 서버에서 NAT 매핑이 타임 아웃 될 것입니다. '디렉토리 서버가 Alice에게 끊임없이 ping을가함으로써 이것을 해결할 수 없습니까? 그렇지 않다면 전형적인 P2P 클라이언트는 어떻게이 문제를 해결할 수 있습니까? – Krimson

+0

1) 작동 할 수도 있습니다. 2) 모르겠다. 필자는 NAT 인식 P2P 시스템의 소스 코드를 읽는 것을 시도한 적이 없습니다. (하지만 당신은 할 수 있습니다.) 3)이 전체 질문은 StackOverflow의 주제와 관련이 없습니다. –

1

방화벽은 일반적으로 상태가 양호합니다. 외부 디렉토리 서버와 통신하는 Bob (2)은 Bob과 디렉토리 서버가 통신 할 수 있도록 NAT 서버에 규칙을 설정합니다. NAT 서버가 Alice로부터 패킷을 볼 때, Bob이 Alice와 통신을 설정하지 못했기 때문에 NAT 서버가 패킷을 거부/삭제합니다.

+0

을 해제 : 당신이 로컬 네트워크에있는 경우, 우분투 사용자에 대한

방화벽 해제 넣어 : 연결 호출 차이는

는 TIP 밀리 초에 있어야합니다 구멍 펀칭에 대한 잘못된 생각? – Krimson

0

아마도 NAT 펀치링에서 가장 큰 문제는 포트 일관성이 부족합니다. 구현이 작동하려면 두 NAT 중 적어도 하나가이를 지원해야합니다.

포트 일관성은 (destination ip, destination port)과 관계없이 동일한 (local ip, local port)이 동일한 (external ip, external port)에 매핑되는 곳입니다. 이것 없이는 디렉토리 서버가 보는 포트가 클라이언트에게 도움이되지 않기 때문에 클라이언트가 서로 이야기하는 데 필요한 동일한 포트가되지는 않습니다.

불행하게도 P2P 통신을 위해, 대부분의 NAT를이 Symmetric NAT의 일부 풍미하고 하지 일관성 포트 매핑을해야합니까 (이 external port == local port가. port preservation보다 약한 요구 사항입니다 참고). 펀칭 2.TCP 구멍을 펀칭 1.UDP 구멍을 펀칭 구멍의 2 개 종류가 모든

0

우선이다

UDP 홀 펀칭 성공률 82 % TCP 홀 펀칭 성공률 내가 가진 64 % 입니다 많은 UDP 구멍 구멍 뚫기 실험을했으며 TCP 구멍 펀칭의 경우 거의 모든 성공했지만 동일하지 않았습니다.

TCP 홀 펀치가 실패한 이유는 라우터 NAT 테이블뿐입니다. 난 내 최선 설명하려고합니다 :

클라이언트 1 -> 연결 (CLIENT2) --Internet-- 연결 (CLIENT1) < - 클라이언트 이제 2

경우 클라이언트 1 ** SYN 패킷 * ***는 client2와 ** client2에 도달합니다 ** SYN 패킷은 공개되지 않았습니다 **, client2의 ROUTER는 2 가지를 할 수 있습니다 : 1. RST 패킷을 client1에 대한 연결 거부로 다시 보냅니다. 2. 패킷을 즉시 삭제하고 client1에 응답을 보냅니다.

이 경우 연결이 설정되지 않습니다.

클라이언트의 연결 호출 간의 시간 차이가 매우 적어야한다는 해결책을 제안 할 수 있습니다.그럼 내 전체입니다 은 sudo는 UFW