2011-09-07 3 views
4

신뢰할 수있는 udp를 만드는 방법에 대한 인터넷 기사가 몇 가지 있습니다. 나는 C#에서 하나를 찾을 수 없었습니다. 그래서 아마도 알고리즘을 구현할 수 있습니다. 인터넷에서 연구에서신뢰할 수있는 udp in C#

나는 UDP는 두 가지 문제를 가지고 있다고 생각합니다 : 그것은 모든 데이터가 목적지의 도달하도록하지 않습니다


  1. .
  2. 데이터는 다른 순서에 목적지의에 도달 할 수 있습니다
  3. 어쩌면 내가 당신이 알고에 관심이 있다면 믿을

내가 원하는 이유를 만들기 위해 실종 세 번째 문제가있다 udp를 신뢰할 수있게 만들고 왜 tcp를 사용하지 않고 this question을 살펴보십시오. 날 믿어, 나는 오랫동안 TCP 펀치 구멍 가공을하려고 애를 썼다.

아마도 내가 이미 이것을 할 수있게 해주는 C#과 함께 사용할 수있는 라이브러리가 이미있을 것입니다. 나는 참고 나는 다음과 같은 알고리즘에 대해 생각하고 도서관을 찾을 수 있었다 때문에 :


"컴퓨터 A와 컴퓨터 B와 컴퓨터 A가 컴퓨터 B에 파일을 보내는 일이입니다 상상";


1) 컴퓨터 A는 읽기 파일을 열고의는 5000 바이트입니다 가정 해 봅시다 : 여기

내가 생각하고있는 단계입니다. 즉, 컴퓨터 A는 컴퓨터 B에 5000 바이트를 보내야하며 바이트가 손실되지 않도록하고 올바른 순서로 컴퓨터를 폐기해야합니다.


2) 컴퓨터 get은 파일의 처음 500 바이트를 가져오고 그 바이트의 해시를 가져옵니다. 그래서 컴퓨터 A는 두 가지, 즉 500 바이트의 해시와 바이트를가집니다. (해시는 올바른 순서로 수신있어 반드시 데이터를 만들기 위해 MD5로 효율적인 알고리즘이 될 것입니다. 즉, MD5 (1,2,3)! = MD5 (2,1,3)이다)


3) 처음 500 바이트의 해시를 이미징하면 kj82lkdi930fi1이됩니다.


4) 컴퓨터 B는 해시 및 바이트를 수신해야합니다.


5) 컴퓨터 A는 컴퓨터 B에 해시를 보내고 500 바이트도 보냅니다. 그것을 보내는 즉시 응답을 기다리고 있습니다.


6) 이제 컴퓨터 B는 해시와 바이트를 수신해야합니다. 컴퓨터 b는 수신 된 바이트에 대해 동일한 알고리즘 md5를 수행합니다. 그 결과가 수신 된 해시와 같으면 {1,1,1,1,1,1}을 사용하여 A에 다시 회신합니다. 그렇지 않으면 {2,2,2,2,2,2,2}로 응답합니다.


6.5) 컴퓨터 B가 올바른 순서로 데이터를 얻었으므로 {1,1,1,1,1}이 메모리 또는 배열에 해시 코드를 저장합니다.


7) 컴퓨터 A는 다음 500 바이트를 보내기 위해 응답을 기다려야합니다. 그것이 {1,1,1}을받는다고합시다. 그것이 1을 수신했기 때문에 처리가 진행되어 그 500 바이트의 새로운 해시 코드로 다음 500 바이트를 보낼 수 있음을 알았다.


8) 컴퓨터 A는 해시 코드로 다음 500 바이트를 보냅니다.


9) 여전히 컴퓨터 A가 가지고 있기 때문에 바이트 해시


8)을 기다리는 A. 컴퓨터 B에 회신하지 않도록의 데이터를받지 않은 컴퓨터 B 척하자 합리적인 시간 동안 1,1,1,1,1 또는 2,2,2,2,2를 수신하지 않으면 A는 동일한 바이트와 해시를 다시 보냅니다.


9) 컴퓨터 B가 해시 및 바이트를 수신하지만 바이트가 다른 순서로 수신되었다고 가정 해 봅시다. 컴퓨터 B가 해당 바이트에서 해시를 계산할 때 해당 해시는 수신 된 해시와 일치하지 않습니다. 결과는 {2,2,2,2,2,2}


10) 컴퓨터 (A)가 수신되면 2,2,2,2,2,2 그럼 보낼 답장 것 같은 바이트와 해시 어떤 이유로 든 2,2,2,2,2를받지 못하면 일정 시간 후에 동일한 바이트와 해시를 보냅니다. 컴퓨터 A가 2,2,2,2,2를 수신하자.


11) 컴퓨터 A는 동일한 바이트와 해시를 세 번째로 보냅니다.


12) 컴퓨터 B는 해시 및 바이트를 올바른 순서로 수신합니다. 결과적으로 1,1,1,1,1,1을 응답하고 이전 해시를 메모리에 저장합니다. (리콜 단계 6.5)


13) A는 그것은 다음 등 시간에 동일한 바이트를 보내드립니다 B.에서 1,1,1,1 응답을받지 못했습니다 컴퓨터 척 할 수 있습니다.


14) 컴퓨터 B는 해시를 확인하고 허용 된 마지막 같으면 다음 파일에 해당 바이트를 작성하지 않고 1,1,1,1 다시 응답한다.


15) 알고리즘은 파일 전송이 계속 될 때까지 계속됩니다.


.

.

.

나는 컴퓨터 B가 전송이 완료되었음을 알리는 것과 같이이 알고리즘에 추가해야 할 다른 것들이 분명히 있음을 의미합니다. 아마 더 많은 오류를 확인하십시오. 컴퓨터 A가 오랜 시간 동안 연결이 끊어지면 어떻게됩니까?그러나 주요 프로토콜은 내가 설명한 것과 같습니다.

그래서이 알고리즘을 구현해야한다고 생각합니까? 내가 늘릴 때마다 더 많은 바이트를 보내야합니까? 나는 500 대신에 1000을 보낸다는 뜻인가요? 몇 가지 기술에 대해 알려주는 인터넷 기사는 많이 있지만, 원하는 언어에 대한 예제를 제공하는 기사는 거의 없습니다. 이 경우 나는 C#에서 이것을 필요로한다.

+1

좀 봐! 두 개의 다른 피어를 tcp 프로토콜과 다른 nat에 연결할 수 있다면이 질문을하는 데 시간을 낭비하지 않을 것입니다. 이 질문을보십시오 : http://stackoverflow.com/questions/7225150/forward-traffic-from-port-x-to-computer-b-with-c-udp-punch-hole-into-firewall. tcp punch holing을 만들기 위해 인터넷에서 예제를 찾을 수 없었습니다. 나는 그것이 어떻게 작동 하는지를 설명하는 몇 가지 기사를 찾았지만 어떤 이유로 기사를 C#으로 번역하면 작동하지 않습니다. –

+0

논쟁 할 수 없습니다. –

답변

2

세 번째 문제는 데이터를받을 때 데이터가 손상 될 수 있다는 것입니다.

TCP RFC을 읽어 보면 TCP가 통신을 어떻게 신뢰할 수 있는지 이해할 수 있습니다. UDP를 전송으로 사용하여 기술을 구현할 수 있습니다. 이 TCP 펀치 천공을 수행하는 하드이기 때문에

또한이 UDP 네트워크 라이브러리 http://code.google.com/p/lidgren-network-gen3/

관련 문제