2014-07-18 1 views
0

시나리오 :알고리즘 퍼즐 - 클라이언트 파일 전송에 까다로운 서버

  • 클라이언트가 서버에서 파일을 얻을 수 있습니다. 그는 서버에 요청을 보내고 파일 다운로드를 시작할 수 있습니다. 이것은 우리가 원하는 것이 아닙니다. 클라이언트는 많은 양의 데이터를받을 수 없다는 한계가 있습니다 (예 : 파일 크기 x 바이트, 클라이언트는 최대 y 바이트 및 x >>>> y로 수신 할 수 있음). 데이터 전송에는 이러한 제한이 없습니다. 즉, 클라이언트는 원하는만큼 많은 데이터를 서버에 보낼 수 있습니다. 서버에 대한 제한도 없습니다. 파일이 이미 압축되어 있고 파일 크기를 줄일 수 없다고 가정하십시오.

    • 클라이언트가 서버에서 파일의 크기를 요청하고 서버에 파일의 모든 가능한 조합을 보낼 것입니다 :

    나는 하나 개 정말 나쁜 솔루션을 말할 것이다. 잘못된 조합의 경우 서버가 응답하지 않고 올바른 응답을 보낼 것입니다 (서버가 잘못된 조합의 경우 실패 응답으로 응답하는 경우 응답의 전체 크기가> = 파일 크기 자체). 몇 mB 파일을 전송하는 데 수개월이 걸리지 만 파일 대 서버 대 클라이언트 데이터 전송 비율이 가장 좋습니다.

가장 효율적인 방법은 무엇입니까? 우리는 전송 시간을 합리적으로 유지하면서 위 비율을 최대화하려고 노력하고 있습니다.

+1

나는이 질문을 전혀받지 않습니다. 고객이 서버에게 0 번 위치에서 수신 할 금액을 알려주지 않으시겠습니까? "수신 할 금액"은 귀하의 제한 사항에 따라 수신 할 수있는 금액에 해당하는 번호입니까? 그 다음에 다음 위치로 이동하십시오. 한 번에 1K 만받을 수있는 경우 먼저 0 번 위치에서 1024 바이트를 요청한 다음 1024 바이트에서 1024 바이트를 요청하고 2048에서 1024 바이트를 요청합니다. 여기서 문제가 발생합니까? –

+0

그리고 "가능한 모든 파일 조합을 서버에 보냄"이란 무엇을 의미합니까? 1 개의 파일이있는 경우에는 단 하나의 조합 만 있으므로 문장이 작성한 것 이외의 다른 것을 의미합니다. 몇 가지 예를 보여 주시겠습니까? –

+0

그렇다면 클라이언트가 임의의 파일을 생성하여 서버에 업로드하고 서버가 필요한 파일과 일치하면 서버가 응답한다는 것은 무엇을 말하고 있습니까? 파일 구조 나 파일 크기에 대해 지금은 무엇이 있습니까? 왜 부분적으로 파일을 다운로드하지 않습니까? 이것은 이론적 인 질문입니까? 수신 부분이 제한적이지만 송신 부분이 왜 아닌가? – HectorLector

답변

1

클라이언트가 파일 이름을 보내면 서버는 파일 내용의 해시 (md5)를 다시 보냅니다. 클라이언트는 가능한 모든 조합을 시도하여 정확히 동일한 md5를 얻습니다. 그런 다음 추측을 되돌려 보내고 서버가 확인합니다.

+0

파일을 몇 개로 나눠서 할당 된 대역폭 할당량 이하로 끝낼 지 계산 한 경우 계산할 파일 수를 크게 줄이면 기본적으로 제안 사항을 수행하게됩니다 전체 파일의 블록 단위로 –

+0

저장 공간이 클라이언트에서 문제가 아니며 무지개 테이블을 유지할 수도 있으므로 파일 내용에 대해 잘 알고 있다면 아무 것도 계산할 필요가 없으므로 단지 조회 (작은 파일 크기의 경우) – HectorLector

+0

"클라이언트 똑같은 md5를 얻기 위해 가능한 모든 조합을 시도합니다. "- 이것은 단지 우습다. 실제적으로 가능하지 않을뿐만 아니라 (모든 조합은 실제로?), 잘못되었지만 많은 파일이 동일한 md5를 가질 수 있습니다. –

-1

알겠습니다. 올바르게 이해한다면 클라이언트가받은 총 바이트 수는 제한되어 있으므로 서버에서 파일을 가져 오거나 적어도 해당 파일의 내용을 알아 내야합니다.

옵션 :

  • 파일 다운로드 일반적으로 필요합니다 FILESIZE 바이트 - 불가능 FILESIZE>는
  • 클라이언트가 위치 0에서 시작 MAX_RECEIVE_BYTES 경우는, 서버에 바이트 전송 (추측 + 위치) 추측. 서버는 YES = correct, NOTHING = wrong로 응답합니다. 이 방법을 사용하면 적어도 FILESIZE 바이트를 수신해야합니다. 그리고 당신은 최대 FILESIZE * FILESIZE 시도에서 필요합니다.
  • 한 번에 더 많은 바이트 (N)를 추측합니다. 이렇게하면 수신 바이트 수 = FILESIZE/N이됩니다.

그래서 가장/가장 빠른 방법은 파일을 정상적으로 다운로드하는 것입니다 (부분적으로는 제한 사항). 그렇지 않으면 FILESIZE/N < MAX_RECEIVE_BYTES의 N 값을 찾고 싶습니다.

편집 : 내가 생각할 수있는 유일한 다른 점은, 클라이언트가 파일의 0의 수와 일에 대한 서버에 요청이다, 그래서 그는 더 교육 추측을, 따라서의 공간을 줄일 수 있습니다 가능한 조합 = 요청 수 = 더 빠름.

+0

이것은 N = 파일 크기 문제와 함께 설명한 솔루션과 동일한 솔루션입니다. 예 클라이언트는 파일 내용을 알아 내야합니다. – user3852234

1

가장 효율적인 방법은 무엇입니까?당신이 Y 바이트에 이르기까지 데이터를 압축 할 수 있습니다하지 않는 한

, 전혀 가능하지을합니다.

추측에 의한 ACK/NACK 응답 또한 의사 소통의 일부이기 때문에 추측하여 문제를 해결하려는 모든 시도는 효과가 없습니다. x 바이트의 두 데이터를 구별하려면 x 바이트의 대답이 필요합니다.

다른 각도에서 살펴보십시오. 추측 게임에서 추측을 전송하는 모든 작업을 자동화 된 기계로 대체하여 다른 작업을 추측 할 수 있습니다. 젠장, 서버 자체가 열거 할 수 있습니다. 그렇다면 간단히 말해서 : 이봐, # 1051351 시도가 정확한 것입니다. 하지만 다시 전송하려면 x 바이트가 필요합니다. 보시다시피, 다른 방향에서의 의사 소통은 전적으로 무관합니다.

+0

NACK가 없으면 응답이 없으므로 추측이 거짓 일 때 통신이 일어나지 않으므로 수신 바이트 수는 잘못된 추측의 영향을받지 않습니다. – HectorLector

+0

올바른 추측을 위해서만 ACK가 발생할 수 있습니다. 다른 모든 추측에는 서버에서 응답이 표시되지 않습니다. 재 시도도 응답이 없으면 잘못된 것으로 간주됩니다. 방탄 전략이 아니지만 상당히 받아 들일 수있는 – user3852234

+0

@ HectorLector : "반 비트"를 가질 수 없습니다. 수신기가 ACK가 속한 메시지를 어떻게 알 수 있습니까? –