문제

내가 하고 싶 TCP 구멍 구멍을 뚫기(라)C#.그것은 수행할 수 있습 랑 필요한 경우 서버.내가 발견 http://sharpstunt.codeplex.com/ 그러나 수 없이 작동합니다.이상적으로 필요 어떤 방법을 주는 포트 번호(int)로는 매개변수를 호출한 후에 이 방법을 사용하실 수 있습니다("포트에게 전달")에 NAT.그것은 것은 또한 확인 경우에는 방법을 반환 몇 가지 포트 번호에서 다음을 사용할 수 있 NAT.누군가 이렇 C#?너는 나에게 일에 대한 예 sharpstunt 또는 다른 뭔가?

도움이 되었습니까?

해결책

각 네트워크 시나리오에서 TCP 홀 펀칭은 UDP 홀 펀칭과 유사한 방식으로 작동합니다. 예를 들어, 두 명의 동료 A와 B가 다른 NAT 뒤에있는 경우, 각 동료의 첫 번째 SYN 패킷은 다른 피어에게 전송됩니다. A의 첫 번째 Syn 패킷에서 B에 B의 NAT에 도달하면 B의 첫 번째 Syn 패킷이 B의 NAT에 도달하기 전에 B의 NAT가 A의 SYN 패킷을 원치 않는 것으로 간주하고 떨어 뜨립니다. 그러나 B의 첫 번째 Syn 패킷은 A의 NAT가 B의 공개 주소를 A가 시작한 발신 세션의 목적지로 인식하기 때문에 A의 NAT를 성공적으로 여행 할 수 있습니다.

그래서 네. TCP HolePunch가 가능합니다. 나는 왜 누군가가 다른 생각을하는지 모르겠습니다.

또한이 유형의 Bahaviour를 수동으로 만들 수 없습니까? 필요한 모든 정보를 수집하기 위해 단계가 동일하다면 특정 프로토콜에 의존 할 필요는 없습니다.

일반적으로 TCP 홀 펀칭 (3.2.1)은 다음과 같이 진행됩니다.

클라이언트 : A, B 서버 : S.

• A는 S와의 연결을 사용하여 S와의 연결을 요청하여 B의 개인 및 공개 주소와 함께 A에 대한 답변을 요청하고 동시에 A의 주소를 B로 보냅니다.

• A와 B는 S.에 등록하는 데 사용한 것과 동일한 포트에서 서로의 공개 및 개인 주소에 대한 외향적 인 연결 (Syn Packets 보내기)을 비동기 적으로 연결합니다. 동시에 TCP의 연결 시도를 듣습니다. 로컬 TCP 포트.

• A와 B는 출력 패킷 또는 들어오는 연결 요청 (SYN 패킷)에 대한 Syn-ack 응답을 기다립니다. 연결이 실패하면 피어는 최대 시간 초과 기간까지 재 시도 할 수 있습니다.

• 3 방향 핸드 셰이크 프로세스가 완료되면 동료들은 서로를 인증합니다. 인증이 실패하면 피어는 해당 연결을 닫고 다른 연결이 성공적으로 인증 될 때까지 기다립니다. 첫 번째로 성공적으로 인증 된 연결은 TCP 데이터를 전송하는 데 사용됩니다.

(나는 이것이 대답이 많지 않다는 것을 알고 있지만 의견을위한 여지가 충분하지 않았습니다).

다른 팁

질문입니다 아주 오래된하지만 사람에 대한 솔루션을 찾고,당신은 살펴보 열려 있습니다.NAT 프로젝트 그것은 정말 쉽게 사용하고는 모두 작업 및 UPNP PMP Nat!

그 말을 전달하려는 외부 포트 1700 하는 로컬 포트 1600,당신이해야 할 모든 것:

var discoverer = new NatDiscoverer();
var device = await discoverer.DiscoverDeviceAsync();
await device.CreatePortMapAsync(new Mapping(Protocol.Tcp, 1600, 1700, "The mapping name"));

할 수 있도록 모든 기존의 매핑은,그래서 당신은 것을 확인할 수 있습니다 당신의 포트가 이미 사용됩니다.

var sb = new StringBuilder();
var ip = await device.GetExternalIPAsync();

sb.AppendFormat("\nAdded mapping: {0}:1700 -> 127.0.0.1:1600\n", ip);
sb.AppendFormat("\n+------+-------------------------------+--------------------------------+------------------------------------+-------------------------+");
sb.AppendFormat("\n| PROT | PUBLIC (Reacheable)           | PRIVATE (Your computer)        | Descriptopn                        |                         |");
sb.AppendFormat("\n+------+----------------------+--------+-----------------------+--------+------------------------------------+-------------------------+");
sb.AppendFormat("\n|      | IP Address           | Port   | IP Address            | Port   |                                    | Expires                 |");
sb.AppendFormat("\n+------+----------------------+--------+-----------------------+--------+------------------------------------+-------------------------+");
foreach (var mapping in await device.GetAllMappingsAsync())
{
    sb.AppendFormat("\n|  {5} | {0,-20} | {1,6} | {2,-21} | {3,6} | {4,-35}|{6,25}|",
        ip, mapping.PublicPort, mapping.PrivateIP, mapping.PrivatePort, mapping.Description, mapping.Protocol == Protocol.Tcp ? "TCP" : "UDP", mapping.Expiration.ToLocalTime());
}
sb.AppendFormat("\n+------+----------------------+--------+-----------------------+--------+------------------------------------+-------------------------+");
Console.WriteLine(sb.ToString());

또한 블로그 게시물에 대한 NAT 순회에 사용됩니다. https://blogs.msdn.microsoft.com/ncl/2009/07/27/end-to-end-connectivity-with-nat-traversal/

TCP와 UDP를 혼합 한 것 같습니다. TCP는 방화벽과 라우터에서 쉽게 이해할 수있는 연결 지향 프로토콜이며 하나의 개시 자 (클라이언트)와 하나의 리스너 (서버)가 필요합니다. 클라이언트와 서버가 방화벽이나 NAT 뒤에있는 경우, 방화대가없는 프록시 서버에 연결하지 않고 구멍을 뚫을 수 없습니다. 이것의 문제는 프록시가 모든 트래픽을 전달하는 데 책임이 있다는 것입니다.

귀하의 질문에서, UDP 홀 펀칭에 더 관심이있는 것처럼 들립니다. UDP는 UDP가 무국적이며 연결 지향적이지 않은 지방을 이용합니다. 따라서 대부분의 상태 추적 방화벽은 UDP 데이터 흐름에 대해 "최상의 추측"을 할 수 있으며, 주어진 포트에서 남겨진 트래픽은 동일한 포트에서 답장을 받고 자동으로 다시 배선한다고 가정합니다. 채널 외 수단 (예 : 단순히 데이터가 아닌 주소를 전달하는 TCP 서버와 같은)을 사용하는 경우, 두 피어는 동일한 포트에서 서로 데이터를 서로 전송할 수 있으면 해당 방화벽/NAT 라우터가 구멍을 뚫을 수 있습니다. 트래픽.

그것을하는 방법에 관해서는, 그것은 모두 동료의 IP 주소를 서로에게 얻는 방법에 달려 있습니다. 일단 있으면 합의 된 포트에서 UDP 패킷을 전송하기 시작하고 답장을 기다리십시오.

우리는라는 도서관을 모았습니다 icelink 그것은 완전한 nat traversal을 사용하여 얼음/스턴/턴을 사용하여 P2P 스트리밍을합니다. Stun 기반 홀 펀칭은 대부분의 라우터가 피어들 사이에 직접 연결을 설정하고 "나쁜"라우터의 경우 연결이 턴 기반 릴레이로 돌아갑니다.

http://sipsorcery.codeplex.com 작동하는 서버가 있습니다.

sipsorcery.core-> sipsorcery.net-> stun

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top