일부 다운로드 파일이 자체 크기를 모르는 이유는 무엇입니까? [복제]


82

이 질문에는 이미 답변이 있습니다.

때로는 웹 브라우저에서 파일을 다운로드 할 때 다운로드 진행률이 파일의 전체 크기 또는 다운로드의 거리를 "알지 못"합니다. 다운로드 속도를 보여줍니다. "알 수 없음"으로 표시됩니다.

브라우저가 일부 파일의 최종 크기를 모르는 이유는 무엇입니까? 이 정보는 처음에 어디에서 얻습니까?


13
동적으로 생성 된 파일은 크기가 없으며 EOF에 도달 할 때까지 스트림으로 제공됩니다.
Fiasco Labs 5

답변:


114

웹 서버에서 문서를 요청하기 위해 브라우저는 HTTP 프로토콜을 사용합니다. 주소 표시 줄에서 해당 이름을 알 수 있습니다 (지금 숨겨져있을 수 있지만 주소 표시 줄을 클릭하고 URL을 복사하여 텍스트 편집기에 붙여 넣으면 http://처음에 나타납니다). HTTP는 간단한 텍스트 기반 프로토콜입니다. 다음과 같이 작동합니다.

먼저, 브라우저가 웹 사이트의 서버에 연결하여 다운로드하려는 문서의 URL (웹 페이지도 문서 임)과 브라우저 자체에 대한 세부 정보 ( User-Agent 등)를 보냅니다 . 예를 들어 수퍼 유저 사이트에 메인 페이지를로드하기 위해 http://superuser.com/브라우저는 다음과 같은 요청을 보냅니다.

GET / HTTP/1.1
Host: superuser.com
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.0 Safari/537.36
Accept-Encoding: gzip,deflate,sdch
Accept-Language: pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: [removed for security]
DNT: 1
If-Modified-Since: Tue, 09 Jul 2013 07:14:17 GMT

첫 번째 줄은 서버가 반환 할 문서를 지정합니다. 다른 행은 헤더라고합니다. 그들은 다음과 같이 보입니다 :

Header name: Header value

이 행은 서버가 수행 할 작업을 결정하는 데 도움이되는 추가 정보를 보냅니다.

모든 것이 정상이면 서버는 요청 된 문서를 전송하여 응답합니다. 응답은 상태 메시지로 시작하고 그 뒤에 일부 헤더 (문서에 대한 세부 사항 포함)가 있으며 마지막으로 모든 내용이 적절하면 문서의 내용입니다. 내 요청에 대한 슈퍼 유저 서버의 응답은 다음과 같습니다.

HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Content-Type: text/html; charset=utf-8
Expires: Tue, 09 Jul 2013 07:27:20 GMT
Last-Modified: Tue, 09 Jul 2013 07:26:20 GMT
Vary: *
X-Frame-Options: SAMEORIGIN
Date: Tue, 09 Jul 2013 07:26:19 GMT
Content-Length: 139672

<!DOCTYPE html>
<html>
    [...snip...]
</html>

마지막 줄 이후 슈퍼 유저 서버는 연결을 닫습니다.

첫 번째 줄 ( HTTP/1.1 200 OK)에는 응답 코드 가 포함 되며이 경우에는 코드200 OK 입니다. 이는 서버가 요청에 따라 문서를 반환 할 수 있도록 결정했으며 다음에 나오는 내용이 그러한 문서가 될 것이라고 약속합니다. 그렇지 않은 경우 코드가 다른 것일 수 있으며 서버가 문서를 응답으로 반환하지 않는 이유에 대한 정보를 제공합니다. 예를 들어 요청 된 문서를 찾을 수없는 경우 반환해야합니다 404 Not Found문제가되는 콘텐츠에 액세스 할 수없는 경우 콘텐츠가 반환 403 Forbidden됩니다.

이 첫 번째 상태 줄 이후에 응답 헤더가 이어집니다. 그들은 그것과 같은 반환되는 내용에 대한 더 많은 정보를 제공합니다 Content-type.

다음은 빈 줄입니다. 더 이상 응답 헤더가 따르지 않는다는 사실을 알립니다. 해당 줄을 지나는 것은 요청한 문서의 내용입니다. 위의 예 <!DOCTYPE html>에서 수퍼 유저 홈페이지 (HTML 문서)의 첫 번째 줄입니다. 문서 다운로드를 요청하는 경우 대부분의 문서 형식을 사전 처리하지 않고 읽을 수 없기 때문에 다소 교묘 한 문자 일 수 있습니다.

헤더로 돌아갑니다. 우리에게 가장 흥미로운 것은 마지막 것 Content-Length입니다. 빈 줄 이후에 예상되는 데이터 바이트 수를 브라우저에 알려주므로 기본적으로 바이트 단위로 표시되는 문서 크기입니다. 이 헤더는 필수는 아니며 서버에서 생략 될 수 있습니다. 때로는 문서 크기를 예측할 수없는 경우가 있습니다 (예 : 문서가 즉시 생성되는 경우). 게으른 프로그래머가 문서를 포함하지 않는 경우 (드라이버 다운로드 사이트에서 매우 일반적), 때로는 모르는 초보자가 웹 사이트를 만들 때도 있습니다. 이러한 헤더의.

어쨌든 이유가 무엇이든 헤더가 누락 될 수 있습니다. 이 경우 브라우저는 서버가 전송할 데이터 양을 알 수 없으므로 서버가 연결을 닫을 때까지 문서 크기를 unknown 으로 표시합니다 . 이것이 문서 크기를 알 수없는 이유입니다.


4
매우 사소한 참고 사항 : 브라우저는 HTTP 이외의 프로토콜을 지원합니다. 그러나 오늘날 다른 프로토콜은 드물며 세부 사항이 다르더라도 본질적으로 동일한 개념이 다른 프로토콜에도 적용됩니다.
Robert Fisher

5
@RobertFisher FTP는 드문 프로토콜입니까? : p
Thomas

5
@Thomas 요즘 내 경험입니다. 브라우저에서 ftp URL을 본 것을 기억 한 지 몇 년이 지났습니다. 몇 년 전에 나는 직장에서 (거의 완전히 업로드 된) 브라우저가 아닌 ftp를 사용했지만 지금은 scp에 의해 처리됩니다. 오늘 ftp를 사용하는 유일한 방법은 최소한의 웹 호스트에 콘텐츠를 업로드하는 것입니다. 물론 YMMV. ^ _ ^
Robert Fisher

2
이것이 바로이 사이트를 사랑하게 만드는 일종의 답변입니다. 현상금을 어떻게 부여합니까?
그 브라질 사람

1
@ ruda.almeida에 동의하지 않으면 meta.superuser.com에 게시 할 수 있습니다. 토론 될 것이며 누군가가 질문을 다시 열 것입니다.
gronostaj

54

HTTP Content-Length헤더는 경우에 따라 선택 사항이므로 파일과 함께 전송되지 않을 수 있습니다. 소켓이 닫히면 파일의 끝이 표시됩니다.


1
정확하게 말하면 HTTP 1.0은 각 문서 다음에 소켓을 닫아 내용 길이를 정의했습니다. 호환성을 위해 여전히 HTTP 1.1에서 지원됩니다. 그러나 HTTP 1.1에서는 Content-Length헤더 필드가 사용되거나 문서가로 전송되는 경우 여러 문서에 대한 연결을 재사용 할 수 있습니다 Transfer-Encoding: chunked. 후자는 동적으로 컨텐츠를 생성하고 컨텐츠가 생성 될 때이를 조각 단위로 전송하여 문서의 끝을 알릴 수 있습니다.
x4u

3

컨텐츠 (예 : .pdf문서 또는 Excel 시트)를 즉석에서 작성하면 이전에 크기를 알 수 없습니다. 이 경우 서버는 이전에 다운로드 크기를 보낼 수 없으며 Brower는 전체 크기를 표시 할 수 없습니다.


9
@alfo는 동의하지 않을 것입니다 ... 비디오를 스트리밍하거나 고정 크기가 아닌 모든 종류의 데이터를 스트리밍하는 경우 가능한 한 빨리 사용자에게 데이터를 가져 오는 것이 중요하다면, 전송을 시작하는 지점에서 크기를 알 수 없습니다
Foon

4
@Alfo .pdf파일 과 같은 데이터를 즉석에서 만들 수 있습니다 . 데이터가 경쟁적으로 작성되지 않는 한 크기를 모르지만 ata를 이미 브라우저로 보낼 수 있습니다. 이미 Java 로이 작업을 수행하고 Excel 파일을 브라우저로 전송하여 즉시 생성했습니다. 브라우저 쪽에서는 다운로드처럼 보였지만 서버 쪽에서는 스트리밍입니다. 따라서 이것을 상상하지 않아도 파일 을 스트리밍 .pdf 할 수 있습니다. 브라우저에서 알려진 길이가없는 다운로드처럼 보입니다.
Uwe Plonus

8
@Alfo-마지막 패킷이 클라이언트로 전송되기 전에 생성이 완료되어야합니다.
GalacticCowboy

4
@Alfo 나는 비디오 김이 나는 것이 아니라 일반적으로 스트리밍 에 대해 취한 적이 없으며 .pdf파일이나 Excel 시트를 스트리밍 할 수도 있습니다 !
Uwe Plonus

2
@Alfo-유효한 포인트가 있습니다. 동적 파일은 먼저 메모리에서 완전히 생성 한 다음 HTTP를 통해 전송하고 컨텐츠 길이를 쉽게 계산할 수 있습니다. 그러나 서버가 많은 패킷으로 나눌 동적으로 생성 된 많은 파일을 전송하는 경우, 서버는 청크를 계산할 때 (메모리에 모든 큰 파일을 생성 한 후 서버로 전송하는 것과는 반대로) 청크를 보내기 시작하는 것이 좋습니다. 보내). HTTP 1.1 은이를 위해 청크 전송 인코딩 을 특별히 설계했습니다 .
jimbob 박사
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.